tomwalters@0
|
1 %
|
tomwalters@0
|
2 % Calculation of NAP
|
tomwalters@0
|
3 % (gammatone, halfwave rectification, lowpass, log compression)
|
tomwalters@0
|
4 % 7 Jan 2002
|
tomwalters@0
|
5 % Toshio Irino
|
tomwalters@0
|
6 %
|
tomwalters@0
|
7 function [NAP, NAPparam, BMM] = CalNAPghll(Snd, NAPparam)
|
tomwalters@0
|
8
|
tomwalters@0
|
9 fs = NAPparam.fs;
|
tomwalters@0
|
10 if isfield(NAPparam,'NumCh') == 0, NAPparam.NumCh = []; end;
|
tomwalters@0
|
11 if length(NAPparam.NumCh) == 0,
|
tomwalters@0
|
12 NAPparam.NumCh = 75;
|
tomwalters@0
|
13 end;
|
tomwalters@0
|
14 if isfield(NAPparam,'cf_afb') == 0, NAPparam.cf_afb = []; end;
|
tomwalters@0
|
15 if length(NAPparam.cf_afb) == 0,
|
tomwalters@0
|
16 NAPparam.cf_afb = [100 6000];
|
tomwalters@0
|
17 end;
|
tomwalters@0
|
18 if isfield(NAPparam,'SubBase') == 0, NAPparam.SubBase = []; end;
|
tomwalters@0
|
19 if length(NAPparam.SubBase) == 0,
|
tomwalters@0
|
20 NAPparam.SubBase = 0;
|
tomwalters@0
|
21 end;
|
tomwalters@0
|
22
|
tomwalters@0
|
23 fs = NAPparam.fs;
|
tomwalters@0
|
24 NumCh = NAPparam.NumCh;
|
tomwalters@0
|
25 cf_afb = NAPparam.cf_afb;
|
tomwalters@0
|
26
|
tomwalters@0
|
27 %%%%% Outer-Mid Ear Compensation %%%%
|
tomwalters@0
|
28 CmpnOutMid = OutMidCrctFilt('ELC',fs,0);
|
tomwalters@0
|
29 Snd_om = filter(CmpnOutMid,1,Snd);
|
tomwalters@0
|
30 % Snd_om = Snd; % if unnecessary
|
tomwalters@0
|
31
|
tomwalters@0
|
32
|
tomwalters@0
|
33 %%%%% BMM %%%
|
tomwalters@0
|
34 disp('*** BMM & NAP Calculation ***');
|
tomwalters@0
|
35 disp(NAPparam)
|
tomwalters@0
|
36 tic;
|
tomwalters@0
|
37 %% dERB = (Freq2ERB(max(cf_afb))-Freq2ERB(min(cf_afb)))/(NumCh-1);
|
tomwalters@0
|
38 %% Frs = ERB2Freq( Freq2ERB(min(cf_afb)):dERB:Freq2ERB(max(cf_afb)) );
|
tomwalters@0
|
39 Frs = FcNch2EqERB(min(cf_afb),max(cf_afb),NumCh);
|
tomwalters@0
|
40 NAPparam.Frs = Frs;
|
tomwalters@0
|
41 NAPparam.b = 1.019; % default gammatone
|
tomwalters@0
|
42
|
tomwalters@0
|
43 % IIR implementation
|
tomwalters@0
|
44 % disp('BMM : Start calculation, Wait a minute');
|
tomwalters@0
|
45 % fcoefs = MakeERBFilters98B(fs,Frs,[],b); % new version
|
tomwalters@0
|
46 % BMM = ERBFilterBank(Snd_om, fcoefs);
|
tomwalters@0
|
47 % disp(['BMM : elapsed_time = ' num2str(toc,3) ' (sec)']);
|
tomwalters@0
|
48
|
tomwalters@0
|
49 %%%%% Lowpass filter for representing Phase-lock property %%%
|
tomwalters@0
|
50 flpcut = 1200;
|
tomwalters@0
|
51 [bzLP apLP] = butter(1,flpcut/(fs/2));
|
tomwalters@0
|
52 bzLP2 = [bzLP(1)^2, 2*bzLP(1)*bzLP(2), bzLP(2)^2];
|
tomwalters@0
|
53 apLP2 = [apLP(1)^2, 2*apLP(1)*apLP(2), apLP(2)^2];
|
tomwalters@0
|
54
|
tomwalters@0
|
55 %%%%% NAP %%%%
|
tomwalters@0
|
56 tic;
|
tomwalters@0
|
57 LenSnd = length(Snd_om);
|
tomwalters@0
|
58 bias = 0.1;
|
tomwalters@0
|
59 for nch = 1:NumCh
|
tomwalters@0
|
60 if rem(nch, 20) == 0 | nch == 1 | nch == NumCh
|
tomwalters@0
|
61 disp(['BMM-NAP #' int2str(nch) '/#' int2str(NumCh) ': ' ...
|
tomwalters@0
|
62 'elapsed_time = ' num2str(toc,3) ' (sec)']);
|
tomwalters@0
|
63 end;
|
tomwalters@0
|
64
|
tomwalters@0
|
65 gt = GammaChirp(Frs(nch),fs,4,NAPparam.b,0,0,[],'peak');
|
tomwalters@0
|
66 % BMM(nch,:) = filter(gt,1,Snd_om);
|
tomwalters@0
|
67 BMM(nch,:) = fftfilt(gt,Snd_om);
|
tomwalters@0
|
68 NAPraw = log10(max(BMM(nch,:),bias)) - log10(bias);
|
tomwalters@0
|
69 NAP(nch,1:LenSnd) = filter(bzLP2,apLP2,NAPraw); % LP filtered
|
tomwalters@0
|
70
|
tomwalters@0
|
71 % [Frs(nch) max(max(NAPraw)) max(max(NAP(nch,:)))]
|
tomwalters@0
|
72 end;
|
tomwalters@0
|
73
|
tomwalters@0
|
74
|
tomwalters@0
|
75 if NAPparam.SubBase ~= 0,
|
tomwalters@0
|
76 disp([ '=== Baseline subtraction : Max NAP = ' num2str( max(max(NAP))) ...
|
tomwalters@0
|
77 ', NAPparam.SubBase = ' num2str(NAPparam.SubBase) ' ===']);
|
tomwalters@0
|
78 end;
|
tomwalters@0
|
79
|
tomwalters@0
|
80 NAP0 = NAP;
|
tomwalters@0
|
81 NAP = max((NAP0 - NAPparam.SubBase),0);
|
tomwalters@0
|
82
|
tomwalters@0
|
83 NAPparam.height = max(max(NAP));
|
tomwalters@0
|
84 NAPparam.tms = (0:LenSnd-1)/fs*1000;
|
tomwalters@0
|
85
|
tomwalters@0
|
86 return
|
tomwalters@0
|
87
|
tomwalters@0
|
88 %%%%%%%%%%%%
|
tomwalters@0
|
89
|
tomwalters@0
|
90 if 1
|
tomwalters@0
|
91 ProfNAP0 = mean(NAP0')';
|
tomwalters@0
|
92 ProfNAP = mean(NAP')';
|
tomwalters@0
|
93 plot(NAPparam.Frs,ProfNAP0,NAPparam.Frs,ProfNAP0)
|
tomwalters@0
|
94 subplot(2,1,1)
|
tomwalters@0
|
95 image(flipud(NAP0(:,1:100:LenSnd))*15)
|
tomwalters@0
|
96 subplot(2,1,2)
|
tomwalters@0
|
97 image(flipud(NAP(:,1:100:LenSnd))*20)
|
tomwalters@0
|
98 end;
|
tomwalters@0
|
99
|
tomwalters@0
|
100
|
tomwalters@0
|
101 return
|
tomwalters@0
|
102
|
tomwalters@0
|
103 %%%%%%%%%%%%%%%%%%%%
|
tomwalters@0
|
104
|
tomwalters@0
|
105 % [bzGT, apGT, Frs, ERBw] = MakeERBFiltersB(fs,NumCh,Frs,b); % NG for low freq
|
tomwalters@0
|
106
|
tomwalters@0
|
107 %%Simple pre-emphasis
|
tomwalters@0
|
108 %%CoefPreEmph = [1, -0.97];
|
tomwalters@0
|
109 %%Snd = filter(CoefPreEmph,1,Snd);
|
tomwalters@0
|
110
|
tomwalters@0
|
111 % [frsp, freq] = freqz(bzLP,apLP,1024,fs);
|
tomwalters@0
|
112 % [frsp2, freq] = freqz(bzLP2,apLP2,1024,fs);
|
tomwalters@0
|
113 % plot(freq,20*log10(abs(frsp)),freq,20*log10(abs(frsp2)))
|
tomwalters@0
|
114 % axis([0 2000 -10 2]);
|
tomwalters@0
|
115 % grid;
|