rmeddis@30
|
1 function test_MAP1_14x
|
rmeddis@30
|
2 % 'x' is a trial file
|
rmeddis@30
|
3 % test_MAP1_14 is a general purpose test routine that can be adjusted to
|
rmeddis@30
|
4 % test a number of different applications of MAP1_14
|
rmeddis@30
|
5 %
|
rmeddis@30
|
6 % A range of options are supplied in the early part of the program
|
rmeddis@30
|
7 %
|
rmeddis@30
|
8 % One use of the function is to create demonstrations; filenames <demoxx>
|
rmeddis@30
|
9 % to illustrate particular features
|
rmeddis@30
|
10 %
|
rmeddis@30
|
11 % #1
|
rmeddis@30
|
12 % Identify the file (in 'MAPparamsName') containing the model parameters
|
rmeddis@30
|
13 %
|
rmeddis@30
|
14 % #2
|
rmeddis@30
|
15 % Identify the kind of model required (in 'AN_spikesOrProbability').
|
rmeddis@30
|
16 % A full brainstem model (spikes) can be computed or a shorter model
|
rmeddis@30
|
17 % (probability) that computes only so far as the auditory nerve
|
rmeddis@30
|
18 %
|
rmeddis@30
|
19 % #3
|
rmeddis@30
|
20 % Choose between a tone signal or file input (in 'signalType')
|
rmeddis@30
|
21 %
|
rmeddis@30
|
22 % #4
|
rmeddis@30
|
23 % Set the signal rms level (in leveldBSPL)
|
rmeddis@30
|
24 %
|
rmeddis@30
|
25 % #5
|
rmeddis@30
|
26 % Identify the channels in terms of their best frequencies in the vector
|
rmeddis@30
|
27 % BFlist.
|
rmeddis@30
|
28 %
|
rmeddis@30
|
29 % Last minute changes to the parameters fetched earlier can be made using
|
rmeddis@30
|
30 % the cell array of strings 'paramChanges'.
|
rmeddis@30
|
31 % Each string must have the same format as the corresponding line in the
|
rmeddis@30
|
32 % file identified in 'MAPparamsName'
|
rmeddis@30
|
33 %
|
rmeddis@30
|
34 % When the demonstration is satisfactory, freeze it by renaming it <demoxx>
|
rmeddis@30
|
35
|
rmeddis@30
|
36 dbstop if error
|
rmeddis@30
|
37 restorePath=path;
|
rmeddis@30
|
38 addpath (['..' filesep 'MAP'], ['..' filesep 'wavFileStore'], ...
|
rmeddis@30
|
39 ['..' filesep 'utilities'])
|
rmeddis@30
|
40
|
rmeddis@30
|
41 %% #1 parameter file name
|
rmeddis@30
|
42 MAPparamsName='NormalIC';
|
rmeddis@30
|
43
|
rmeddis@30
|
44
|
rmeddis@30
|
45 %% #2 probability (fast) or spikes (slow) representation
|
rmeddis@30
|
46 AN_spikesOrProbability='spikes';
|
rmeddis@30
|
47
|
rmeddis@30
|
48 % or
|
rmeddis@30
|
49 % NB probabilities are not corrected for refractory effects
|
rmeddis@30
|
50 % AN_spikesOrProbability='probability';
|
rmeddis@30
|
51
|
rmeddis@30
|
52
|
rmeddis@30
|
53 %% #3 pure tone, harmonic sequence or speech file input
|
rmeddis@30
|
54 signalType= 'tones';
|
rmeddis@30
|
55 sampleRate= 50000;
|
rmeddis@30
|
56 duration=0.250; % seconds
|
rmeddis@30
|
57 toneFrequency= 250:250:8000; % harmonic sequence (Hz)
|
rmeddis@30
|
58 % toneFrequency= 1000; % or a pure tone (Hz8
|
rmeddis@30
|
59 rampDuration=.005; % seconds
|
rmeddis@30
|
60
|
rmeddis@30
|
61 % or
|
rmeddis@30
|
62
|
rmeddis@30
|
63 % signalType= 'file';
|
rmeddis@30
|
64 % fileName='twister_44kHz';
|
rmeddis@30
|
65
|
rmeddis@30
|
66
|
rmeddis@30
|
67 %% #4 rms level
|
rmeddis@30
|
68 % signal details
|
rmeddis@30
|
69 leveldBSPL= 30; % dB SPL
|
rmeddis@30
|
70
|
rmeddis@30
|
71
|
rmeddis@30
|
72 %% #5 number of channels in the model
|
rmeddis@30
|
73 % 21-channel model (log spacing)
|
rmeddis@30
|
74 numChannels=21;
|
rmeddis@30
|
75 lowestBF=250; highestBF= 8000;
|
rmeddis@30
|
76 BFlist=round(logspace(log10(lowestBF), log10(highestBF), numChannels));
|
rmeddis@30
|
77
|
rmeddis@30
|
78 % or specify your own channel BFs
|
rmeddis@30
|
79 % numChannels=1;
|
rmeddis@30
|
80 % BFlist=toneFrequency;
|
rmeddis@30
|
81
|
rmeddis@30
|
82
|
rmeddis@30
|
83 %% #6 change model parameters
|
rmeddis@30
|
84 paramChanges=[];
|
rmeddis@30
|
85
|
rmeddis@30
|
86 % or
|
rmeddis@30
|
87 % Parameter changes can be used to change one or more model parameters
|
rmeddis@30
|
88 % *after* the MAPparams file has been read
|
rmeddis@30
|
89 % This example declares only one fiber type with a calcium clearance time
|
rmeddis@30
|
90 % constant of 80e-6 s (HSR fiber) when the probability option is selected.
|
rmeddis@30
|
91
|
rmeddis@30
|
92 % paramChanges={'AN_IHCsynapseParams.ANspeedUpFactor=5;', ...
|
rmeddis@30
|
93 % 'IHCpreSynapseParams.tauCa=86e-6;'};
|
rmeddis@30
|
94
|
rmeddis@30
|
95 % paramChanges={'DRNLParams.rateToAttenuationFactorProb = 0;'};
|
rmeddis@30
|
96
|
rmeddis@30
|
97 % paramChanges={'IHCpreSynapseParams.tauCa=86e-6;',
|
rmeddis@30
|
98 % 'AN_IHCsynapseParams.numFibers= 1000;'};
|
rmeddis@30
|
99
|
rmeddis@30
|
100 % fixed MOC attenuation(using negative factor)
|
rmeddis@30
|
101 paramChanges={'DRNLParams.rateToAttenuationFactorProb=-0.005;'};
|
rmeddis@30
|
102
|
rmeddis@30
|
103 %% delare 'showMap' options to control graphical output
|
rmeddis@30
|
104
|
rmeddis@30
|
105 showMapOptions.printModelParameters=1; % prints all parameters
|
rmeddis@30
|
106 showMapOptions.showModelOutput=1; % plot of all stages
|
rmeddis@30
|
107 showMapOptions.printFiringRates=1; % prints stage activity levels
|
rmeddis@30
|
108 showMapOptions.showACF=0; % shows SACF (probability only)
|
rmeddis@30
|
109 showMapOptions.showEfferent=1; % tracks of AR and MOC
|
rmeddis@30
|
110 showMapOptions.surfProbability=1; % 2D plot of HSR response
|
rmeddis@30
|
111 showMapOptions.surfSpikes=1; % 2D plot of spikes histogram
|
rmeddis@30
|
112
|
rmeddis@30
|
113 % disable certain silly options
|
rmeddis@30
|
114 if strcmp(AN_spikesOrProbability, 'spikes')
|
rmeddis@30
|
115 % avoid nonsensical options
|
rmeddis@30
|
116 showMapOptions.surfProbability=0;
|
rmeddis@30
|
117 showMapOptions.showACF=0;
|
rmeddis@30
|
118 else
|
rmeddis@30
|
119 showMapOptions.surfSpikes=0;
|
rmeddis@30
|
120 end
|
rmeddis@30
|
121 if strcmp(signalType, 'file')
|
rmeddis@30
|
122 % needed for labeling plot
|
rmeddis@30
|
123 showMapOptions.fileName=fileName;
|
rmeddis@30
|
124 else
|
rmeddis@30
|
125 showMapOptions.fileName=[];
|
rmeddis@30
|
126 end
|
rmeddis@30
|
127
|
rmeddis@30
|
128 %% Generate stimuli
|
rmeddis@30
|
129
|
rmeddis@30
|
130 switch signalType
|
rmeddis@30
|
131 case 'tones'
|
rmeddis@30
|
132 inputSignal=createMultiTone(sampleRate, toneFrequency, ...
|
rmeddis@30
|
133 leveldBSPL, duration, rampDuration);
|
rmeddis@30
|
134
|
rmeddis@30
|
135 case 'file'
|
rmeddis@30
|
136 %% file input simple or mixed
|
rmeddis@30
|
137 [inputSignal sampleRate]=wavread(fileName);
|
rmeddis@30
|
138 dt=1/sampleRate;
|
rmeddis@30
|
139 inputSignal=inputSignal(:,1);
|
rmeddis@30
|
140 targetRMS=20e-6*10^(leveldBSPL/20);
|
rmeddis@30
|
141 rms=(mean(inputSignal.^2))^0.5;
|
rmeddis@30
|
142 amp=targetRMS/rms;
|
rmeddis@30
|
143 inputSignal=inputSignal*amp;
|
rmeddis@30
|
144 silence= zeros(1,round(0.1/dt));
|
rmeddis@30
|
145 inputSignal= [silence inputSignal' silence];
|
rmeddis@30
|
146 end
|
rmeddis@30
|
147
|
rmeddis@30
|
148
|
rmeddis@30
|
149 %% run the model
|
rmeddis@30
|
150 tic
|
rmeddis@30
|
151
|
rmeddis@30
|
152 fprintf('\n')
|
rmeddis@30
|
153 disp(['Signal duration= ' num2str(length(inputSignal)/sampleRate)])
|
rmeddis@30
|
154 disp([num2str(numChannels) ' channel model'])
|
rmeddis@30
|
155 disp('Computing ...')
|
rmeddis@30
|
156
|
rmeddis@30
|
157 MAP1_14(inputSignal, sampleRate, BFlist, ...
|
rmeddis@30
|
158 MAPparamsName, AN_spikesOrProbability, paramChanges);
|
rmeddis@30
|
159
|
rmeddis@30
|
160
|
rmeddis@30
|
161 % the model run is now complete. Now display the results
|
rmeddis@30
|
162 UTIL_showMAP(showMapOptions, paramChanges)
|
rmeddis@30
|
163
|
rmeddis@30
|
164 toc
|
rmeddis@30
|
165 path(restorePath)
|
rmeddis@30
|
166
|
rmeddis@30
|
167
|
rmeddis@30
|
168 function inputSignal=createMultiTone(sampleRate, toneFrequency, ...
|
rmeddis@30
|
169 leveldBSPL, duration, rampDuration)
|
rmeddis@30
|
170 % Create pure tone stimulus
|
rmeddis@30
|
171 dt=1/sampleRate; % seconds
|
rmeddis@30
|
172 time=dt: dt: duration;
|
rmeddis@30
|
173 inputSignal=sum(sin(2*pi*toneFrequency'*time), 1);
|
rmeddis@30
|
174 amp=10^(leveldBSPL/20)*28e-6; % converts to Pascals (peak)
|
rmeddis@30
|
175 inputSignal=amp*inputSignal;
|
rmeddis@30
|
176
|
rmeddis@30
|
177 % apply ramps
|
rmeddis@30
|
178 % catch rampTime error
|
rmeddis@30
|
179 if rampDuration>0.5*duration, rampDuration=duration/2; end
|
rmeddis@30
|
180 rampTime=dt:dt:rampDuration;
|
rmeddis@30
|
181 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ...
|
rmeddis@30
|
182 ones(1,length(time)-length(rampTime))];
|
rmeddis@30
|
183 inputSignal=inputSignal.*ramp;
|
rmeddis@30
|
184 ramp=fliplr(ramp);
|
rmeddis@30
|
185 inputSignal=inputSignal.*ramp;
|
rmeddis@30
|
186
|
rmeddis@30
|
187 % add 10 ms silence
|
rmeddis@30
|
188 silence= zeros(1,round(0.05/dt));
|
rmeddis@30
|
189 inputSignal= [silence inputSignal silence];
|
rmeddis@30
|
190
|