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.

Statistics Download as Zip
| Branch: | Revision:

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;