diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirrolloff.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/mirrolloff.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,60 @@
+function varargout = mirrolloff(x,varargin)
+%   r = mirrolloff(s) calculates the spectral roll-off in Hz.
+%   Optional arguments:
+%   r = mirrolloff(s,'Threshold',p) specifies the energy threshold in 
+%       percentage. (Default: .85)
+%           p can be either a value between 0 and 1. But if p exceeds 1, it
+%               is understood as a percentage, i.e. between 1 and 100.  
+%           In other words, r is the frequency under which p percents
+%               of the spectral energy is distributed.
+%
+% Typical values for the energy threshold:
+%       85% in G. Tzanetakis, P. Cook. Musical genre classification of audio
+%           signals. IEEE Tr. Speech and Audio Processing, 10(5),293-302, 2002.
+%       95% in T. Pohle, E. Pampalk, G. Widmer. Evaluation of Frequently
+%           Used Audio Features for Classification of Music Into Perceptual
+%           Categories, ?
+
+        p.key = 'Threshold';
+        p.type = 'Integer';
+        p.default = 85;
+        p.position = 2;
+    option.p = p;
+    
+specif.option = option;
+
+varargout = mirfunction(@mirrolloff,x,varargin,nargout,specif,@init,@main);
+
+
+function [s type] = init(x,option)
+s = mirspectrum(x);
+type = 'mirscalar';
+
+
+function r = main(s,option,postoption)
+if iscell(s)
+    s = s{1};
+end
+m = get(s,'Magnitude');
+f = get(s,'Frequency');
+if option.p>1
+    option.p = option.p/100;
+end
+v = mircompute(@algo,m,f,option.p);
+r = mirscalar(s,'Data',v,'Title','Rolloff','Unit','Hz.');
+
+
+function v = algo(m,f,p)
+cs = cumsum(m);          % accumulation of spectrum energy
+thr = cs(end,:,:)*p;   % threshold corresponding to the rolloff point
+v = zeros(1,size(cs,2),size(cs,3));
+for l = 1:size(cs,3)
+    for k = 1:size(cs,2)
+        fthr = find(cs(:,k,l) >= thr(1,k,l)); % find the location of the threshold
+        if isempty(fthr)
+            v(1,k,l) = NaN;
+        else
+            v(1,k,l) = f(fthr(1));
+        end
+    end
+end
\ No newline at end of file