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);