rmeddis@30: function test_MAP1_14x rmeddis@30: % 'x' is a trial file rmeddis@30: % test_MAP1_14 is a general purpose test routine that can be adjusted to rmeddis@30: % test a number of different applications of MAP1_14 rmeddis@30: % rmeddis@30: % A range of options are supplied in the early part of the program rmeddis@30: % rmeddis@30: % One use of the function is to create demonstrations; filenames rmeddis@30: % to illustrate particular features rmeddis@30: % rmeddis@30: % #1 rmeddis@30: % Identify the file (in 'MAPparamsName') containing the model parameters rmeddis@30: % rmeddis@30: % #2 rmeddis@30: % Identify the kind of model required (in 'AN_spikesOrProbability'). rmeddis@30: % A full brainstem model (spikes) can be computed or a shorter model rmeddis@30: % (probability) that computes only so far as the auditory nerve rmeddis@30: % rmeddis@30: % #3 rmeddis@30: % Choose between a tone signal or file input (in 'signalType') rmeddis@30: % rmeddis@30: % #4 rmeddis@30: % Set the signal rms level (in leveldBSPL) rmeddis@30: % rmeddis@30: % #5 rmeddis@30: % Identify the channels in terms of their best frequencies in the vector rmeddis@30: % BFlist. rmeddis@30: % rmeddis@30: % Last minute changes to the parameters fetched earlier can be made using rmeddis@30: % the cell array of strings 'paramChanges'. rmeddis@30: % Each string must have the same format as the corresponding line in the rmeddis@30: % file identified in 'MAPparamsName' rmeddis@30: % rmeddis@30: % When the demonstration is satisfactory, freeze it by renaming it rmeddis@30: rmeddis@30: dbstop if error rmeddis@30: restorePath=path; rmeddis@30: addpath (['..' filesep 'MAP'], ['..' filesep 'wavFileStore'], ... rmeddis@30: ['..' filesep 'utilities']) rmeddis@30: rmeddis@30: %% #1 parameter file name rmeddis@30: MAPparamsName='NormalIC'; rmeddis@30: rmeddis@30: rmeddis@30: %% #2 probability (fast) or spikes (slow) representation rmeddis@30: AN_spikesOrProbability='spikes'; rmeddis@30: rmeddis@30: % or rmeddis@30: % NB probabilities are not corrected for refractory effects rmeddis@30: % AN_spikesOrProbability='probability'; rmeddis@30: rmeddis@30: rmeddis@30: %% #3 pure tone, harmonic sequence or speech file input rmeddis@30: signalType= 'tones'; rmeddis@30: sampleRate= 50000; rmeddis@30: duration=0.250; % seconds rmeddis@30: toneFrequency= 250:250:8000; % harmonic sequence (Hz) rmeddis@30: % toneFrequency= 1000; % or a pure tone (Hz8 rmeddis@30: rampDuration=.005; % seconds rmeddis@30: rmeddis@30: % or rmeddis@30: rmeddis@30: % signalType= 'file'; rmeddis@30: % fileName='twister_44kHz'; rmeddis@30: rmeddis@30: rmeddis@30: %% #4 rms level rmeddis@30: % signal details rmeddis@30: leveldBSPL= 30; % dB SPL rmeddis@30: rmeddis@30: rmeddis@30: %% #5 number of channels in the model rmeddis@30: % 21-channel model (log spacing) rmeddis@30: numChannels=21; rmeddis@30: lowestBF=250; highestBF= 8000; rmeddis@30: BFlist=round(logspace(log10(lowestBF), log10(highestBF), numChannels)); rmeddis@30: rmeddis@30: % or specify your own channel BFs rmeddis@30: % numChannels=1; rmeddis@30: % BFlist=toneFrequency; rmeddis@30: rmeddis@30: rmeddis@30: %% #6 change model parameters rmeddis@30: paramChanges=[]; rmeddis@30: rmeddis@30: % or rmeddis@30: % Parameter changes can be used to change one or more model parameters rmeddis@30: % *after* the MAPparams file has been read rmeddis@30: % This example declares only one fiber type with a calcium clearance time rmeddis@30: % constant of 80e-6 s (HSR fiber) when the probability option is selected. rmeddis@30: rmeddis@30: % paramChanges={'AN_IHCsynapseParams.ANspeedUpFactor=5;', ... rmeddis@30: % 'IHCpreSynapseParams.tauCa=86e-6;'}; rmeddis@30: rmeddis@30: % paramChanges={'DRNLParams.rateToAttenuationFactorProb = 0;'}; rmeddis@30: rmeddis@30: % paramChanges={'IHCpreSynapseParams.tauCa=86e-6;', rmeddis@30: % 'AN_IHCsynapseParams.numFibers= 1000;'}; rmeddis@30: rmeddis@30: % fixed MOC attenuation(using negative factor) rmeddis@30: paramChanges={'DRNLParams.rateToAttenuationFactorProb=-0.005;'}; rmeddis@30: rmeddis@30: %% delare 'showMap' options to control graphical output rmeddis@30: rmeddis@30: showMapOptions.printModelParameters=1; % prints all parameters rmeddis@30: showMapOptions.showModelOutput=1; % plot of all stages rmeddis@30: showMapOptions.printFiringRates=1; % prints stage activity levels rmeddis@30: showMapOptions.showACF=0; % shows SACF (probability only) rmeddis@30: showMapOptions.showEfferent=1; % tracks of AR and MOC rmeddis@30: showMapOptions.surfProbability=1; % 2D plot of HSR response rmeddis@30: showMapOptions.surfSpikes=1; % 2D plot of spikes histogram rmeddis@30: rmeddis@30: % disable certain silly options rmeddis@30: if strcmp(AN_spikesOrProbability, 'spikes') rmeddis@30: % avoid nonsensical options rmeddis@30: showMapOptions.surfProbability=0; rmeddis@30: showMapOptions.showACF=0; rmeddis@30: else rmeddis@30: showMapOptions.surfSpikes=0; rmeddis@30: end rmeddis@30: if strcmp(signalType, 'file') rmeddis@30: % needed for labeling plot rmeddis@30: showMapOptions.fileName=fileName; rmeddis@30: else rmeddis@30: showMapOptions.fileName=[]; rmeddis@30: end rmeddis@30: rmeddis@30: %% Generate stimuli rmeddis@30: rmeddis@30: switch signalType rmeddis@30: case 'tones' rmeddis@30: inputSignal=createMultiTone(sampleRate, toneFrequency, ... rmeddis@30: leveldBSPL, duration, rampDuration); rmeddis@30: rmeddis@30: case 'file' rmeddis@30: %% file input simple or mixed rmeddis@30: [inputSignal sampleRate]=wavread(fileName); rmeddis@30: dt=1/sampleRate; rmeddis@30: inputSignal=inputSignal(:,1); rmeddis@30: targetRMS=20e-6*10^(leveldBSPL/20); rmeddis@30: rms=(mean(inputSignal.^2))^0.5; rmeddis@30: amp=targetRMS/rms; rmeddis@30: inputSignal=inputSignal*amp; rmeddis@30: silence= zeros(1,round(0.1/dt)); rmeddis@30: inputSignal= [silence inputSignal' silence]; rmeddis@30: end rmeddis@30: rmeddis@30: rmeddis@30: %% run the model rmeddis@30: tic rmeddis@30: rmeddis@30: fprintf('\n') rmeddis@30: disp(['Signal duration= ' num2str(length(inputSignal)/sampleRate)]) rmeddis@30: disp([num2str(numChannels) ' channel model']) rmeddis@30: disp('Computing ...') rmeddis@30: rmeddis@30: MAP1_14(inputSignal, sampleRate, BFlist, ... rmeddis@30: MAPparamsName, AN_spikesOrProbability, paramChanges); rmeddis@30: rmeddis@30: rmeddis@30: % the model run is now complete. Now display the results rmeddis@30: UTIL_showMAP(showMapOptions, paramChanges) rmeddis@30: rmeddis@30: toc rmeddis@30: path(restorePath) rmeddis@30: rmeddis@30: rmeddis@30: function inputSignal=createMultiTone(sampleRate, toneFrequency, ... rmeddis@30: leveldBSPL, duration, rampDuration) rmeddis@30: % Create pure tone stimulus rmeddis@30: dt=1/sampleRate; % seconds rmeddis@30: time=dt: dt: duration; rmeddis@30: inputSignal=sum(sin(2*pi*toneFrequency'*time), 1); rmeddis@30: amp=10^(leveldBSPL/20)*28e-6; % converts to Pascals (peak) rmeddis@30: inputSignal=amp*inputSignal; rmeddis@30: rmeddis@30: % apply ramps rmeddis@30: % catch rampTime error rmeddis@30: if rampDuration>0.5*duration, rampDuration=duration/2; end rmeddis@30: rampTime=dt:dt:rampDuration; rmeddis@30: ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ... rmeddis@30: ones(1,length(time)-length(rampTime))]; rmeddis@30: inputSignal=inputSignal.*ramp; rmeddis@30: ramp=fliplr(ramp); rmeddis@30: inputSignal=inputSignal.*ramp; rmeddis@30: rmeddis@30: % add 10 ms silence rmeddis@30: silence= zeros(1,round(0.05/dt)); rmeddis@30: inputSignal= [silence inputSignal silence]; rmeddis@30: