rmeddis@38: % function test2toneSuppression rmeddis@38: % rmeddis@38: % Demonstration of two-tone suppression rmeddis@38: % rmeddis@38: % A probe tone is played at a fixed level and a second tone is introduced rmeddis@38: % half way through the presentation. The response to the combined signal rmeddis@38: % is recorded and analysed. rmeddis@38: % rmeddis@38: % The second tone called the seeep tone is presented at a reange of rmeddis@38: % frequencies and levels. In a linear system we might expect the addition rmeddis@38: % of a second tone to increase the magnitude of the output. rmeddis@38: % In fact, it often results in a reduction in the response. rmeddis@38: % This is called two-tone suppression. rmeddis@38: % rmeddis@38: % The effect of the sweep tone is represented in a countour plot showing rmeddis@38: % both reductions and increases in response. rmeddis@38: % The background colour in this plot is the response to the rmeddis@38: % fixed tone alone rmeddis@38: rmeddis@38: rmeddis@38: % Ruggero et al 1992 (Fig 2) rmeddis@38: fixedToneFrequency=8600; rmeddis@38: fixedToneLevelsdB=[45 :5: 90]; rmeddis@38: % fixedToneLevelsdB=[30]; rmeddis@38: fixedToneDuration=.050; % seconds rmeddis@38: sweeptoneLevelsdB=[ 0 : 10:90]; rmeddis@38: nSweepToneFrequencies=21; rmeddis@38: sampleSweepFrequency=10600; rmeddis@38: rmeddis@38: global ANprobRateOutput DRNLoutput rmeddis@38: dbstop if error rmeddis@38: restorePath=path; rmeddis@38: addpath (['..' filesep 'MAP'], ['..' filesep 'wavFileStore'], ... rmeddis@38: ['..' filesep 'utilities']) rmeddis@38: figure(5), clf rmeddis@38: figure(87), clf rmeddis@38: rmeddis@38: nFixedToneLevels=length(fixedToneLevelsdB); rmeddis@38: rmeddis@38: lowestSweepFrequency=fixedToneFrequency/6; rmeddis@38: highestSweepFrequency=fixedToneFrequency*3; rmeddis@38: sweepToneFrequencies=round(logspace(log10(lowestSweepFrequency), ... rmeddis@38: log10(highestSweepFrequency), nSweepToneFrequencies)); rmeddis@38: rmeddis@38: % key channels for snapshots rmeddis@38: [a BFchannel]=min((sweepToneFrequencies-fixedToneFrequency).^2); rmeddis@38: [a sampleChannel]=min((sweepToneFrequencies-sampleSweepFrequency).^2); rmeddis@38: rmeddis@38: sampleRate= max(44100, 4*highestSweepFrequency); rmeddis@38: dt=1/sampleRate; % seconds rmeddis@38: rmeddis@38: startSilenceDuration=0.010; rmeddis@38: startSilence= zeros(1,startSilenceDuration*sampleRate); rmeddis@38: rmeddis@38: sweepStartPTR=... rmeddis@38: round((startSilenceDuration + fixedToneDuration/2)*sampleRate); rmeddis@38: rmeddis@38: BF_BMresponse=zeros(length(sweepToneFrequencies), ... rmeddis@38: length(fixedToneLevelsdB), length(sweeptoneLevelsdB)); rmeddis@38: rmeddis@38: fixedTonedBCount=0; rmeddis@38: for fixedTonedB=fixedToneLevelsdB rmeddis@38: fixedTonedBCount=fixedTonedBCount+1; rmeddis@38: rmeddis@38: BMpeakResponse= zeros(length(sweeptoneLevelsdB),length(sweepToneFrequencies)); rmeddis@38: ANpeakResponse= zeros(length(sweeptoneLevelsdB),length(sweepToneFrequencies)); rmeddis@38: sweepToneLevelCount=0; rmeddis@38: for sweepToneDB=sweeptoneLevelsdB rmeddis@38: sweepToneLevelCount=sweepToneLevelCount+1; rmeddis@38: suppFreqCount=0; rmeddis@38: for sweepToneFrequency=sweepToneFrequencies rmeddis@38: suppFreqCount=suppFreqCount+1; rmeddis@38: rmeddis@38: % fixedTone tone rmeddis@38: time1=dt: dt: fixedToneDuration; rmeddis@38: amp=10^(fixedTonedB/20)*28e-6; rmeddis@38: inputSignal=amp*sin(2*pi*fixedToneFrequency*time1); rmeddis@38: rampDuration=.005; rampTime=dt:dt:rampDuration; rmeddis@38: ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ones(1,length(time1)-length(rampTime))]; rmeddis@38: inputSignal=inputSignal.*ramp; rmeddis@38: inputSignal=inputSignal.*fliplr(ramp); rmeddis@38: nsignalPoints=length(inputSignal); rmeddis@38: sweepStart=round(nsignalPoints/2); rmeddis@38: nSweepPoints=nsignalPoints-sweepStart; rmeddis@38: rmeddis@38: % sweepTone rmeddis@38: time2= dt: dt: dt*nSweepPoints; rmeddis@38: % B: tone on rmeddis@38: amp=10^(sweepToneDB/20)*28e-6; rmeddis@38: inputSignal2=amp*sin(2*pi*sweepToneFrequency*time2); rmeddis@38: rampDuration=.005; rampTime=dt:dt:rampDuration; rmeddis@38: ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ones(1,length(time2)-length(rampTime))]; rmeddis@38: inputSignal2=inputSignal2.*ramp; rmeddis@38: inputSignal2=inputSignal2.*fliplr(ramp); rmeddis@38: % add tone and sweepTone components rmeddis@38: inputSignal(sweepStart+1:end)= inputSignal(sweepStart+1:end)+inputSignal2; rmeddis@38: rmeddis@38: inputSignal=... rmeddis@38: [startSilence inputSignal ]; rmeddis@38: rmeddis@38: %% run MAP rmeddis@38: MAPparamsName='Normal'; rmeddis@38: AN_spikesOrProbability='probability'; rmeddis@38: % only use HSR fibers (NB no acoustic reflex) rmeddis@38: paramChanges={'IHCpreSynapseParams.tauCa=80e-6;'}; rmeddis@38: paramChanges={'IHCpreSynapseParams.tauCa=80e-6;',... rmeddis@38: 'DRNLParams.g=0;'}; rmeddis@38: MAP1_14(inputSignal, sampleRate, fixedToneFrequency, ... rmeddis@38: MAPparamsName, AN_spikesOrProbability, paramChanges); rmeddis@38: rmeddis@38: % find toneAlone response rmeddis@38: if sweepToneLevelCount==1 && suppFreqCount==1 rmeddis@38: BMfixedToneAloneRate=... rmeddis@38: mean(abs(DRNLoutput(sweepStartPTR:end))); rmeddis@38: ANfixedToneAloneRate=... rmeddis@38: mean(abs(ANprobRateOutput(sweepStartPTR:end))); rmeddis@38: end rmeddis@38: rmeddis@38: BF_BMresponse(suppFreqCount,fixedTonedBCount, ... rmeddis@38: sweepToneLevelCount)=... rmeddis@38: mean(abs(DRNLoutput(sweepStartPTR:end))); rmeddis@38: rmeddis@38: BMpeakResponse(sweepToneLevelCount,suppFreqCount)=... rmeddis@38: mean(abs(DRNLoutput(sweepStartPTR:end)))... rmeddis@38: /BMfixedToneAloneRate; rmeddis@38: ANpeakResponse(sweepToneLevelCount,suppFreqCount)=... rmeddis@38: mean(abs(ANprobRateOutput(sweepStartPTR:end)))... rmeddis@38: /ANfixedToneAloneRate; rmeddis@38: disp(['F2: ', num2str([sweepToneFrequency sweepToneDB ... rmeddis@38: BMpeakResponse(sweepToneLevelCount,suppFreqCount)... rmeddis@38: ANpeakResponse(sweepToneLevelCount,suppFreqCount)])... rmeddis@38: ' dB']) rmeddis@38: rmeddis@38: figure(5) rmeddis@38: time=dt:dt:dt*length(inputSignal); rmeddis@38: subplot(3,1,1), plot(time, inputSignal) rmeddis@38: title(['stimulus: Suppressor=' ... rmeddis@38: num2str([sweepToneFrequency, sweepToneDB]) ' Hz/ dB']) rmeddis@38: rmeddis@38: time=dt:dt:dt*length(DRNLoutput); rmeddis@38: subplot(3,1,2), plot(time, DRNLoutput) rmeddis@38: xlim([0 fixedToneDuration]) rmeddis@38: ylim([0 inf]) rmeddis@38: rmeddis@38: time=dt:dt:dt*length(ANprobRateOutput); rmeddis@38: subplot(3,1,2), plot(time, ANprobRateOutput) rmeddis@38: xlim([0 fixedToneDuration]) rmeddis@38: ylim([0 500]) rmeddis@38: title(['ANresponse: fixedTone' num2str([fixedToneFrequency, fixedTonedB]) ' Hz/ dB']) rmeddis@38: rmeddis@38: subplot(3,2,5) rmeddis@38: contourf(sweepToneFrequencies,sweeptoneLevelsdB,BMpeakResponse, ... rmeddis@38: [.1:.1:.9 1.05] ) rmeddis@38: set(gca,'Xscale','log') rmeddis@38: set(gca,'Xtick', [1000 4000],'xticklabel',{'1000', '4000'}) rmeddis@38: set(gcf, 'name',['fixedToneFrequency= ' num2str(fixedToneFrequency)]) rmeddis@38: title(['BM' num2str(fixedTonedB) ' dB']) rmeddis@38: rmeddis@38: subplot(3,2,6) rmeddis@38: contourf(sweepToneFrequencies,sweeptoneLevelsdB,ANpeakResponse, ... rmeddis@38: [.1:.1:.9 1.05] ) rmeddis@38: set(gca,'Xscale','log') rmeddis@38: set(gca,'Xtick', [1000 4000],'xticklabel',{'1000', '4000'}) rmeddis@38: set(gcf, 'name',['fixedToneFrequency= ' num2str(fixedToneFrequency)]) rmeddis@38: title(['AN:' num2str(fixedTonedB) ' dB']) rmeddis@38: drawnow rmeddis@38: end rmeddis@38: end rmeddis@38: rmeddis@38: %% plot matrix rmeddis@38: rmeddis@38: figure (87) rmeddis@38: subplot(3, nFixedToneLevels, fixedTonedBCount) rmeddis@38: surf(sweepToneFrequencies,sweeptoneLevelsdB,BMpeakResponse) rmeddis@38: set(gca,'Xscale','log') rmeddis@38: zlabel('gain') rmeddis@38: xlim([lowestSweepFrequency highestSweepFrequency]) rmeddis@38: ylim([min(sweeptoneLevelsdB) max(sweeptoneLevelsdB)]) rmeddis@38: title('BM response') rmeddis@38: view([-11 52]) rmeddis@38: rmeddis@38: subplot(3, nFixedToneLevels, nFixedToneLevels+fixedTonedBCount) rmeddis@38: contourf(sweepToneFrequencies,sweeptoneLevelsdB,BMpeakResponse, ... rmeddis@38: [.1:.5:.9 0.99 1.05] ) rmeddis@38: hold on rmeddis@38: plot(fixedToneFrequency, fixedTonedB, 'or', 'markerfacecolor','w') rmeddis@38: set(gca,'Xscale','log') rmeddis@38: set(gca,'Xtick', [1000 5000],'xticklabel',{'1000', '5000'}) rmeddis@38: ylabel('(BM) sweep level') rmeddis@38: xlabel('(BM) sweep freq') rmeddis@38: title(['fixed tone level=' num2str(fixedTonedB) ' dB']) rmeddis@38: % colorbar rmeddis@38: rmeddis@38: subplot(3, nFixedToneLevels, 2*nFixedToneLevels+fixedTonedBCount) rmeddis@38: contourf(sweepToneFrequencies,sweeptoneLevelsdB,ANpeakResponse, ... rmeddis@38: [.1:.5:.9 0.99 1.05] ) rmeddis@38: hold on rmeddis@38: plot(fixedToneFrequency, fixedTonedB, 'or', 'markerfacecolor','w') rmeddis@38: set(gca,'Xscale','log') rmeddis@38: set(gca,'Xtick', [1000 5000],'xticklabel',{'1000', '5000'}) rmeddis@38: ylabel('(AN) sweep level') rmeddis@38: xlabel('(AN) sweep freq') rmeddis@38: title(['fixed tone level=' num2str(fixedTonedB) ' dB']) rmeddis@38: % colorbar rmeddis@38: rmeddis@38: end rmeddis@38: rmeddis@38: % Ruggero fig 2 (probe tone level is x-axis, sweep tone level is y-axis rmeddis@38: figure(1),semilogy(fixedToneLevelsdB,squeeze(BF_BMresponse(sampleChannel,:,:))) rmeddis@38: ylim([-inf inf]) rmeddis@38: legend(num2str(sweeptoneLevelsdB'),'location','southeast') rmeddis@38: xlabel('probe SPL') rmeddis@38: ylabel ('displacement (m)') rmeddis@38: title(['Probe ' num2str(fixedToneFrequency) ' Hz. Sweep ' ... rmeddis@38: num2str(sweepToneFrequencies(sampleChannel)) ' Hz.']) rmeddis@38: path=restorePath;