Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirroughness.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/mirroughness.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,103 @@ +function varargout = mirroughness(x,varargin) +% r = mirroughness(x) calculates the roughness, or sensory dissonance, +% due to beating phenomenon between close frequency peaks. +% The frequency components are supposed to remain sufficiently +% constant throughout each frame of each audio file. +% r = mirroughness(...,'Contrast',c) specifies the contrast parameter +% used for peak picking (cf. mirpeaks). +% Default value: c = .01 +% [r,s] = mirroughness(x) also displays the spectrum and its peaks, used +% for the computation of roughness. +% Optional arguments: +% Method used: +% mirroughness(...,'Sethares') (default): based on the summation +% of roughness between all pairs of sines (obtained through +% spectral peak-picking). +% mirroughness(...,'Vassilakis'): variant of 'Sethares' model +% with a more complex weighting (Vassilakis, 2001, Eq. 6.23). + + meth.type = 'String'; + meth.choice = {'Sethares','Vassilakis'}; + meth.default = 'Sethares'; + option.meth = meth; + + cthr.key = 'Contrast'; + cthr.type = 'Integer'; + cthr.default = .01; + option.cthr = cthr; + + frame.key = 'Frame'; + frame.type = 'Integer'; + frame.number = 2; + frame.default = [.05 .5]; + option.frame = frame; + +specif.option = option; +specif.defaultframelength = .05; +specif.defaultframehop = .5; + + +varargout = mirfunction(@mirroughness,x,varargin,nargout,specif,@init,@main); + + +function [x type] = init(x,option) +if isamir(x,'miraudio') && not(isframed(x)) + x = mirframenow(x,option); +end +x = mirspectrum(x); +if not(haspeaks(x)) + x = mirpeaks(x,'Contrast',option.cthr); +end +type = 'mirscalar'; + + +function r = main(p,option,postoption) +if iscell(p) + p = p{1}; +end +if strcmpi(option.meth,'Sethares') || strcmpi(option.meth,'Vassilakis') + pf = get(p,'PeakPosUnit'); + pv = get(p,'PeakVal'); + rg = cell(1,length(pf)); + for h = 1:length(pf) + rg{h} = cell(1,length(pf{h})); + for i = 1:length(pf{h}) + pfi = pf{h}{i}; + pvi = pv{h}{i}; + rg{h}{i} = zeros(1,length(pfi)); + for k = 1:size(pfi,3) + for j = 1:size(pfi,2) + pfj = pfi{1,j,k}; + pvj = pvi{1,j,k}; + f1 = repmat(pfj,[1 length(pfj)]); + f2 = repmat(pfj',[length(pfj) 1]); + v1 = repmat(pvj,[1 length(pvj)]); + v2 = repmat(pvj',[length(pvj) 1]); + rj = plomp(f1,f2); + if strcmpi(option.meth,'Sethares') + rj = v1.*v2.*rj; + elseif strcmpi(option.meth,'Vassilakis') + rj = (v1.*v2).^.1.*.5.*(2*v2./(v1+v2)).^3.11.*rj; + end + rg{h}{i}(1,j,k) = sum(sum(rj)); + end + end + end + end +else +end +r = mirscalar(p,'Data',rg,'Title','Roughness'); +r = {r,p}; + + +function pd = plomp(f1, f2) +% returns the dissonance of two pure tones at frequencies f1 & f2 Hz +% according to the Plomp-Levelt curve (see Sethares) + b1 = 3.51; + b2 = 5.75; + xstar = .24; + s1 = .0207; + s2 = 18.96; + s = tril(xstar ./ (s1 * min(f1,f2) + s2 )); + pd = exp(-b1*s.*abs(f2-f1)) - exp(-b2*s.*abs(f2-f1)); +return \ No newline at end of file