Mercurial > hg > map
comparison testPrograms/test2toneSuppression.m @ 38:c2204b18f4a2 tip
End nov big change
author | Ray Meddis <rmeddis@essex.ac.uk> |
---|---|
date | Mon, 28 Nov 2011 13:34:28 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
37:771a643d5c29 | 38:c2204b18f4a2 |
---|---|
1 % function test2toneSuppression | |
2 % | |
3 % Demonstration of two-tone suppression | |
4 % | |
5 % A probe tone is played at a fixed level and a second tone is introduced | |
6 % half way through the presentation. The response to the combined signal | |
7 % is recorded and analysed. | |
8 % | |
9 % The second tone called the seeep tone is presented at a reange of | |
10 % frequencies and levels. In a linear system we might expect the addition | |
11 % of a second tone to increase the magnitude of the output. | |
12 % In fact, it often results in a reduction in the response. | |
13 % This is called two-tone suppression. | |
14 % | |
15 % The effect of the sweep tone is represented in a countour plot showing | |
16 % both reductions and increases in response. | |
17 % The background colour in this plot is the response to the | |
18 % fixed tone alone | |
19 | |
20 | |
21 % Ruggero et al 1992 (Fig 2) | |
22 fixedToneFrequency=8600; | |
23 fixedToneLevelsdB=[45 :5: 90]; | |
24 % fixedToneLevelsdB=[30]; | |
25 fixedToneDuration=.050; % seconds | |
26 sweeptoneLevelsdB=[ 0 : 10:90]; | |
27 nSweepToneFrequencies=21; | |
28 sampleSweepFrequency=10600; | |
29 | |
30 global ANprobRateOutput DRNLoutput | |
31 dbstop if error | |
32 restorePath=path; | |
33 addpath (['..' filesep 'MAP'], ['..' filesep 'wavFileStore'], ... | |
34 ['..' filesep 'utilities']) | |
35 figure(5), clf | |
36 figure(87), clf | |
37 | |
38 nFixedToneLevels=length(fixedToneLevelsdB); | |
39 | |
40 lowestSweepFrequency=fixedToneFrequency/6; | |
41 highestSweepFrequency=fixedToneFrequency*3; | |
42 sweepToneFrequencies=round(logspace(log10(lowestSweepFrequency), ... | |
43 log10(highestSweepFrequency), nSweepToneFrequencies)); | |
44 | |
45 % key channels for snapshots | |
46 [a BFchannel]=min((sweepToneFrequencies-fixedToneFrequency).^2); | |
47 [a sampleChannel]=min((sweepToneFrequencies-sampleSweepFrequency).^2); | |
48 | |
49 sampleRate= max(44100, 4*highestSweepFrequency); | |
50 dt=1/sampleRate; % seconds | |
51 | |
52 startSilenceDuration=0.010; | |
53 startSilence= zeros(1,startSilenceDuration*sampleRate); | |
54 | |
55 sweepStartPTR=... | |
56 round((startSilenceDuration + fixedToneDuration/2)*sampleRate); | |
57 | |
58 BF_BMresponse=zeros(length(sweepToneFrequencies), ... | |
59 length(fixedToneLevelsdB), length(sweeptoneLevelsdB)); | |
60 | |
61 fixedTonedBCount=0; | |
62 for fixedTonedB=fixedToneLevelsdB | |
63 fixedTonedBCount=fixedTonedBCount+1; | |
64 | |
65 BMpeakResponse= zeros(length(sweeptoneLevelsdB),length(sweepToneFrequencies)); | |
66 ANpeakResponse= zeros(length(sweeptoneLevelsdB),length(sweepToneFrequencies)); | |
67 sweepToneLevelCount=0; | |
68 for sweepToneDB=sweeptoneLevelsdB | |
69 sweepToneLevelCount=sweepToneLevelCount+1; | |
70 suppFreqCount=0; | |
71 for sweepToneFrequency=sweepToneFrequencies | |
72 suppFreqCount=suppFreqCount+1; | |
73 | |
74 % fixedTone tone | |
75 time1=dt: dt: fixedToneDuration; | |
76 amp=10^(fixedTonedB/20)*28e-6; | |
77 inputSignal=amp*sin(2*pi*fixedToneFrequency*time1); | |
78 rampDuration=.005; rampTime=dt:dt:rampDuration; | |
79 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ones(1,length(time1)-length(rampTime))]; | |
80 inputSignal=inputSignal.*ramp; | |
81 inputSignal=inputSignal.*fliplr(ramp); | |
82 nsignalPoints=length(inputSignal); | |
83 sweepStart=round(nsignalPoints/2); | |
84 nSweepPoints=nsignalPoints-sweepStart; | |
85 | |
86 % sweepTone | |
87 time2= dt: dt: dt*nSweepPoints; | |
88 % B: tone on | |
89 amp=10^(sweepToneDB/20)*28e-6; | |
90 inputSignal2=amp*sin(2*pi*sweepToneFrequency*time2); | |
91 rampDuration=.005; rampTime=dt:dt:rampDuration; | |
92 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ones(1,length(time2)-length(rampTime))]; | |
93 inputSignal2=inputSignal2.*ramp; | |
94 inputSignal2=inputSignal2.*fliplr(ramp); | |
95 % add tone and sweepTone components | |
96 inputSignal(sweepStart+1:end)= inputSignal(sweepStart+1:end)+inputSignal2; | |
97 | |
98 inputSignal=... | |
99 [startSilence inputSignal ]; | |
100 | |
101 %% run MAP | |
102 MAPparamsName='Normal'; | |
103 AN_spikesOrProbability='probability'; | |
104 % only use HSR fibers (NB no acoustic reflex) | |
105 paramChanges={'IHCpreSynapseParams.tauCa=80e-6;'}; | |
106 paramChanges={'IHCpreSynapseParams.tauCa=80e-6;',... | |
107 'DRNLParams.g=0;'}; | |
108 MAP1_14(inputSignal, sampleRate, fixedToneFrequency, ... | |
109 MAPparamsName, AN_spikesOrProbability, paramChanges); | |
110 | |
111 % find toneAlone response | |
112 if sweepToneLevelCount==1 && suppFreqCount==1 | |
113 BMfixedToneAloneRate=... | |
114 mean(abs(DRNLoutput(sweepStartPTR:end))); | |
115 ANfixedToneAloneRate=... | |
116 mean(abs(ANprobRateOutput(sweepStartPTR:end))); | |
117 end | |
118 | |
119 BF_BMresponse(suppFreqCount,fixedTonedBCount, ... | |
120 sweepToneLevelCount)=... | |
121 mean(abs(DRNLoutput(sweepStartPTR:end))); | |
122 | |
123 BMpeakResponse(sweepToneLevelCount,suppFreqCount)=... | |
124 mean(abs(DRNLoutput(sweepStartPTR:end)))... | |
125 /BMfixedToneAloneRate; | |
126 ANpeakResponse(sweepToneLevelCount,suppFreqCount)=... | |
127 mean(abs(ANprobRateOutput(sweepStartPTR:end)))... | |
128 /ANfixedToneAloneRate; | |
129 disp(['F2: ', num2str([sweepToneFrequency sweepToneDB ... | |
130 BMpeakResponse(sweepToneLevelCount,suppFreqCount)... | |
131 ANpeakResponse(sweepToneLevelCount,suppFreqCount)])... | |
132 ' dB']) | |
133 | |
134 figure(5) | |
135 time=dt:dt:dt*length(inputSignal); | |
136 subplot(3,1,1), plot(time, inputSignal) | |
137 title(['stimulus: Suppressor=' ... | |
138 num2str([sweepToneFrequency, sweepToneDB]) ' Hz/ dB']) | |
139 | |
140 time=dt:dt:dt*length(DRNLoutput); | |
141 subplot(3,1,2), plot(time, DRNLoutput) | |
142 xlim([0 fixedToneDuration]) | |
143 ylim([0 inf]) | |
144 | |
145 time=dt:dt:dt*length(ANprobRateOutput); | |
146 subplot(3,1,2), plot(time, ANprobRateOutput) | |
147 xlim([0 fixedToneDuration]) | |
148 ylim([0 500]) | |
149 title(['ANresponse: fixedTone' num2str([fixedToneFrequency, fixedTonedB]) ' Hz/ dB']) | |
150 | |
151 subplot(3,2,5) | |
152 contourf(sweepToneFrequencies,sweeptoneLevelsdB,BMpeakResponse, ... | |
153 [.1:.1:.9 1.05] ) | |
154 set(gca,'Xscale','log') | |
155 set(gca,'Xtick', [1000 4000],'xticklabel',{'1000', '4000'}) | |
156 set(gcf, 'name',['fixedToneFrequency= ' num2str(fixedToneFrequency)]) | |
157 title(['BM' num2str(fixedTonedB) ' dB']) | |
158 | |
159 subplot(3,2,6) | |
160 contourf(sweepToneFrequencies,sweeptoneLevelsdB,ANpeakResponse, ... | |
161 [.1:.1:.9 1.05] ) | |
162 set(gca,'Xscale','log') | |
163 set(gca,'Xtick', [1000 4000],'xticklabel',{'1000', '4000'}) | |
164 set(gcf, 'name',['fixedToneFrequency= ' num2str(fixedToneFrequency)]) | |
165 title(['AN:' num2str(fixedTonedB) ' dB']) | |
166 drawnow | |
167 end | |
168 end | |
169 | |
170 %% plot matrix | |
171 | |
172 figure (87) | |
173 subplot(3, nFixedToneLevels, fixedTonedBCount) | |
174 surf(sweepToneFrequencies,sweeptoneLevelsdB,BMpeakResponse) | |
175 set(gca,'Xscale','log') | |
176 zlabel('gain') | |
177 xlim([lowestSweepFrequency highestSweepFrequency]) | |
178 ylim([min(sweeptoneLevelsdB) max(sweeptoneLevelsdB)]) | |
179 title('BM response') | |
180 view([-11 52]) | |
181 | |
182 subplot(3, nFixedToneLevels, nFixedToneLevels+fixedTonedBCount) | |
183 contourf(sweepToneFrequencies,sweeptoneLevelsdB,BMpeakResponse, ... | |
184 [.1:.5:.9 0.99 1.05] ) | |
185 hold on | |
186 plot(fixedToneFrequency, fixedTonedB, 'or', 'markerfacecolor','w') | |
187 set(gca,'Xscale','log') | |
188 set(gca,'Xtick', [1000 5000],'xticklabel',{'1000', '5000'}) | |
189 ylabel('(BM) sweep level') | |
190 xlabel('(BM) sweep freq') | |
191 title(['fixed tone level=' num2str(fixedTonedB) ' dB']) | |
192 % colorbar | |
193 | |
194 subplot(3, nFixedToneLevels, 2*nFixedToneLevels+fixedTonedBCount) | |
195 contourf(sweepToneFrequencies,sweeptoneLevelsdB,ANpeakResponse, ... | |
196 [.1:.5:.9 0.99 1.05] ) | |
197 hold on | |
198 plot(fixedToneFrequency, fixedTonedB, 'or', 'markerfacecolor','w') | |
199 set(gca,'Xscale','log') | |
200 set(gca,'Xtick', [1000 5000],'xticklabel',{'1000', '5000'}) | |
201 ylabel('(AN) sweep level') | |
202 xlabel('(AN) sweep freq') | |
203 title(['fixed tone level=' num2str(fixedTonedB) ' dB']) | |
204 % colorbar | |
205 | |
206 end | |
207 | |
208 % Ruggero fig 2 (probe tone level is x-axis, sweep tone level is y-axis | |
209 figure(1),semilogy(fixedToneLevelsdB,squeeze(BF_BMresponse(sampleChannel,:,:))) | |
210 ylim([-inf inf]) | |
211 legend(num2str(sweeptoneLevelsdB'),'location','southeast') | |
212 xlabel('probe SPL') | |
213 ylabel ('displacement (m)') | |
214 title(['Probe ' num2str(fixedToneFrequency) ' Hz. Sweep ' ... | |
215 num2str(sweepToneFrequencies(sampleChannel)) ' Hz.']) | |
216 path=restorePath; |