To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
The primary repository for this project is hosted at git://github.com/rmeddis/MAP.git .
This repository is a read-only copy which is updated automatically every hour.
root / testPrograms / test2toneSuppression.m @ 38:c2204b18f4a2
History | View | Annotate | Download (8.6 KB)
| 1 | 38:c2204b18f4a2 | rmeddis | % 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; |