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
|