annotate aim-mat/modules/bmm/dcgc/AsymCmpFrspV2.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 74dedb26614d
children
rev   line source
tomwalters@0 1 %
tomwalters@0 2 % AsymCmpFrsp Version 2
tomwalters@0 3 % Amplitude Spectrum of Asymmetric Compensation IIR filter for the gammachirp
tomwalters@0 4 % corresponding to MakeAsymCmpFiltersV2.m
tomwalters@0 5 %
tomwalters@0 6 % Toshio Irino
tomwalters@0 7 % Original : 14 Apr. 99 (Version1)
tomwalters@0 8 % Modified : 11 Jun 2004
tomwalters@0 9 % Modified : 7 Jul 2005 % NfrqRsl
tomwalters@0 10 %
tomwalters@0 11 % function [ACFFrsp, freq, AsymFunc]
tomwalters@0 12 % = AsymCmpFrspV2(Frs,fs,b,c,NfrqRsl,NumFilt)
tomwalters@0 13 %
tomwalters@0 14 % INPUT: fs: Sampling frequency
tomwalters@0 15 % Frs: array of the center frequencies
tomwalters@0 16 % b : array or scalar of a bandwidth coefficient
tomwalters@0 17 % c : array or scalar of asymmetric parameters
tomwalters@0 18 % NfrqRsl: freq. resolution
tomwalters@0 19 % NumFilt: Number of 2nd-order filters default 4
tomwalters@0 20 % OUTPUT: ACFFrsp: abs(Frsp of ACF) (NumCh*NfrqRsl matrix)
tomwalters@0 21 % freq: freq. (1*NfrqRsl vector)
tomwalters@0 22 % AsymFunc: Original Asymmetric Function (NumCh*NfrqRsl matrix)
tomwalters@0 23 %
tomwalters@0 24 %
tomwalters@0 25 function [ACFFrsp,freq,AsymFunc] = AsymCmpFrspV2(Frs,fs,b,c,NfrqRsl,NumFilt)
tomwalters@0 26
tomwalters@0 27 if nargin < 1, help AsymCmpFrspV2, end;
tomwalters@0 28 if nargin < 5, NfrqRsl = []; end;
tomwalters@0 29 if length(NfrqRsl) == 0, NfrqRsl = 1024; end;
tomwalters@0 30 if nargin < 6, NumFilt = []; end;
tomwalters@0 31 if length(NumFilt) == 0, NumFilt = 4; end; % default
tomwalters@0 32 if NumFilt ~= 4, error('NumFilter should be 4.'); end;
tomwalters@0 33
tomwalters@0 34 Frs = Frs(:);
tomwalters@0 35 b = b(:);
tomwalters@0 36 c = c(:);
tomwalters@0 37 NumCh = length(Frs);
tomwalters@0 38
tomwalters@0 39 SwCoef = 0; % self consitency
tomwalters@0 40 %SwCoef = 1; % referece to MakeAsymCmpFiltersV2
tomwalters@0 41
tomwalters@0 42 if SwCoef == 0
tomwalters@0 43 % New Coefficients. NumFilter = 4; See [1]
tomwalters@0 44 p0 = 2;
tomwalters@0 45 p1 = 1.7818 .* (1 - 0.0791*b) .* (1 - 0.1655*abs(c));
tomwalters@0 46 p2 = 0.5689 .* (1 - 0.1620*b) .* (1 - 0.0857*abs(c));
tomwalters@0 47 p3 = 0.2523 .* (1 - 0.0244*b) .* (1 + 0.0574*abs(c));
tomwalters@0 48 p4 = 1.0724;
tomwalters@0 49 else
tomwalters@0 50
tomwalters@0 51 ACFcoef = MakeAsymCmpFiltersV2(fs,Frs,b,c);
tomwalters@0 52 end;
tomwalters@0 53
tomwalters@0 54 [dummy ERBw] = Freq2ERB(Frs);
tomwalters@0 55 freq = (0:NfrqRsl-1)/NfrqRsl*fs/2;
tomwalters@0 56 ACFFrsp = ones(NumCh,NfrqRsl);
tomwalters@0 57 freq2 = [ones(NumCh,1)*freq, Frs];
tomwalters@0 58
tomwalters@0 59
tomwalters@0 60 for Nfilt = 1:NumFilt
tomwalters@0 61
tomwalters@0 62 if SwCoef == 0,
tomwalters@0 63 r = exp(-p1.*(p0./p4).^(Nfilt-1) .* 2 .* pi .*b .*ERBw /fs);
tomwalters@0 64 delfr = (p0*p4)^(Nfilt-1).*p2.*c.*b.*ERBw;
tomwalters@0 65 phi = 2*pi*max(Frs + delfr,0)/fs;
tomwalters@0 66 psy = 2*pi*max(Frs - delfr,0)/fs;
tomwalters@0 67 fn = Frs;
tomwalters@0 68 ap = [ones(NumCh,1), -2*r.*cos(phi), r.^2];
tomwalters@0 69 bz = [ones(NumCh,1), -2*r.*cos(psy), r.^2];
tomwalters@0 70 else
tomwalters@0 71 ap = ACFcoef.ap(:,:,Nfilt);
tomwalters@0 72 bz = ACFcoef.bz(:,:,Nfilt);
tomwalters@0 73 end;
tomwalters@0 74
tomwalters@0 75 cs1 = cos(2*pi*freq2/fs);
tomwalters@0 76 cs2 = cos(4*pi*freq2/fs);
tomwalters@0 77
tomwalters@0 78 bzz0 = (bz(:,1).^2 + bz(:,2).^2 + bz(:,3).^2 )*ones(1,NfrqRsl+1);
tomwalters@0 79 bzz1 = (2* bz(:,2).*( bz(:,1) + bz(:,3)))*ones(1,NfrqRsl+1);
tomwalters@0 80 bzz2 = (2* bz(:,1).*bz(:,3))*ones(1,NfrqRsl+1);
tomwalters@0 81 hb = bzz0 + bzz1.* cs1 + bzz2.* cs2;
tomwalters@0 82
tomwalters@0 83 app0 = (ap(:,1).^2 + ap(:,2).^2 + ap(:,3).^2)*ones(1,NfrqRsl+1);
tomwalters@0 84 app1 = (2* ap(:,2).*( ap(:,1) + ap(:,3)))*ones(1,NfrqRsl+1);
tomwalters@0 85 app2 = (2* ap(:,1).*ap(:,3))*ones(1,NfrqRsl+1);
tomwalters@0 86 ha = app0 + app1.*cs1 + app2.*cs2;
tomwalters@0 87
tomwalters@0 88 H = sqrt(hb./ha);
tomwalters@0 89 Hnorm = H(:,NfrqRsl+1)*ones(1,NfrqRsl); % Noimalization by fn value
tomwalters@0 90
tomwalters@0 91 ACFFrsp = ACFFrsp .* H(:,1:NfrqRsl)./ Hnorm;
tomwalters@0 92
tomwalters@0 93 end;
tomwalters@0 94
tomwalters@0 95 %%% original Asymmetric Function without shift centering
tomwalters@0 96 fd = (ones(NumCh,1)*freq - Frs*ones(1,NfrqRsl));
tomwalters@0 97 be = (b.*ERBw)*ones(1,NfrqRsl);
tomwalters@0 98 cc = (c.*ones(NumCh,1))*ones(1,NfrqRsl); % in case when c is scalar
tomwalters@0 99 AsymFunc = exp(cc.*atan2(fd,be));
tomwalters@0 100
tomwalters@0 101 return