rmeddis@38
|
1 function test_Dolan_and_Nuttall
|
rmeddis@38
|
2 % test_MAP1_14 is a general purpose test routine that can be adjusted to
|
rmeddis@38
|
3 % test a number of different applications of MAP1_14
|
rmeddis@38
|
4 %
|
rmeddis@38
|
5 % A range of options are supplied in the early part of the program
|
rmeddis@38
|
6 %
|
rmeddis@38
|
7 % One use of the function is to create demonstrations; filenames <demoxx>
|
rmeddis@38
|
8 % to illustrate particular features
|
rmeddis@38
|
9 %
|
rmeddis@38
|
10 % #1
|
rmeddis@38
|
11 % Identify the file (in 'MAPparamsName') containing the model parameters
|
rmeddis@38
|
12 %
|
rmeddis@38
|
13 % #2
|
rmeddis@38
|
14 % Identify the kind of model required (in 'AN_spikesOrProbability').
|
rmeddis@38
|
15 % A full brainstem model (spikes) can be computed or a shorter model
|
rmeddis@38
|
16 % (probability) that computes only so far as the auditory nerve
|
rmeddis@38
|
17 %
|
rmeddis@38
|
18 % #3
|
rmeddis@38
|
19 % Choose between a tone signal or file input (in 'signalType')
|
rmeddis@38
|
20 %
|
rmeddis@38
|
21 % #4
|
rmeddis@38
|
22 % Set the signal rms level (in leveldBSPL)
|
rmeddis@38
|
23 %
|
rmeddis@38
|
24 % #5
|
rmeddis@38
|
25 % Identify the channels in terms of their best frequencies in the vector
|
rmeddis@38
|
26 % BFlist.
|
rmeddis@38
|
27 %
|
rmeddis@38
|
28 % Last minute changes to the parameters fetched earlier can be made using
|
rmeddis@38
|
29 % the cell array of strings 'paramChanges'.
|
rmeddis@38
|
30 % Each string must have the same format as the corresponding line in the
|
rmeddis@38
|
31 % file identified in 'MAPparamsName'
|
rmeddis@38
|
32 %
|
rmeddis@38
|
33 % When the demonstration is satisfactory, freeze it by renaming it <demoxx>
|
rmeddis@38
|
34
|
rmeddis@38
|
35 global dt dtSpikes savedBFlist saveAN_spikesOrProbability saveMAPparamsName...
|
rmeddis@38
|
36 savedInputSignal OMEextEarPressure TMoutput OMEoutput ARattenuation ...
|
rmeddis@38
|
37 DRNLoutput IHC_cilia_output IHCrestingCiliaCond IHCrestingV...
|
rmeddis@38
|
38 IHCoutput ANprobRateOutput ANoutput savePavailable ANtauCas ...
|
rmeddis@38
|
39 CNtauGk CNoutput ICoutput ICmembraneOutput ICfiberTypeRates ...
|
rmeddis@38
|
40 MOCattenuation
|
rmeddis@38
|
41 global OMEParams DRNLParams IHC_cilia_RPParams IHCpreSynapseParams
|
rmeddis@38
|
42 global AN_IHCsynapseParams MacGregorParams MacGregorMultiParams
|
rmeddis@38
|
43 global ICrate
|
rmeddis@38
|
44
|
rmeddis@38
|
45
|
rmeddis@38
|
46 dbstop if error
|
rmeddis@38
|
47 restorePath=path;
|
rmeddis@38
|
48 addpath (['..' filesep 'MAP'], ['..' filesep 'wavFileStore'], ...
|
rmeddis@38
|
49 ['..' filesep 'utilities'])
|
rmeddis@38
|
50
|
rmeddis@38
|
51 %% #1 parameter file name
|
rmeddis@38
|
52 MAPparamsName='Normal';
|
rmeddis@38
|
53
|
rmeddis@38
|
54
|
rmeddis@38
|
55 %% #2 probability (fast) or spikes (slow) representation
|
rmeddis@38
|
56 AN_spikesOrProbability='spikes';
|
rmeddis@38
|
57 % or
|
rmeddis@38
|
58 % AN_spikesOrProbability='probability';
|
rmeddis@38
|
59
|
rmeddis@38
|
60
|
rmeddis@38
|
61 %% #3 pure tone, harmonic sequence or speech file input
|
rmeddis@38
|
62 signalType= 'tones';
|
rmeddis@38
|
63 toneFrequency= 4000; % or a pure tone (Hz)
|
rmeddis@38
|
64
|
rmeddis@38
|
65 sampleRate= 44100; % must agree with noise
|
rmeddis@38
|
66 duration=0.010; % seconds
|
rmeddis@38
|
67 beginSilence=0.010;
|
rmeddis@38
|
68 endSilence=0.010;
|
rmeddis@38
|
69 rampDuration=.001; % raised cosine ramp (seconds)
|
rmeddis@38
|
70 noiseRampDuration=0.002;
|
rmeddis@38
|
71
|
rmeddis@38
|
72 % or
|
rmeddis@38
|
73 % harmonic sequence (Hz)
|
rmeddis@38
|
74 % F0=210;
|
rmeddis@38
|
75 % toneFrequency= F0:F0:8000;
|
rmeddis@38
|
76
|
rmeddis@38
|
77 % or
|
rmeddis@38
|
78 % signalType= 'file';
|
rmeddis@38
|
79 % fileName='twister_44kHz';
|
rmeddis@38
|
80
|
rmeddis@38
|
81
|
rmeddis@38
|
82
|
rmeddis@38
|
83 % %% #4 rms level
|
rmeddis@38
|
84 % % signal details
|
rmeddis@38
|
85 % leveldBSPL= 80; % dB SPL (80 for Lieberman)
|
rmeddis@38
|
86 % leveldBSPLNoise=-30;
|
rmeddis@38
|
87
|
rmeddis@38
|
88 %% #5 number of channels in the model
|
rmeddis@38
|
89 % 21-channel model (log spacing)
|
rmeddis@38
|
90 numChannels=21;
|
rmeddis@38
|
91 lowestBF=250; highestBF= 8000;
|
rmeddis@38
|
92 BFlist=round(logspace(log10(lowestBF), log10(highestBF), numChannels));
|
rmeddis@38
|
93
|
rmeddis@38
|
94 % % or specify your own channel BFs
|
rmeddis@38
|
95 % numChannels=1;
|
rmeddis@38
|
96 % BFlist=toneFrequency;
|
rmeddis@38
|
97
|
rmeddis@38
|
98
|
rmeddis@38
|
99 %% #6 change model parameters
|
rmeddis@38
|
100
|
rmeddis@38
|
101 paramChanges={};
|
rmeddis@38
|
102
|
rmeddis@38
|
103 % Parameter changes can be used to change one or more model parameters
|
rmeddis@38
|
104 % *after* the MAPparams file has been read
|
rmeddis@38
|
105 % This example declares only one fiber type with a calcium clearance time
|
rmeddis@38
|
106 % constant of 80e-6 s (HSR fiber) when the probability option is selected.
|
rmeddis@38
|
107 % paramChanges={'AN_IHCsynapseParams.ANspeedUpFactor=5;', ...
|
rmeddis@38
|
108 % 'IHCpreSynapseParams.tauCa=86e-6; '};
|
rmeddis@38
|
109 % paramChanges={'DRNLParams.MOCtauProb =.25;', ...
|
rmeddis@38
|
110 % 'DRNLParams.rateToAttenuationFactorProb = 0.02; '};
|
rmeddis@38
|
111
|
rmeddis@38
|
112 paramChanges={'AN_IHCsynapseParams.numFibers= 50; ',...
|
rmeddis@38
|
113 'DRNLParams.MOCtauProb =.15;', ...
|
rmeddis@38
|
114 'DRNLParams.rateToAttenuationFactorProb = 0.00; '};
|
rmeddis@38
|
115
|
rmeddis@38
|
116 % paramChanges={'AN_IHCsynapseParams.numFibers= 50; ',...
|
rmeddis@38
|
117 % 'DRNLParams.rateToAttenuationFactorProb = -0.007;'};
|
rmeddis@38
|
118
|
rmeddis@38
|
119
|
rmeddis@38
|
120 %% delare 'showMap' options to control graphical output
|
rmeddis@38
|
121 showMapOptions.printModelParameters=1; % prints all parameters
|
rmeddis@38
|
122 showMapOptions.showModelOutput=0; % plot of all stages
|
rmeddis@38
|
123 showMapOptions.printFiringRates=1; % prints stage activity levels
|
rmeddis@38
|
124 showMapOptions.showACF=0; % shows SACF (probability only)
|
rmeddis@38
|
125 showMapOptions.showEfferent=1; % tracks of AR and MOC
|
rmeddis@38
|
126 showMapOptions.surfProbability=1; % 2D plot of HSR response
|
rmeddis@38
|
127 showMapOptions.surfSpikes=1; % 2D plot of spikes histogram
|
rmeddis@38
|
128 showMapOptions.ICrates=0; % IC rates by CNtauGk
|
rmeddis@38
|
129
|
rmeddis@38
|
130 % disable certain silly options
|
rmeddis@38
|
131 if strcmp(AN_spikesOrProbability, 'spikes')
|
rmeddis@38
|
132 % avoid nonsensical options
|
rmeddis@38
|
133 showMapOptions.surfProbability=0;
|
rmeddis@38
|
134 showMapOptions.showACF=0;
|
rmeddis@38
|
135 end
|
rmeddis@38
|
136
|
rmeddis@38
|
137 if strcmp(signalType, 'file')
|
rmeddis@38
|
138 % needed for labeling plot
|
rmeddis@38
|
139 showMapOptions.fileName=fileName;
|
rmeddis@38
|
140 else
|
rmeddis@38
|
141 showMapOptions.fileName=[];
|
rmeddis@38
|
142 end
|
rmeddis@38
|
143
|
rmeddis@38
|
144 fprintf('\n')
|
rmeddis@38
|
145 disp([num2str(numChannels) ' channel model: ' AN_spikesOrProbability])
|
rmeddis@38
|
146 disp('Computing ...')
|
rmeddis@38
|
147
|
rmeddis@38
|
148 %%systematic
|
rmeddis@38
|
149 probeLevels=30:10:80;
|
rmeddis@38
|
150 noiseLevels=[-100 30];
|
rmeddis@38
|
151 noRepeats=10;
|
rmeddis@38
|
152
|
rmeddis@38
|
153 % probeLevels=80;
|
rmeddis@38
|
154 % noiseLevels=[-30];
|
rmeddis@38
|
155 % noRepeats=10;
|
rmeddis@38
|
156
|
rmeddis@38
|
157 peakCAPs=zeros(4,length(probeLevels));
|
rmeddis@38
|
158
|
rmeddis@38
|
159 for noiseCondition=1:length(noiseLevels)
|
rmeddis@38
|
160 leveldBSPLNoise=noiseLevels(noiseCondition);
|
rmeddis@38
|
161 levelNo=0;
|
rmeddis@38
|
162 for probeLevel=probeLevels
|
rmeddis@38
|
163 leveldBSPL=probeLevel;
|
rmeddis@38
|
164 levelNo=levelNo+1;
|
rmeddis@38
|
165 summedCAP=[];
|
rmeddis@38
|
166 for repeatNo= 1:noRepeats
|
rmeddis@38
|
167 disp(['repeat no: ' num2str(repeatNo)])
|
rmeddis@38
|
168 %% Generate stimuli
|
rmeddis@38
|
169
|
rmeddis@38
|
170 switch signalType
|
rmeddis@38
|
171 case 'tones'
|
rmeddis@38
|
172 % Create pure tone stimulus
|
rmeddis@38
|
173 dt=1/sampleRate; % seconds
|
rmeddis@38
|
174 time=dt: dt: duration;
|
rmeddis@38
|
175 inputSignal=sum(sin(2*pi*toneFrequency'*time), 1);
|
rmeddis@38
|
176 amp=10^(leveldBSPL/20)*28e-6; % converts to Pascals (peak)
|
rmeddis@38
|
177 inputSignal=amp*inputSignal;
|
rmeddis@38
|
178 % apply ramps
|
rmeddis@38
|
179 % catch rampTime error
|
rmeddis@38
|
180 if rampDuration>0.5*duration, rampDuration=duration/2; end
|
rmeddis@38
|
181 rampTime=dt:dt:rampDuration;
|
rmeddis@38
|
182 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ...
|
rmeddis@38
|
183 ones(1,length(time)-length(rampTime))];
|
rmeddis@38
|
184 inputSignal=inputSignal.*ramp;
|
rmeddis@38
|
185 ramp=fliplr(ramp);
|
rmeddis@38
|
186 inputSignal=inputSignal.*ramp;
|
rmeddis@38
|
187 % add silence
|
rmeddis@38
|
188 intialSilence= zeros(1,round(beginSilence/dt));
|
rmeddis@38
|
189 finalSilence= zeros(1,round(endSilence/dt));
|
rmeddis@38
|
190 inputSignal= [intialSilence inputSignal finalSilence];
|
rmeddis@38
|
191
|
rmeddis@38
|
192 % [inputNoise sampleRateN]=wavread('babble');
|
rmeddis@38
|
193 [inputNoise sampleRateN]=wavread('white noise');
|
rmeddis@38
|
194 inputNoise=inputNoise(1:length(inputSignal));
|
rmeddis@38
|
195 inputNoise=inputNoise(:,1);
|
rmeddis@38
|
196 targetRMS=20e-6*10^(leveldBSPLNoise/20);
|
rmeddis@38
|
197 rms=(mean(inputNoise.^2))^0.5;
|
rmeddis@38
|
198 amp=targetRMS/rms;
|
rmeddis@38
|
199 inputNoise=inputNoise*amp;
|
rmeddis@38
|
200 time=dt: dt: dt*length(inputNoise);
|
rmeddis@38
|
201 rampTime=dt:dt:noiseRampDuration;
|
rmeddis@38
|
202 ramp=[0.5*(1+cos(2*pi*rampTime/(2*noiseRampDuration)+pi)) ...
|
rmeddis@38
|
203 ones(1,length(time)-length(rampTime))];
|
rmeddis@38
|
204 inputNoise=inputNoise'.*ramp;
|
rmeddis@38
|
205 ramp=fliplr(ramp);
|
rmeddis@38
|
206 inputNoise=inputNoise.*ramp;
|
rmeddis@38
|
207
|
rmeddis@38
|
208 inputSignal=inputSignal+inputNoise;
|
rmeddis@38
|
209 intialSilence= zeros(1,round(beginSilence/dt));
|
rmeddis@38
|
210 finalSilence= zeros(1,round(endSilence/dt));
|
rmeddis@38
|
211 inputSignal= [intialSilence inputSignal finalSilence];
|
rmeddis@38
|
212
|
rmeddis@38
|
213 toneOnset=2*beginSilence;
|
rmeddis@38
|
214
|
rmeddis@38
|
215 figure(2), subplot(3,1,1)
|
rmeddis@38
|
216 time=dt:dt:dt*length(inputSignal);
|
rmeddis@38
|
217 plot(time,inputSignal,'k')
|
rmeddis@38
|
218
|
rmeddis@38
|
219 case 'file'
|
rmeddis@38
|
220 %% file input simple or mixed
|
rmeddis@38
|
221 [inputSignal sampleRate]=wavread(fileName);
|
rmeddis@38
|
222 dt=1/sampleRate;
|
rmeddis@38
|
223 inputSignal=inputSignal(:,1);
|
rmeddis@38
|
224 targetRMS=20e-6*10^(leveldBSPL/20);
|
rmeddis@38
|
225 rms=(mean(inputSignal.^2))^0.5;
|
rmeddis@38
|
226 amp=targetRMS/rms;
|
rmeddis@38
|
227 inputSignal=inputSignal*amp;
|
rmeddis@38
|
228 intialSilence= zeros(1,round(0.1/dt));
|
rmeddis@38
|
229 finalSilence= zeros(1,round(0.2/dt));
|
rmeddis@38
|
230 inputSignal= [intialSilence inputSignal' finalSilence];
|
rmeddis@38
|
231
|
rmeddis@38
|
232 end
|
rmeddis@38
|
233
|
rmeddis@38
|
234
|
rmeddis@38
|
235 %% run the model
|
rmeddis@38
|
236 tic
|
rmeddis@38
|
237
|
rmeddis@38
|
238 MAP1_14(inputSignal, sampleRate, BFlist, ...
|
rmeddis@38
|
239 MAPparamsName, AN_spikesOrProbability, paramChanges);
|
rmeddis@38
|
240
|
rmeddis@38
|
241
|
rmeddis@38
|
242 %% the model run is now complete. Now display the results
|
rmeddis@38
|
243 % UTIL_showMAP(showMapOptions, paramChanges)
|
rmeddis@38
|
244
|
rmeddis@38
|
245 wholeNerveCAP = UTIL_CAPgenerator...
|
rmeddis@38
|
246 (ANoutput, dtSpikes, BFlist, AN_IHCsynapseParams.numFibers, 1);
|
rmeddis@38
|
247
|
rmeddis@38
|
248 if isempty(summedCAP)
|
rmeddis@38
|
249 summedCAP=wholeNerveCAP;
|
rmeddis@38
|
250 else
|
rmeddis@38
|
251 summedCAP=summedCAP+wholeNerveCAP;
|
rmeddis@38
|
252 end
|
rmeddis@38
|
253
|
rmeddis@38
|
254 switch AN_spikesOrProbability
|
rmeddis@38
|
255 case 'spikes'
|
rmeddis@38
|
256 ANoutput = sum(ANoutput, 1);
|
rmeddis@38
|
257 case 'probability'
|
rmeddis@38
|
258 ANoutput = ANprobRateOutput(13+21,:);
|
rmeddis@38
|
259 end
|
rmeddis@38
|
260 figure(2), subplot(3,1,2), plot(ANoutput)
|
rmeddis@38
|
261 spikeTimes=dtSpikes:dtSpikes:dtSpikes* length(wholeNerveCAP);
|
rmeddis@38
|
262 figure(2), subplot(3,1,3), plot(spikeTimes,summedCAP/repeatNo)
|
rmeddis@38
|
263 ylim([-50 50])
|
rmeddis@38
|
264 end % repeat
|
rmeddis@38
|
265
|
rmeddis@38
|
266 spikeTimes=dtSpikes:dtSpikes:dtSpikes* length(wholeNerveCAP);
|
rmeddis@38
|
267 idx=find(spikeTimes>toneOnset & ...
|
rmeddis@38
|
268 spikeTimes>toneOnset+duration+.005);
|
rmeddis@38
|
269 averageCAP=summedCAP/repeatNo;
|
rmeddis@38
|
270 peakCAP=max(averageCAP(idx));
|
rmeddis@38
|
271 peakCAPs(noiseCondition,levelNo)=peakCAPs(noiseCondition,levelNo)+ peakCAP;
|
rmeddis@38
|
272
|
rmeddis@38
|
273 if strcmp(signalType,'tones')
|
rmeddis@38
|
274 disp(['duration=' num2str(duration)])
|
rmeddis@38
|
275 disp(['level=' num2str(leveldBSPL)])
|
rmeddis@38
|
276 disp(['toneFrequency=' num2str(toneFrequency)])
|
rmeddis@38
|
277 disp(['leveldBSPLNoise=' num2str(leveldBSPLNoise)])
|
rmeddis@38
|
278
|
rmeddis@38
|
279 disp(['attenuation factor =' ...
|
rmeddis@38
|
280 num2str(DRNLParams.rateToAttenuationFactor, '%5.3f') ])
|
rmeddis@38
|
281 disp(['attenuation factor (probability)=' ...
|
rmeddis@38
|
282 num2str(DRNLParams.rateToAttenuationFactorProb, '%5.3f') ])
|
rmeddis@38
|
283 disp(AN_spikesOrProbability)
|
rmeddis@38
|
284 end
|
rmeddis@38
|
285
|
rmeddis@38
|
286
|
rmeddis@38
|
287 disp([ 'peak CAP ' num2str(peakCAP)])
|
rmeddis@38
|
288
|
rmeddis@38
|
289 for i=1:length(paramChanges)
|
rmeddis@38
|
290 disp(paramChanges{i})
|
rmeddis@38
|
291 end
|
rmeddis@38
|
292 end % probe level
|
rmeddis@38
|
293 figure(9), subplot(3,1,3), plot(probeLevels,peakCAPs)
|
rmeddis@38
|
294 end % condition
|
rmeddis@38
|
295 %%
|
rmeddis@38
|
296
|
rmeddis@38
|
297 path(restorePath)
|
rmeddis@38
|
298
|