annotate 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
rev   line source
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;