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 / userProgramsMathiasDietz / test_binaural.m @ 38:c2204b18f4a2

History | View | Annotate | Download (14.1 KB)

1 38:c2204b18f4a2 rmeddis
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';