Mercurial > hg > map
comparison userProgramsMathiasDietz/test_binaural.m @ 38:c2204b18f4a2 tip
End nov big change
author | Ray Meddis <rmeddis@essex.ac.uk> |
---|---|
date | Mon, 28 Nov 2011 13:34:28 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
37:771a643d5c29 | 38:c2204b18f4a2 |
---|---|
1 function test_binaural | |
2 % test_binaural is a first attempt to produce a binaural model | |
3 % incorporating MSO and IC models. | |
4 % The monaural response is computed first for left and right stimuli | |
5 % before using the CN response as input to the binaural MSO model | |
6 % that, in turn, feeds a single cell IC model. | |
7 % | |
8 % The function has no arguments and everything is set up internally | |
9 % | |
10 % #1 | |
11 % Identify the file (in 'MAPparamsName') containing the model parameters | |
12 % the default is 'PL' which uses primary like neurons in the CN to | |
13 % simulate spherical bushy cells | |
14 % | |
15 % #2 | |
16 % Set AN_spikesOrProbability'). to 'spikes' | |
17 % | |
18 % #3 | |
19 % Choose between a tone signal or file input (in 'signalType') | |
20 % | |
21 % #4 | |
22 % Set the signal rms level (in leveldBSPL) | |
23 % | |
24 % #5 | |
25 % Identify the channels in terms of their best frequencies in the vector | |
26 % BFlist. This is currently a single-channel model, so only one BF needed | |
27 % | |
28 % #6 | |
29 % Last minute changes to the parameters fetched earlier can be made using | |
30 % the cell array of strings 'paramChanges'. | |
31 % Each string must have the same format as the corresponding line in the | |
32 % file identified in 'MAPparamsName' | |
33 % Currently this is used to specify that only HSR fibers are used and | |
34 % for changing the current per AN spike at the CN dendrite | |
35 % | |
36 % #7 | |
37 % specify the parameters of the MSO cells in the MSOParams structure | |
38 % | |
39 % #8 | |
40 % specify the parameters of the IC cells in the ICMSOParams structure | |
41 % | |
42 % #9 | |
43 % identify the plots required from MAP1_14 (i.e. before the bonaural model) | |
44 % | |
45 % #10 | |
46 % Specify ITDs. The program cycles through different ITDs | |
47 % | |
48 | |
49 global CNoutput dtSpikes | |
50 dbstop if error | |
51 restorePath=path; | |
52 addpath (['..' filesep 'MAP'], ['..' filesep 'wavFileStore'], ... | |
53 ['..' filesep 'utilities']) | |
54 | |
55 %% #1 monaural model parameter file name | |
56 MAPparamsName='PL'; | |
57 | |
58 | |
59 %% #2 'spikes' are mandatory for this model | |
60 AN_spikesOrProbability='spikes'; | |
61 | |
62 | |
63 %% #3 pure tone, harmonic sequence or speech file input | |
64 signalType= 'tones'; | |
65 sampleRate= 50000; | |
66 duration=0.050; % seconds | |
67 rampDuration=.005; % raised cosine ramp (seconds) | |
68 beginSilence=0.050; | |
69 endSilence=0.050; | |
70 toneFrequency= 750; % or a pure tone (Hz) | |
71 | |
72 % or | |
73 % harmonic sequence (Hz) | |
74 % F0=210; | |
75 % toneFrequency= F0:F0:8000; | |
76 | |
77 % or | |
78 % signalType= 'file'; | |
79 % fileName='twister_44kHz'; | |
80 | |
81 if strcmp(signalType, 'file') | |
82 % needed for labeling plot | |
83 showMapOptions.fileName=fileName; | |
84 else | |
85 showMapOptions.fileName=[]; | |
86 end | |
87 | |
88 %% #4 rms level | |
89 leveldBSPL= 70; | |
90 | |
91 | |
92 %% #5 number of channels in the model | |
93 BFlist=toneFrequency; | |
94 | |
95 %% #6 change model parameters | |
96 | |
97 paramChanges={'IHCpreSynapseParams.tauCa=80e-6;',... | |
98 'MacGregorMultiParams.currentPerSpike=0.800e-6;'}; | |
99 | |
100 % Parameter changes can be used to change one or more model parameters | |
101 % *after* the MAPparams file has been read | |
102 | |
103 %% #7 MSO parameters | |
104 MSOParams.nNeuronsPerBF= 10; % N neurons per BF | |
105 MSOParams.type = 'primary-like cell'; | |
106 MSOParams.fibersPerNeuron=4; % N input fibers | |
107 MSOParams.dendriteLPfreq=2000; % dendritic filter | |
108 MSOParams.currentPerSpike=0.11e-6; % (A) per spike | |
109 MSOParams.currentPerSpike=0.5e-6; % (A) per spike | |
110 MSOParams.Cap=4.55e-9; % cell capacitance (Siemens) | |
111 MSOParams.tauM=5e-4; % membrane time constant (s) | |
112 MSOParams.Ek=-0.01; % K+ eq. potential (V) | |
113 MSOParams.dGkSpike=3.64e-5; % K+ cond.shift on spike,S | |
114 MSOParams.tauGk= 0.0012; % K+ conductance tau (s) | |
115 MSOParams.Th0= 0.01; % equilibrium threshold (V) | |
116 MSOParams.c= 0.01; % threshold shift on spike, (V) | |
117 MSOParams.tauTh= 0.015; % variable threshold tau | |
118 MSOParams.Er=-0.06; % resting potential (V) | |
119 MSOParams.Eb=0.06; % spike height (V) | |
120 MSOParams.debugging=0; % (special) | |
121 MSOParams.wideband=0; % special for wideband units | |
122 | |
123 %% #8 IC parameters | |
124 ICchopperParams.nNeuronsPerBF= 10; % N neurons per BF | |
125 ICchopperParams.type = 'chopper cell'; | |
126 ICchopperParams.fibersPerNeuron=10; % N input fibers | |
127 ICchopperParams.dendriteLPfreq=50; % dendritic filter | |
128 ICchopperParams.currentPerSpike=50e-9; % *per spike | |
129 ICchopperParams.currentPerSpike=100e-9; % *per spike | |
130 ICchopperParams.Cap=1.67e-8; % ??cell capacitance (Siemens) | |
131 ICchopperParams.tauM=0.002; % membrane time constant (s) | |
132 ICchopperParams.Ek=-0.01; % K+ eq. potential (V) | |
133 ICchopperParams.dGkSpike=1.33e-4; % K+ cond.shift on spike,S | |
134 ICchopperParams.tauGk= 0.0005;% K+ conductance tau (s) | |
135 ICchopperParams.Th0= 0.01; % equilibrium threshold (V) | |
136 ICchopperParams.c= 0; % threshold shift on spike, (V) | |
137 ICchopperParams.tauTh= 0.02; % variable threshold tau | |
138 ICchopperParams.Er=-0.06; % resting potential (V) | |
139 ICchopperParams.Eb=0.06; % spike height (V) | |
140 ICchopperParams.PSTHbinWidth= 1e-4; | |
141 | |
142 %% #9 delare 'showMap' options to control graphical output | |
143 % this applies to the monaural input model only | |
144 showMapOptions.printModelParameters=0; % prints all parameters | |
145 showMapOptions.showModelOutput=1; % plot all stages if monaural input | |
146 | |
147 %% #10 ITDs | |
148 % the program cycles through a range of stimulus ITDs | |
149 ITDs=0e-6:100e-6:2000e-6; | |
150 % ITDs=0; % single shot | |
151 | |
152 %% Now start computing! | |
153 figure(98), clf, set(gcf, 'name', 'binaural demo') | |
154 MSOcounts=zeros(1,length(ITDs)); | |
155 ICcounts=zeros(1,length(ITDs)); | |
156 ITDcount=0; | |
157 for ITD=ITDs | |
158 ITDcount=ITDcount+1; | |
159 delaySamples=round(ITD* sampleRate); | |
160 %% Generate stimuli | |
161 switch signalType | |
162 case 'tones' | |
163 % Create pure tone stimulus | |
164 dt=1/sampleRate; % seconds | |
165 time=dt: dt: duration; | |
166 inputSignal=sum(sin(2*pi*toneFrequency'*time), 1); | |
167 amp=10^(leveldBSPL/20)*28e-6; % converts to Pascals (peak) | |
168 inputSignal=amp*inputSignal; | |
169 % apply ramps | |
170 % catch rampTime error | |
171 if rampDuration>0.5*duration, rampDuration=duration/2; end | |
172 rampTime=dt:dt:rampDuration; | |
173 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ... | |
174 ones(1,length(time)-length(rampTime))]; | |
175 inputSignal=inputSignal.*ramp; | |
176 ramp=fliplr(ramp); | |
177 inputSignal=inputSignal.*ramp; | |
178 % add silence | |
179 intialSilence= zeros(1,round(beginSilence/dt)); | |
180 finalSilence= zeros(1,round(endSilence/dt)); | |
181 inputSignal= [intialSilence inputSignal finalSilence]; | |
182 | |
183 case 'file' | |
184 %% file input simple or mixed | |
185 [inputSignal sampleRate]=wavread(fileName); | |
186 dt=1/sampleRate; | |
187 inputSignal=inputSignal(:,1); | |
188 targetRMS=20e-6*10^(leveldBSPL/20); | |
189 rms=(mean(inputSignal.^2))^0.5; | |
190 amp=targetRMS/rms; | |
191 inputSignal=inputSignal*amp; | |
192 intialSilence= zeros(1,round(0.1/dt)); | |
193 finalSilence= zeros(1,round(0.2/dt)); | |
194 inputSignal= [intialSilence inputSignal' finalSilence]; | |
195 end | |
196 | |
197 %% run the monaural model twice | |
198 t=dt:dt:dt*length(inputSignal); | |
199 for ear={'left','right'} | |
200 figure(98), subplot(4,1,1), colour='b'; hold off | |
201 switch ear{1} | |
202 case 'right' | |
203 inputSignal=circshift(inputSignal', delaySamples)'; | |
204 hold on | |
205 colour='r'; | |
206 end | |
207 plot(t, inputSignal, colour) | |
208 title ('binaural inputs signals') | |
209 ylabel('Pa'), xlabel('time') | |
210 xlim([0 max(t)]) | |
211 | |
212 % call to monaural model | |
213 MAP1_14(inputSignal, sampleRate, BFlist, ... | |
214 MAPparamsName, AN_spikesOrProbability, paramChanges); | |
215 | |
216 % the model run is now complete. Now display the results | |
217 UTIL_showMAP(showMapOptions, paramChanges) | |
218 | |
219 % copy the CN inputspiking pattern to the binaural display | |
220 figure(98) | |
221 switch ear{1} | |
222 case 'left' | |
223 CNoutputLeft=CNoutput; | |
224 subplot(4,2,3) | |
225 case 'right' | |
226 CNoutputRight=CNoutput; | |
227 subplot(4,2,4) | |
228 end | |
229 plotInstructions=[]; | |
230 plotInstructions.axes=gca; | |
231 plotInstructions.displaydt=dtSpikes; | |
232 plotInstructions.title= ['CN spikes ' ear{1}]; | |
233 plotInstructions.rasterDotSize=2; | |
234 if sum(sum(CNoutput))<100 | |
235 plotInstructions.rasterDotSize=3; | |
236 end | |
237 UTIL_plotMatrix(CNoutput, plotInstructions); | |
238 | |
239 end % left/ right ear | |
240 | |
241 %% MSO | |
242 % run MSO model using left and right CN spikes | |
243 MSOspikes=MSO(CNoutputLeft,CNoutputRight, dtSpikes, MSOParams); | |
244 | |
245 sumspikes=sum(sum(MSOspikes)); | |
246 disp(['ITD/ MSO spikes count= ' num2str([ITD sumspikes])]) | |
247 MSOcounts(ITDcount)=sumspikes; | |
248 figure(98), subplot(4,2, 8), cla, hold off, plot(ITDs*1e6, MSOcounts) | |
249 | |
250 %% IC chopper | |
251 % run IC model using all MSO spikes as input to a single IC cell | |
252 ICMSOspikes=ICchopper(MSOspikes, dtSpikes, ICchopperParams); | |
253 | |
254 sumspikes=sum(sum(ICMSOspikes)); | |
255 disp(['ITD/ ICMSO spikes count= ' num2str([ITD sumspikes])]) | |
256 ICcounts(ITDcount)=sumspikes; | |
257 figure(98), subplot(4,2,8),hold on, plot(ITDs*1e6, ICcounts,'r') | |
258 xlabel('ITD'), ylabel(' spike count') | |
259 title('MSO (blue)/ IC (red) spike counts') | |
260 legend({'MSO','IC'}) | |
261 | |
262 end % ITDs | |
263 | |
264 path(restorePath) | |
265 | |
266 | |
267 function MSOspikes=MSO(CNoutputLeft,CNoutputRight, dtSpikes, MSOparams) | |
268 %% | |
269 [nMSOcells nEpochs]=size(CNoutputLeft); | |
270 inputCurrent=zeros(nMSOcells, nEpochs); | |
271 MSOmembranePotential=inputCurrent; | |
272 | |
273 MSO_tauM=MSOparams.tauM; | |
274 MSO_tauGk=MSOparams.tauGk; | |
275 MSO_tauTh=MSOparams.tauTh; | |
276 MSO_cap=MSOparams.Cap; | |
277 MSO_c=MSOparams.c; | |
278 MSO_b=MSOparams.dGkSpike; | |
279 MSO_Th0=MSOparams.Th0; | |
280 MSO_Ek=MSOparams.Ek; | |
281 MSO_Eb= MSOparams.Eb; | |
282 MSO_Er=MSOparams.Er; | |
283 | |
284 MSO_E=zeros(nMSOcells,1); | |
285 MSO_Gk=zeros(nMSOcells,1); | |
286 MSO_Th=MSO_Th0*ones(nMSOcells,1); | |
287 | |
288 % Dendritic filtering, all spikes are replaced by CNalphaFunction functions | |
289 MSOdendriteLPfreq= MSOparams.dendriteLPfreq; | |
290 MSOcurrentPerSpike=MSOparams.currentPerSpike; | |
291 MSOspikeToCurrentTau=1/(2*pi*MSOdendriteLPfreq); | |
292 t=dtSpikes:dtSpikes:5*MSOspikeToCurrentTau; | |
293 MSO_CNalphaFunction= (MSOcurrentPerSpike / ... | |
294 MSOspikeToCurrentTau)*t.*exp(-t / MSOspikeToCurrentTau); | |
295 % show alpha function | |
296 % figure(84), subplot(4,2,2), plot(t,MSO_CNalphaFunction) | |
297 % title(['LP cutoff ' num2str(MSOdendriteLPfreq)]) | |
298 | |
299 % convert CN spikes to post-dendritic current | |
300 CN_spikes=CNoutputLeft+CNoutputRight; | |
301 for i=1:nMSOcells | |
302 x= conv2(CN_spikes(i,:), MSO_CNalphaFunction); | |
303 inputCurrent(i,:)=x(1:nEpochs); | |
304 end | |
305 | |
306 if MSO_c==0 | |
307 % faster computation when threshold is stable (c==0) | |
308 for t=1:nEpochs | |
309 s=MSO_E>MSO_Th0; | |
310 dE = (-MSO_E/MSO_tauM + inputCurrent(:,t)/MSO_cap +... | |
311 (MSO_Gk/MSO_cap).*(MSO_Ek-MSO_E))*dtSpikes; | |
312 dGk=-MSO_Gk*dtSpikes/MSO_tauGk +MSO_b*s; | |
313 MSO_E=MSO_E+dE; | |
314 MSO_Gk=MSO_Gk+dGk; | |
315 MSOmembranePotential(:,t)=MSO_E+s.*(MSO_Eb-MSO_E)+MSO_Er; | |
316 end | |
317 else | |
318 % threshold is changing (MSO_c>0; e.g. bushy cell) | |
319 for t=1:nEpochs | |
320 dE = (-MSO_E/MSO_tauM + ... | |
321 inputCurrent(:,t)/MSO_cap + (MSO_Gk/MSO_cap)... | |
322 .*(MSO_Ek-MSO_E))*dtSpikes; | |
323 MSO_E=MSO_E+dE; | |
324 s=MSO_E>MSO_Th; | |
325 MSOmembranePotential(:,t)=MSO_E+s.*(MSO_Eb-MSO_E)+MSO_Er; | |
326 dGk=-MSO_Gk*dtSpikes/MSO_tauGk +MSO_b*s; | |
327 MSO_Gk=MSO_Gk+dGk; | |
328 | |
329 % After a spike, the threshold is raised | |
330 % otherwise it settles to its baseline | |
331 dTh=-(MSO_Th-MSO_Th0)*dtSpikes/MSO_tauTh +s*MSO_c; | |
332 MSO_Th=MSO_Th+dTh; | |
333 end | |
334 end | |
335 | |
336 figure(98),subplot(4,1,3) | |
337 hold off, imagesc(MSOmembranePotential) | |
338 title ('MSO (V)') | |
339 | |
340 MSOspikes=MSOmembranePotential> -0.01; | |
341 % Remove any spike that is immediately followed by a spike | |
342 % NB 'find' works on columns (whence the transposing) | |
343 MSOspikes=MSOspikes'; | |
344 idx=find(MSOspikes); | |
345 idx=idx(1:end-1); | |
346 MSOspikes(idx+1)=0; | |
347 MSOspikes=MSOspikes'; | |
348 | |
349 | |
350 function ICMSOspikes=ICchopper(ICMSOspikes, dtSpikes, ICMSOParams) | |
351 %% | |
352 ICMSOspikes=sum(ICMSOspikes); | |
353 [nICMSOcells nEpochs]=size(ICMSOspikes); | |
354 inputCurrent=zeros(nICMSOcells, nEpochs); | |
355 ICMSOmembranePotential=inputCurrent; | |
356 | |
357 ICMSO_tauM=ICMSOParams.tauM; | |
358 ICMSO_tauGk=ICMSOParams.tauGk; | |
359 ICMSO_tauTh=ICMSOParams.tauTh; | |
360 ICMSO_cap=ICMSOParams.Cap; | |
361 ICMSO_c=ICMSOParams.c; | |
362 ICMSO_b=ICMSOParams.dGkSpike; | |
363 ICMSO_Th0=ICMSOParams.Th0; | |
364 ICMSO_Ek=ICMSOParams.Ek; | |
365 ICMSO_Eb= ICMSOParams.Eb; | |
366 ICMSO_Er=ICMSOParams.Er; | |
367 | |
368 ICMSO_E=zeros(nICMSOcells,1); | |
369 ICMSO_Gk=zeros(nICMSOcells,1); | |
370 ICMSO_Th=ICMSO_Th0*ones(nICMSOcells,1); | |
371 | |
372 % Dendritic filtering, all spikes are replaced by CNalphaFunction functions | |
373 ICMSOdendriteLPfreq= ICMSOParams.dendriteLPfreq; | |
374 ICMSOcurrentPerSpike=ICMSOParams.currentPerSpike; | |
375 ICMSOspikeToCurrentTau=1/(2*pi*ICMSOdendriteLPfreq); | |
376 t=dtSpikes:dtSpikes:5*ICMSOspikeToCurrentTau; | |
377 ICMSOalphaFunction= (ICMSOcurrentPerSpike / ... | |
378 ICMSOspikeToCurrentTau)*t.*exp(-t / ICMSOspikeToCurrentTau); | |
379 % show alpha function | |
380 % figure(84), subplot(4,2,5), plot(t,ICMSOalphaFunction) | |
381 % title(['IC MSO LP cutoff ' num2str(ICMSOdendriteLPfreq)]) | |
382 | |
383 % post-dendritic current | |
384 for i=1:nICMSOcells | |
385 x= conv2(1*ICMSOspikes(i,:), ICMSOalphaFunction); | |
386 inputCurrent(i,:)=x(1:nEpochs); | |
387 end | |
388 | |
389 if ICMSO_c==0 | |
390 % faster computation when threshold is stable (c==0) | |
391 for t=1:nEpochs | |
392 s=ICMSO_E>ICMSO_Th0; | |
393 dE = (-ICMSO_E/ICMSO_tauM + inputCurrent(:,t)/ICMSO_cap +... | |
394 (ICMSO_Gk/ICMSO_cap).*(ICMSO_Ek-ICMSO_E))*dtSpikes; | |
395 dGk=-ICMSO_Gk*dtSpikes/ICMSO_tauGk +ICMSO_b*s; | |
396 ICMSO_E=ICMSO_E+dE; | |
397 ICMSO_Gk=ICMSO_Gk+dGk; | |
398 ICMSOmembranePotential(:,t)=ICMSO_E+s.*(ICMSO_Eb-ICMSO_E)+ICMSO_Er; | |
399 end | |
400 else | |
401 % threshold is changing (ICMSO_c>0; e.g. bushy cell) | |
402 for t=1:nEpochs | |
403 dE = (-ICMSO_E/ICMSO_tauM + ... | |
404 inputCurrent(:,t)/ICMSO_cap + (ICMSO_Gk/ICMSO_cap)... | |
405 .*(ICMSO_Ek-ICMSO_E))*dtSpikes; | |
406 ICMSO_E=ICMSO_E+dE; | |
407 s=ICMSO_E>ICMSO_Th; | |
408 ICMSOmembranePotential(:,t)=ICMSO_E+s.*(ICMSO_Eb-ICMSO_E)+ICMSO_Er; | |
409 dGk=-ICMSO_Gk*dtSpikes/ICMSO_tauGk +ICMSO_b*s; | |
410 ICMSO_Gk=ICMSO_Gk+dGk; | |
411 | |
412 % After a spike, the threshold is raised | |
413 % otherwise it settles to its baseline | |
414 dTh=-(ICMSO_Th-ICMSO_Th0)*dtSpikes/ICMSO_tauTh +s*ICMSO_c; | |
415 ICMSO_Th=ICMSO_Th+dTh; | |
416 end | |
417 end | |
418 | |
419 t=dtSpikes:dtSpikes:dtSpikes*length(ICMSOmembranePotential); | |
420 figure(98),subplot(4,2,7) | |
421 plot(t, ICMSOmembranePotential) | |
422 ylim([-0.07 0]), xlim([0 max(t)]) | |
423 title('IC (V)') | |
424 | |
425 ICMSOspikes=ICMSOmembranePotential> -0.01; | |
426 % now remove any spike that is immediately followed by a spike | |
427 % NB 'find' works on columns (whence the transposing) | |
428 ICMSOspikes=ICMSOspikes'; | |
429 idx=find(ICMSOspikes); | |
430 idx=idx(1:end-1); | |
431 ICMSOspikes(idx+1)=0; | |
432 ICMSOspikes=ICMSOspikes'; | |
433 |