Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/LyonPassiveEar.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/AuditoryToolbox/LyonPassiveEar.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,80 @@ +function y=LyonPassiveEar(x,sr,df,earQ,stepfactor,differ,agcf,taufactor) +% y=LyonPassiveEar(input, sample_rate, decimation, earQ, stepfactor); +% +% Changes +% Zeroed out the preemphasis channels before doing the AGC. This is needed +% so that cochlear inversion is possible (since we don't have those channels, +% we can't invert their gain.)..... Malcolm 6/26/95 + +% (c) 1998 Interval Research Corporation + +if nargin < 3 + fprintf('Syntax: y=LyonPassiveEar(input, sample_rate, decimation, earQ, stepfactor)\n'); + fprintf(' The input, sample_rate, and decimation parameters are mandatory.\n'); + return; +end + +if df < 1; df = 1; end +if nargin < 4; earQ = 8; end +if nargin < 5; stepfactor = earQ/32; end +if nargin < 6; differ=1; end +if nargin < 7; agcf=1; end +if nargin < 8; taufactor=3; end + +earFilters = DesignLyonFilters(sr, earQ, stepfactor); + +nSamples = length(x); +nOutputSamples = floor(nSamples/df); +[nChannels filterWidth] = size(earFilters); + +sosOutput = zeros(nChannels, df); +sosState = zeros(nChannels, 2); +agcState = zeros(nChannels, 4); +y = zeros(nChannels, nOutputSamples); + +decEps = EpsilonFromTauFS(df/sr*taufactor,sr); +decState = zeros(nChannels, 2); +decFilt = SetGain([0 0 1 -2*(1-decEps) (1-decEps)^2], 1, 0, sr); + +eps1 = EpsilonFromTauFS(.64,sr); +eps2 = EpsilonFromTauFS(.16,sr); +eps3 = EpsilonFromTauFS(.04,sr); +eps4 = EpsilonFromTauFS(.01,sr); + +tar1 = .0032; +tar2 = .0016; +tar3 = .0008; +tar4 = .0004; + +if 0 + fprintf('df=%g, earq=%g, stepfactor=%g, differ=%g\n',df,earQ,stepfactor,differ); + fprintf('agcf=%g, taufactor=%g\n', agcf, taufactor); + [tar1 tar2 tar3 tar4; eps1 eps2 eps3 eps4] +end + +for i=0:nOutputSamples-1 + [sosOutput sosState]= soscascade(x(i*df+1:i*df+df), earFilters, ... + sosState); + output = max(0, sosOutput); %% Half Wave Rectify + output(1) = 0; %% Test Hack to make inversion easier. + output(2) = 0; + if agcf > 0 + [output agcState] = agc(output, [tar1 tar2 tar3 tar4; ... + eps1 eps2 eps3 eps4], ... + agcState); + end + + if differ > 0 + output = [output(1,:);output(1:nChannels-1,:) - ... + output(2:nChannels,:)]; + output = max(0, output); + end + + if df > 1 + [output decState] = sosfilters(output, decFilt, decState); + end + y(:,i+1) = output(:,df); +end + +%y = min(y,2*tar4); +y=y(3:nChannels,:);