This documentation page applies to an outdated major AMT version. We show it for archival purposes only.
Click here for the documentation menu and here to download the latest AMT (1.6.0).
function [outsig, fc, mfc] = dau1997_preproc(insig, fs, varargin);
%dau1997_preproc Auditory model from Dau et. al. 1997
% Usage: [outsig, fc] = dau1997_preproc(insig,fs);
% [outsig, fc] = dau1997_preproc(insig,fs,...);
%
% Input parameters:
% insig : input acoustic signal.
% fs : sampling rate.
%
% DAU1997_PREPROC(insig,fs) computes the internal representation of the
% signal insig sampled with a frequency of fs Hz.
%
% [outsig,fc,mfc]=DAU1997_PREPROC(...) additionally returns the center
% frequencies of the filter bank and the center frequencies of the
% modulation filterbank.
%
% The model consists of the following stages:
%
% 1) a gammatone filter bank with 1-erb spaced filtes.
%
% 2) an envelope extraction stage done by half-wave rectification
% followed by low-pass filtering to 1000 Hz.
%
% 3) an adaptation stage modelling nerve adaptation by a cascade of 5
% loops.
%
% 4) a modulation filterbank
%
% Any of the optinal parameters for AUDITORYFILTERBANK,
% IHCENVELOPE and ADAPTLOOP may be optionally specified for this
% function. They will be passed to the corresponding functions.
%
% See also: auditoryfilterbank, ihcenvelope, adaptloop, modfilterbank
%
% Url: http://amtoolbox.sourceforge.net/amt-0.10.0/doc/modelstages/dau1997_preproc.php
% Copyright (C) 2009-2020 Piotr Majdak and the AMT team.
% This file is part of Auditory Modeling Toolbox (AMT) version 0.10.0
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
% References: dau1997mapI dau1997mapII
% AUTHOR : Torsten Dau, Morten Løve Jepsen, Peter L. Søndergaard.
% Modifications by Alejandro Osses.
% ------ Checking of input parameters ------------
if nargin<2
error('%s: Too few input arguments.',upper(mfilename));
end;
if ~isnumeric(insig)
error('%s: insig must be numeric.',upper(mfilename));
end;
if ~isnumeric(fs) || ~isscalar(fs) || fs<=0
error('%s: fs must be a positive scalar.',upper(mfilename));
end;
definput.import={'auditoryfilterbank','ihcenvelope','adaptloop','modfilterbank'};
definput.importdefaults={'gtf_dau', 'ihc_dau', 'adt_dau','mfb_jepsen2008'};
% The flag 'mfb_dau1997' would be exactly as in day1997mapI
definput.keyvals.subfs=[];
[flags,keyvals] = ltfatarghelper({'flow','fhigh'},definput,varargin);
% ------ do the computation -------------------------
if flags.do_outerear
hp_fir = headphonefilter(fs);% Getting the filter coefficients at fs
N = ceil(length(hp_fir)/2); % group delay for a FIR filter of order length(hp_fir)
M = 1; % assumes insig is monaural
insig = [insig; zeros(N,M)]; % group delay compensation: step 1 of 2.
insig = filter(hp_fir,1,insig); % filtering
insig = insig(N+1:end,1:M); % group delay compensation: step 2 of 2
end
if flags.do_middleear || flags.do_jepsenmiddleear
if flags.do_middleear
filtertype = 'lopezpoveda';
elseif flags.do_jepsenmiddleear
filtertype = 'jepsenmiddleear';
end
me_fir = middleearfilter(fs,filtertype);
N = ceil(length(me_fir)/2); % group delay for a FIR filter of order length(me_fir)
M = 1; % assumes insig is monaural
insig = [insig; zeros(N,M)]; % group delay compensation: step 1 of 2.
insig = filter(me_fir,1,insig); % filtering
insig = insig(N+1:end,1:M); % group delay compensation: step 2 of 2.
me_gain_TF = max( 20*log10(abs(freqz(me_fir,1,8192))) ); % max of the filter response
insig = gaindb(insig,-me_gain_TF); % if me_fir is a non-unit gain filter,
% the gain of the FIR filter is compensated.
end
% Apply the auditory filterbank
[outsig, fc] = auditoryfilterbank(insig,fs,'argimport',flags,keyvals);
% 'haircell' envelope extraction
outsig = ihcenvelope(outsig,fs,'argimport',flags,keyvals);
% non-linear adaptation loops
outsig = adaptloop(outsig,fs,'argimport',flags,keyvals);
%% Downsampling (of the internal representations)
% Apply final resampling to avoid excessive data
if ~isempty(keyvals.subfs)
% In case of downsampling:
outsig = fftresample(outsig,round(length(outsig)/fs*keyvals.subfs));
subfs = keyvals.subfs;
else
% In case of no-resampling:
subfs = fs;
end
% Modulation filterbank
[outsig,mfc] = modfilterbank(outsig,subfs,fc,'argimport',flags,keyvals);