Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirregularity.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/mirregularity.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,90 @@ +function varargout = mirregularity(orig,varargin) +% i = mirregularity(x) calculates the irregularity of a spectrum, i.e., +% the degree of variation of the successive peaks of the spectrum. +% Specification of the definition of irregularity: +% mirregularity(...,'Jensen') is based on (Jensen, 1999), +% where the irregularity is the sum of the square of the +% difference in amplitude between adjoining partials. +% (Default approach) +% mirregularity(...,'Krimphoff') is based on (Krimphoff et al., 1994), +% where the irregularity is the sum of the amplitude minus the +% mean of the preceding, same and next amplitude. +% If the input x is not already a spectrum with peak extracted, the peak +% picking is performed prior to the calculation of the irregularity. +% In this case the 'Contrast' parameter used in mirpeaks can be +% modified, and is set by default to .1. +% +% [Krimphoff et al. 1994] J. Krimphoff, S. McAdams, S. Winsberg, +% Caracterisation du timbre des sons complexes. II Analyses +% acoustiques et quantification psychophysique. Journal de Physique +% IV, Colloque C5, Vol. 4. 1994. +% [Jensen, 1999] K. Jensen, Timbre Models of Musical Sounds, Ph.D. +% dissertation, University of Copenhagen, Rapport Nr. 99/7. + + + meth.type = 'String'; + meth.default = 'Jensen'; + meth.choice = {'Jensen','Krimphoff'}; + option.meth = meth; + + cthr.key = 'Contrast'; + cthr.type = 'Integer'; + cthr.default = .01; + option.cthr = cthr; + +specif.option = option; + +varargout = mirfunction(@mirregularity,orig,varargin,nargout,specif,@init,@main); + + +function [x type] = init(x,option) +if not(isamir(x,'mirdata')) || isamir(x,'miraudio') + x = mirspectrum(x); +end +if not(haspeaks(x)) + x = mirpeaks(x,'Reso','SemiTone','Contrast',option.cthr); %% FIND BETTER +end +type = 'mirscalar'; + + +function o = main(x,option,postoption) +if iscell(x) + x = x{1}; +end +m = get(x,'PeakVal'); +p = get(x,'PeakPos'); +y = cell(1,length(m)); +for h = 1:length(m) + y{h} = cell(1,length(m{h})); + for k = 1:length(m{h}) + y{h}{k} = zeros(size(m{h}{k})); + for j = 1:size(m{h}{k},3) + for l = 1:size(m{h}{k},2) + state = warning('query','MATLAB:divideByZero'); + warning('off','MATLAB:divideByZero'); + mm = m{h}{k}{1,l,j}; + pp = p{h}{k}{1,l,j}; + [pp oo] = sort(pp); % Sort peaks in ascending order of x abscissae. + mm = mm(oo); + if strcmpi(option.meth,'Jensen') + y{h}{k}(1,l,j) = sum((mm(2:end,:)-mm(1:end-1,:)).^2)... + ./sum(mm.^2); + elseif strcmpi(option.meth,'Krimphoff') + avrg = filter(ones(3,1),1,mm)/3; + y{h}{k}(1,l,j) = log10(sum(abs(mm(2:end-1,:)-avrg(3:end)))); + end + warning(state.state,'MATLAB:divideByZero'); + if isnan(y{h}{k}(1,l,j)) + y{h}{k}(1,l,j) = 0; + end + end + end + end +end +if isa(x,'mirspectrum') + t = 'Spectral irregularity'; +else + t = ['Irregularity of ',get(x,'Title')];; +end +i = mirscalar(x,'Data',y,'Title',t); +o = {i,x}; \ No newline at end of file