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