Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirfeatures.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirfeatures.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,153 @@ +function r = mirfeatures(x,varargin) +% f = mirfeatures(x) computes a large set of features from one or several +% audio files. x can be either the name of an audio file, or the +% 'Folder' keyword. +% mirfeatures(...,'Stat') returns the statistics of the features instead +% of the complete features themselves. +% mirfeatures(...,'Segment',t) segments the audio sequence at the +% temporal positions indicated in the array t (in s.), and analyzes +% each segment separately. + +%(not available yet) +% mirfeatures(...,'Filterbank',nc) computes the analysis on each channel +% of a filterbank decomposition. +% Default value: nc = 5 +% mirfeatures(...,'Frame',...) +% mirfeatures(...,'Normal') +% mirfeatures(...,'Sampling',s) +% miraudio options (Extract, ...) + +[stat,nchan,segm,feat] = scanargin(varargin); + +if isa(x,'miraudio') || isa(x,'mirdesign') + a = miraudio(x,'Normal'); % normalize with respect to RMS energy + % in order to consider timbre independently of + % energy +else + a = miraudio('Design','Normal'); +end + +if not(isempty(segm)) + a = mirsegment(a,segm); +end + + + +% DYNAMICS +% -------- + +r.dynamics.rms = mirrms(a,'Frame'); +% Perceived dynamics: spectral slope? + +% RHYTHM +% ------ + +r.fluctuation = mirstruct; +r.fluctuation.tmp.f = mirfluctuation(a,'Summary'); +r.fluctuation.peak = mirpeaks(r.fluctuation.tmp.f,'Total',1);%only one? +r.fluctuation.centroid = mircentroid(r.fluctuation.tmp.f); + +r.rhythm = mirstruct; +r.rhythm.tmp.onsets = mironsets(a); + +%r.rhythm.eventdensity = ... + +r.rhythm.tempo = mirtempo(r.rhythm.tmp.onsets,'Frame'); +%r.rhythm.pulseclarity = mirpulseclarity(r.tmp.onsets,'Frame'); + % Should use the second output of mirtempo. + +attacks = mironsets(r.rhythm.tmp.onsets,'Attacks'); +r.rhythm.attack.time = mirattacktime(attacks); +r.rhythm.attack.slope = mirattackslope(attacks); + +% TIMBRE +% ------ + +f = mirframe(a,.05,.5); +r.spectral = mirstruct; +r.spectral.tmp.s = mirspectrum(f); +%pitch = mirpitch(a,'Frame',.05,.5); + +r.spectral.centroid = mircentroid(r.spectral.tmp.s); +r.spectral.brightness = mirbrightness(r.spectral.tmp.s); +r.spectral.spread = mirspread(r.spectral.tmp.s); +r.spectral.skewness = mirskewness(r.spectral.tmp.s); +r.spectral.kurtosis = mirkurtosis(r.spectral.tmp.s); +r.spectral.rolloff95 = mirrolloff(r.spectral.tmp.s,95); +r.spectral.rolloff85 = mirrolloff(r.spectral.tmp.s,85); +r.spectral.spectentropy = mirentropy(r.spectral.tmp.s); +r.spectral.flatness = mirflatness(r.spectral.tmp.s); + +r.spectral.roughness = mirroughness(r.spectral.tmp.s); +r.spectral.irregularity = mirregularity(r.spectral.tmp.s); +%r.spectral.inharmonicity = mirinharmonicity(r.spectral.tmp.s,'f0',pitch); + +r.spectral.mfcc = mirmfcc(r.spectral.tmp.s); +r.spectral.dmfcc = mirmfcc(r.spectral.mfcc,'Delta'); +r.spectral.ddmfcc = mirmfcc(r.spectral.dmfcc,'Delta'); + +r.timbre.zerocross = mirzerocross(f); +r.timbre.lowenergy = mirlowenergy(f); +r.timbre.spectralflux = mirflux(f); + +% PITCH +% ----- + +r.tonal = mirstruct; +r.tonal.tmp.chromagram = mirchromagram(a,'Frame','Wrap',0,'Pitch',0); +r.tonal.chromagram.peak=mirpeaks(r.tonal.tmp.chromagram,'Total',1); +r.tonal.chromagram.centroid=mircentroid(r.tonal.tmp.chromagram); + +% TONALITY/HARMONY +% ---------------- + +keystrengths = mirkeystrength(r.tonal.tmp.chromagram); +[k r.tonal.keyclarity] = mirkey(keystrengths,'Total',1); +%r.tonal.keyclarity = k{2}; +r.tonal.mode = mirmode(keystrengths); +r.tonal.hcdf = mirhcdf(r.tonal.tmp.chromagram); + +if stat + r = mirstat(r); + % SHOULD COMPUTE STAT OF CURVES FROM FRAMED_DECOMPOSED HIGH FEATURES +end + +if not(isa(x,'miraudio')) && not(isa(x,'mirdesign')) + r = mireval(r,x); +end + + +function [stat,nchan,segm,feat] = scanargin(v) +stat = 0; +nchan = 1; +segm = []; +feat = {}; +i = 1; +while i <= length(v) + arg = v{i}; + if ischar(arg) && strcmpi(arg,'Filterbank') + i = i+1; + if i <= length(v) + nchan = v{i}; + else + nchan = 10; + end + elseif ischar(arg) && strcmpi(arg,'Stat') + i = i+1; + if i <= length(v) + stat = v{i}; + else + stat = 1; + end + elseif ischar(arg) && strcmpi(arg,'Segment') + i = i+1; + if i <= length(v) + segm = v{i}; + else + segm = 1; + end + else + feat{end+1} = arg; + end + i = i+1; +end \ No newline at end of file