rmeddis@35
|
1 function testBM (BFlist, paramsName,...
|
rmeddis@29
|
2 relativeFrequencies, AN_spikesOrProbability, paramChanges)
|
rmeddis@29
|
3 % testBM generates input output functions for DRNL model for any number
|
rmeddis@38
|
4 % of locations (BFlist).
|
rmeddis@38
|
5 % Each BF is evaluated using a single channel model
|
rmeddis@38
|
6 %
|
rmeddis@38
|
7 % Peak displacement as a function of pure tone level(peakAmp) is displayed
|
rmeddis@38
|
8 %
|
rmeddis@38
|
9 % If relative Frequencies is set to a range of values, tuning curves will
|
rmeddis@38
|
10 % be computed using these stimulus frequencie.
|
rmeddis@38
|
11 %
|
rmeddis@38
|
12 % If AN_spikesOrProbability is set to 'spikes' the full model is run (slow)
|
rmeddis@38
|
13 % otherwise efferent activity is based on AN pspiking probabilities.
|
rmeddis@29
|
14 %
|
rmeddis@34
|
15 % testBM (1000, 'Normal', 1, 'probability', [])
|
rmeddis@38
|
16 % for tuning curves at 6 locations:
|
rmeddis@38
|
17 % testBM ([250 500 1000 2000 4000 8000], 'Normal', [.5 .75 .9 1 1.1 1.25 1.5], 'probability', [])
|
rmeddis@29
|
18
|
rmeddis@29
|
19 global DRNLParams
|
rmeddis@29
|
20
|
rmeddis@35
|
21 if nargin<5, paramChanges=[]; end
|
rmeddis@35
|
22 if nargin<4, AN_spikesOrProbability='spikes'; end
|
rmeddis@35
|
23 if nargin==0, BFlist=1000; paramsName='Normal';
|
rmeddis@35
|
24 relativeFrequencies=1; end
|
rmeddis@29
|
25
|
rmeddis@29
|
26 savePath=path;
|
rmeddis@29
|
27 addpath (['..' filesep 'utilities'],['..' filesep 'MAP'])
|
rmeddis@38
|
28 tic
|
rmeddis@29
|
29
|
rmeddis@38
|
30 levels=-10:10:100; nLevels=length(levels);
|
rmeddis@29
|
31 % levels= 50; nLevels=length(levels);
|
rmeddis@29
|
32
|
rmeddis@29
|
33 % refBMdisplacement is the displacement of the BM at threshold
|
rmeddis@29
|
34 % 1 nm disp at threshold (9 kHz, Ruggero)
|
rmeddis@29
|
35 % ? adjust for frequency
|
rmeddis@29
|
36 refBMdisplacement= 1e-8; % adjusted for 10 nm at 1 kHz
|
rmeddis@29
|
37
|
rmeddis@35
|
38 toneDuration=.5;
|
rmeddis@35
|
39 % toneDuration=.050;
|
rmeddis@29
|
40 rampDuration=0.01;
|
rmeddis@29
|
41 silenceDuration=0.01;
|
rmeddis@29
|
42
|
rmeddis@29
|
43 sampleRate=30000;
|
rmeddis@29
|
44
|
rmeddis@29
|
45 dbstop if error
|
rmeddis@29
|
46 figure(3), clf
|
rmeddis@29
|
47 set(gcf,'position',[280 350 327 326])
|
rmeddis@29
|
48 set(gcf,'name','DRNL - BM')
|
rmeddis@29
|
49 pause(0.1)
|
rmeddis@29
|
50
|
rmeddis@29
|
51 finalSummary=[];
|
rmeddis@35
|
52 nBFs=length(BFlist);
|
rmeddis@29
|
53 BFno=0; plotCount=0;
|
rmeddis@35
|
54 for BF=BFlist
|
rmeddis@29
|
55 BFno=BFno+1;
|
rmeddis@29
|
56 plotCount=plotCount+nBFs;
|
rmeddis@29
|
57 stimulusFrequencies=BF* relativeFrequencies;
|
rmeddis@29
|
58 nFrequencies=length(stimulusFrequencies);
|
rmeddis@29
|
59
|
rmeddis@29
|
60 peakAmpBM=zeros(nLevels,nFrequencies);
|
rmeddis@29
|
61 peakAmpBMdB=NaN(nLevels,nFrequencies);
|
rmeddis@29
|
62 peakEfferent=NaN(nLevels,nFrequencies);
|
rmeddis@29
|
63 peakAREfferent=NaN(nLevels,nFrequencies);
|
rmeddis@29
|
64
|
rmeddis@29
|
65
|
rmeddis@29
|
66 levelNo=0;
|
rmeddis@29
|
67 for leveldB=levels
|
rmeddis@29
|
68 disp(['level= ' num2str(leveldB)])
|
rmeddis@29
|
69 levelNo=levelNo+1;
|
rmeddis@29
|
70
|
rmeddis@29
|
71 freqNo=0;
|
rmeddis@29
|
72 for frequency=stimulusFrequencies
|
rmeddis@29
|
73 freqNo=freqNo+1;
|
rmeddis@29
|
74
|
rmeddis@29
|
75 % Generate stimuli
|
rmeddis@29
|
76 globalStimParams.FS=sampleRate;
|
rmeddis@29
|
77 globalStimParams.overallDuration=...
|
rmeddis@29
|
78 toneDuration+silenceDuration; % s
|
rmeddis@29
|
79 stim.phases='sin';
|
rmeddis@29
|
80 stim.type='tone';
|
rmeddis@29
|
81 stim.toneDuration=toneDuration;
|
rmeddis@29
|
82 stim.frequencies=frequency;
|
rmeddis@29
|
83 stim.amplitudesdB=leveldB;
|
rmeddis@29
|
84 stim.beginSilence=silenceDuration;
|
rmeddis@29
|
85 stim.rampOnDur=rampDuration;
|
rmeddis@29
|
86 % no offset ramp
|
rmeddis@29
|
87 stim.rampOffDur=rampDuration;
|
rmeddis@29
|
88 doPlot=0;
|
rmeddis@29
|
89 inputSignal=stimulusCreate(globalStimParams, stim, doPlot);
|
rmeddis@29
|
90 inputSignal=inputSignal(:,1)';
|
rmeddis@29
|
91
|
rmeddis@29
|
92 %% run the model
|
rmeddis@29
|
93 MAPparamsName=paramsName;
|
rmeddis@29
|
94
|
rmeddis@29
|
95 global DRNLoutput MOCattenuation ARattenuation
|
rmeddis@29
|
96 MAP1_14(inputSignal, sampleRate, BF, ...
|
rmeddis@29
|
97 MAPparamsName, AN_spikesOrProbability, paramChanges);
|
rmeddis@29
|
98
|
rmeddis@29
|
99 DRNLresponse=DRNLoutput;
|
rmeddis@29
|
100 peakAmp=max(max(...
|
rmeddis@29
|
101 DRNLresponse(:, end-round(length(DRNLresponse)/2):end)));
|
rmeddis@29
|
102 peakAmpBM(levelNo,freqNo)=peakAmp;
|
rmeddis@29
|
103 peakAmpBMdB(levelNo,freqNo)=...
|
rmeddis@29
|
104 20*log10(peakAmp/refBMdisplacement);
|
rmeddis@29
|
105 peakEfferent(levelNo,freqNo)=min(min(MOCattenuation));
|
rmeddis@29
|
106 peakAREfferent(levelNo,freqNo)=min(min(ARattenuation));
|
rmeddis@29
|
107
|
rmeddis@29
|
108 end % tone frequency
|
rmeddis@29
|
109 end % level
|
rmeddis@29
|
110
|
rmeddis@29
|
111 %% analyses results and plot
|
rmeddis@33
|
112 if length(relativeFrequencies)>2
|
rmeddis@33
|
113 maxRows=3;
|
rmeddis@33
|
114 else
|
rmeddis@33
|
115 maxRows=2;
|
rmeddis@33
|
116 end
|
rmeddis@29
|
117
|
rmeddis@29
|
118 % BM I/O plot (top panel)
|
rmeddis@29
|
119 figure(3)
|
rmeddis@33
|
120 subplot(maxRows,nBFs,BFno), cla
|
rmeddis@29
|
121 plot(levels,peakAmpBMdB, 'linewidth',2)
|
rmeddis@29
|
122 hold on, plot(levels, repmat(refBMdisplacement,1,length(levels)))
|
rmeddis@29
|
123 hold off
|
rmeddis@29
|
124 title(['BF=' num2str(BF,'%5.0f') ' - ' paramsName])
|
rmeddis@29
|
125 xlabel('level')
|
rmeddis@29
|
126 % set(gca,'xtick',levels), grid on
|
rmeddis@29
|
127 if length(levels)>1,xlim([min(levels) max(levels)]), end
|
rmeddis@29
|
128 ylabel(['dB re:' num2str(refBMdisplacement,'%6.1e') 'm'])
|
rmeddis@29
|
129 ylim([-20 50])
|
rmeddis@29
|
130 set(gca,'ytick',[-10 0 10 20 40])
|
rmeddis@29
|
131 grid on
|
rmeddis@29
|
132 % legend({num2str(stimulusFrequencies')}, 'location', 'EastOutside')
|
rmeddis@38
|
133 UTIL_printTabTable([levels' peakAmpBMdB peakAmpBM*1e9], ...
|
rmeddis@29
|
134 num2str([0 stimulusFrequencies]','%5.0f'), '%5.0f')
|
rmeddis@29
|
135 finalSummary=[finalSummary peakAmpBMdB];
|
rmeddis@29
|
136
|
rmeddis@29
|
137 % Tuning curve
|
rmeddis@29
|
138 if length(relativeFrequencies)>2
|
rmeddis@33
|
139 figure(3), subplot(maxRows,nBFs, 2*nBFs+BFno)
|
rmeddis@38
|
140 contour(stimulusFrequencies,levels,peakAmpBM,...
|
rmeddis@38
|
141 [refBMdisplacement refBMdisplacement],'r','linewidth',4)
|
rmeddis@38
|
142 ylim([-10 40])
|
rmeddis@38
|
143
|
rmeddis@38
|
144 % contour(stimulusFrequencies,levels,peakAmpBM,...
|
rmeddis@38
|
145 % refBMdisplacement.*[1 5 10 50 100])
|
rmeddis@38
|
146 % ylim([-10 90])
|
rmeddis@38
|
147
|
rmeddis@29
|
148 title(['tuning curve at ' num2str(refBMdisplacement) 'm']);
|
rmeddis@29
|
149 ylabel('level (dB) at reference')
|
rmeddis@29
|
150 xlim([100 10000])
|
rmeddis@29
|
151 grid on
|
rmeddis@29
|
152 hold on
|
rmeddis@29
|
153 set(gca,'xscale','log')
|
rmeddis@29
|
154 end
|
rmeddis@29
|
155
|
rmeddis@29
|
156
|
rmeddis@29
|
157 % MOC contribution
|
rmeddis@29
|
158 figure(3)
|
rmeddis@33
|
159 subplot(maxRows,nBFs,nBFs+BFno), cla
|
rmeddis@29
|
160 plot(levels,20*log10(peakEfferent), 'linewidth',2)
|
rmeddis@38
|
161 ylabel('MOC (dB attenuation)'), xlabel('level (dB SPL)')
|
rmeddis@35
|
162 title(['MOC: (' AN_spikesOrProbability ') duration= ' ...
|
rmeddis@35
|
163 num2str(1000*toneDuration,'%5.0f') ' ms'])
|
rmeddis@29
|
164 grid on
|
rmeddis@29
|
165 if length(levels)>1, xlim([min(levels) max(levels)]), end
|
rmeddis@29
|
166
|
rmeddis@29
|
167 % AR contribution
|
rmeddis@29
|
168 hold on
|
rmeddis@29
|
169 plot(levels,20*log10(peakAREfferent), 'r')
|
rmeddis@29
|
170 hold off
|
rmeddis@29
|
171
|
rmeddis@29
|
172 end % best frequency
|
rmeddis@29
|
173
|
rmeddis@38
|
174
|
rmeddis@29
|
175 UTIL_showStructureSummary(DRNLParams, 'DRNLParams', 10)
|
rmeddis@29
|
176
|
rmeddis@29
|
177 UTIL_printTabTable([levels' finalSummary], ...
|
rmeddis@29
|
178 num2str([0 stimulusFrequencies]','%5.0f'), '%5.0f')
|
rmeddis@34
|
179 diff(finalSummary)
|
rmeddis@34
|
180 if ~isempty(paramChanges)
|
rmeddis@34
|
181 disp(paramChanges)
|
rmeddis@34
|
182 end
|
rmeddis@34
|
183
|
rmeddis@38
|
184 toc
|
rmeddis@29
|
185 path(savePath);
|