Mercurial > hg > aimmat
diff aim-mat/modules/bmm/dcgc/InvFxGCFBv205.m @ 0:74dedb26614d
Initial checkin of AIM-MAT version 1.5 (6.4.2011).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 12:32:31 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aim-mat/modules/bmm/dcgc/InvFxGCFBv205.m Fri May 20 12:32:31 2011 +0100 @@ -0,0 +1,122 @@ +% Inverse Filterbank with Fixed Passive/Compressive Gammachirp +% No dynamic resynthesis +% Version 2.05 +% Toshio IRINO +% Created: 9 Nov 2004 +% Modified: 11 Nov 2004 Renamed and based on InvPGCFBv2.m +% Modified: 18 July 2005 v205 +% +% function [SynSnd, SynGCout] = InvFxGCFB2(GCout,GCparam,GCresp,SwMethod) +% INPUT: GCout: pGCout or cGCout +% GCparam: Gammachirp parameters +% Fp: peak frequency vector for synthesis filter +% SwMethod: 1: pGCout - pGCsyn +% 2: cGCout - pGCsyn +% 3: cGCout - Fixed(Ref) cGCsyn +% +% OUTPUT: SynSnd: Synthetic Sound +% +% +% References: +% Irino, T. and Unoki, M.: IEEE ICASSP'98 paper, AE4.4 (12-15, May, 1998) +% Irino, T. and Patterson, R.D. : JASA, Vol.101, pp.412-419, 1997. +% Irino, T. and Patterson, R.D. : JASA, Vol.109, pp.2008-2022, 2001. +% Patterson, R.D., Unoki, M. and Irino, T. : JASA, Vol.114,pp.1529-1542,2003. +% +% +function [SynSnd,SynGCout] = InvFxGCFB2(GCout,GCparam,GCresp,SwMethod) + +%%%% Handling Input Parameters %%%%% +if nargin < 4, help InvFxGCFBv2; end; + + +GCparam = GCFBv205_SetParam(GCparam); + +%%%%%%%%%%%%% +fs = GCparam.fs; +NumCh0 = GCparam.NumCh; +if length(GCparam.b1) == 1 & length(GCparam.c1) == 1 + b1 = GCparam.b1(1); % Freq. independent + c1 = GCparam.c1(1); % Freq. independent +else + error('Not prepared yet: Freq. dependent b1, c1'); +end; + +[NumCh, LenSnd] = size(GCout); +if NumCh ~= NumCh0, error('Mismatch in NumCh'); end; + +if SwMethod == 1 + disp('*** Inverse Passive Gammmachirp Calculation ***'); + Fr1 = GCresp.Fr1; +elseif SwMethod == 2; + disp('*** Inverse Passive Gammmachirp Calculation ***'); + Fr1 = Fpeak2Fr(GCparam.n,b1,c1,GCresp.cGCRef.Fp2); % pGC peak == Fp2 +elseif SwMethod == 3 + disp('*** Inverse Fixed Compressive Gammmachirp Calculation ***'); + Fr1 = GCresp.Fr1; +end; + + +LenInv = 50/1000*fs; % 50 ms zero filling for processing +zz = zeros(NumCh,LenInv); +TrGCout = fliplr(GCout); %%% time-reversal %% +TrGCout = [zz TrGCout zz]; +[NumCh,LenTr] = size(TrGCout); +SynGCout = zeros(NumCh,LenTr); +TrGCout1 = zeros(NumCh,LenTr); + +%%%%% Time-Reversal ACfilter cGC %%% + +Tstart = clock; +nDisp = 20*fs/1000; % display every 20 ms +if SwMethod == 3, % The same function is applied like wavelet trans. + [ACFcoef] = MakeAsymCmpFiltersV2(fs,... + GCresp.cGCRef.Fr2,GCresp.cGCRef.b2,GCresp.cGCRef.c2); + [dummy,ACFstatus] = ACFilterBank(ACFcoef,[]); % initiallization + for nsmpl = 1:LenTr + [SigOut,ACFstatus] = ACFilterBank(ACFcoef,ACFstatus,TrGCout(:,nsmpl)); + TrGCout1(:,nsmpl) = GCresp.cGCRef.NormFctFp2.*SigOut; + if nsmpl==1 | rem(nsmpl,nDisp)==0, + disp(['Time-Reversal ACF-cGC : Time ' num2str(nsmpl/fs*1000,3) ... + ' (ms) / ' num2str(LenSnd/fs*1000) ' (ms). elapsed time = ' ... + num2str(fix(etime(clock,Tstart)*10)/10) ' (sec)']); + end; + end; + TrGCout = TrGCout1; +end; + +%%%%% Time-Reversal Passive Gammachirp %%% + +for nch=1:NumCh + pgc = GammaChirp(Fr1(nch),fs,GCparam.n,b1,c1,0,'','peak'); + SynGCout(nch,1:LenTr) = fftfilt(pgc,TrGCout(nch,:)); + if nch == 1 | rem(nch,20)==0 + disp(['Time-Reversal Passive-Gammachirp ch #' num2str(nch) ... + ' / #' num2str(NumCh) '. elapsed time = ' ... + num2str(fix(etime(clock,Tstart)*10)/10) ' (sec)']); + end; +end; + +SynGCout = fliplr(SynGCout); +SynSnd = mean(SynGCout)*sqrt(NumCh); % Approximately all right + % Maybe depend on filter shape + % 11 Nov 2004 + +%%%%% Inverse of Outer-Mid Ear Compensation %%%% +if length(GCparam.OutMidCrct) > 2 + disp(['*** Inverse Outer/Middle Ear correction: ' GCparam.OutMidCrct ' ***']); + InvOutMid = OutMidCrctFilt(GCparam.OutMidCrct,fs,0,1); % Inverse + %% OutMidCrct--> 1kHz: -4 dB, 2kHz: -1 dB, 4kHz: +4 dB + %% [dummy NpIOM] = max(abs(InvOutMid)); + SynSnd = filter(InvOutMid,1,SynSnd); + Nout = LenInv+length(InvOutMid)+(1:LenSnd); +else + disp('*** No Outer/Middle Ear correction ***'); + Nout = LenInv+(1:LenSnd); +end; + +SynSnd = SynSnd(Nout); +SynGCout = SynGCout(:,Nout); + +disp(' '); +return