annotate userProgramsTim/runningACF.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
rev   line source
rmeddis@38 1 function sampledacf = runningACF(inputSignalMatrix, sfreq, params)
rmeddis@38 2 % runningACF computes within-channel, running autocorrelations (acfs)
rmeddis@38 3 % and samples it at given time steps
rmeddis@38 4 %
rmeddis@38 5 % INPUT
rmeddis@38 6 % inputSignalMatrix: a matrix (channel x time) of AN activity
rmeddis@38 7 % sfreq: sampling frequency
rmeddis@38 8 %
rmeddis@38 9 % params: a list of parmeters to guide the computation:
rmeddis@38 10 % params.lags: an array of lags to be computed (seconds)
rmeddis@38 11 % params.acfTau: time constant (sec) of the running acf calculations
rmeddis@38 12 %
rmeddis@38 13 %
rmeddis@38 14 %
rmeddis@38 15 % OUTPUT
rmeddis@38 16 % sampledacf: (time x lags)
rmeddis@38 17
rmeddis@38 18 %%
rmeddis@38 19 boundaryValue=[];
rmeddis@38 20 [nChannels inputLength]= size(inputSignalMatrix);
rmeddis@38 21 % list of BFs must be repeated is many fiber types used
rmeddis@38 22 %BFlist=method.nonlinCF;
rmeddis@38 23 %nfibertypes=nChannels/length(BFlist);
rmeddis@38 24 %BFlist=repmat(BFlist',2,1)';
rmeddis@38 25
rmeddis@38 26 dt=1/sfreq;
rmeddis@38 27
rmeddis@38 28 samplelength=0.003; %sample length in ms
rmeddis@38 29 gridpoints=round([samplelength:samplelength:inputLength*dt]/dt);
rmeddis@38 30 gridpoints=[1 gridpoints];
rmeddis@38 31
rmeddis@38 32 lags=params.lags;
rmeddis@38 33
rmeddis@38 34 nLags=length(lags);
rmeddis@38 35
rmeddis@38 36
rmeddis@38 37 % Establish matrix of lag time constants
rmeddis@38 38 % these are all the same if tau<1
rmeddis@38 39
rmeddis@38 40 if params.acfTau<1 % all taus are the same
rmeddis@38 41 acfTaus=repmat(params.acfTau, 1, nLags);
rmeddis@38 42 acfDecayFactors=ones(size(lags)).*exp(-dt/params.acfTau);
rmeddis@38 43 else
rmeddis@38 44 error('acfTau must be <1');
rmeddis@38 45 end
rmeddis@38 46 % make acfDecayFactors into a (channels x lags) matrix for speedy computation
rmeddis@38 47 acfDecayFactors=repmat(acfDecayFactors,nChannels, 1);
rmeddis@38 48
rmeddis@38 49 % P function lowpass filter decay (only one value needed)
rmeddis@38 50 %pDecayFactor=exp(-dt/params.lambda);
rmeddis@38 51
rmeddis@38 52 % ACF
rmeddis@38 53 % lagPointers is a list of pointers relative to 'time now'
rmeddis@38 54 lagPointers=round(lags/dt);
rmeddis@38 55 lagWeights=ones(nChannels,nLags);
rmeddis@38 56 if max(lagPointers)+1>inputLength
rmeddis@38 57 error([' filteredSACF: not enough signal to evaluate ACF. Max(lag)= ' num2str(max(lags))])
rmeddis@38 58 end
rmeddis@38 59
rmeddis@38 60
rmeddis@38 61
rmeddis@38 62 acf=zeros(nChannels,nLags);
rmeddis@38 63 sampledacf = zeros(length(gridpoints),nChannels,nLags);
rmeddis@38 64 % create a runup buffer of signal
rmeddis@38 65 buffer= zeros(nChannels, max(lagPointers));
rmeddis@38 66
rmeddis@38 67 inputSignalMatrix=[buffer inputSignalMatrix];
rmeddis@38 68 [nChannels inputLength]= size(inputSignalMatrix);
rmeddis@38 69
rmeddis@38 70 timeCounter=0; biggestSACF=0;
rmeddis@38 71 gridcounter =1;
rmeddis@38 72 for timePointer= max(lagPointers)+1:inputLength
rmeddis@38 73 % acf is a continuously changing channels x lags matrix
rmeddis@38 74 % Only the current value is stored
rmeddis@38 75 % sacf is the vertical summary of acf ( a vector) and all values are kept and returned
rmeddis@38 76 % P is the smoothed version of sacf and all values are kept and returned
rmeddis@38 77 % lagWeights emphasise some BF/lag combinations and ignore others
rmeddis@38 78 % NB time now begins at the longest lag.
rmeddis@38 79 % E.g. if max(lags) is .04 then this is when the ACf will begin.
rmeddis@38 80 % AN AN delayed weights filtering
rmeddis@38 81
rmeddis@38 82 % This is the ACF calculation
rmeddis@38 83 timeCounter=timeCounter+1;
rmeddis@38 84 acf = (repmat(inputSignalMatrix(:, timePointer), 1, nLags) .* inputSignalMatrix(:, timePointer-lagPointers)).*lagWeights *dt + acf.* acfDecayFactors;
rmeddis@38 85
rmeddis@38 86 %just sample on certain samplepoints
rmeddis@38 87 if ~isempty(find(timeCounter==gridpoints))
rmeddis@38 88 sampledacf(gridcounter,:,:)=acf;
rmeddis@38 89 gridcounter = gridcounter+1;
rmeddis@38 90 end
rmeddis@38 91
rmeddis@38 92 end
rmeddis@38 93 end
rmeddis@38 94
rmeddis@38 95
rmeddis@38 96
rmeddis@38 97