Mercurial > hg > map
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userProgramsTim/runningACF.m Mon Nov 28 13:34:28 2011 +0000 @@ -0,0 +1,97 @@ +function sampledacf = runningACF(inputSignalMatrix, sfreq, params) +% runningACF computes within-channel, running autocorrelations (acfs) +% and samples it at given time steps +% +% INPUT +% inputSignalMatrix: a matrix (channel x time) of AN activity +% sfreq: sampling frequency +% +% params: a list of parmeters to guide the computation: +% params.lags: an array of lags to be computed (seconds) +% params.acfTau: time constant (sec) of the running acf calculations +% +% +% +% OUTPUT +% sampledacf: (time x lags) + +%% +boundaryValue=[]; +[nChannels inputLength]= size(inputSignalMatrix); +% list of BFs must be repeated is many fiber types used +%BFlist=method.nonlinCF; +%nfibertypes=nChannels/length(BFlist); +%BFlist=repmat(BFlist',2,1)'; + +dt=1/sfreq; + +samplelength=0.003; %sample length in ms +gridpoints=round([samplelength:samplelength:inputLength*dt]/dt); +gridpoints=[1 gridpoints]; + +lags=params.lags; + +nLags=length(lags); + + +% Establish matrix of lag time constants +% these are all the same if tau<1 + +if params.acfTau<1 % all taus are the same + acfTaus=repmat(params.acfTau, 1, nLags); + acfDecayFactors=ones(size(lags)).*exp(-dt/params.acfTau); +else + error('acfTau must be <1'); +end +% make acfDecayFactors into a (channels x lags) matrix for speedy computation +acfDecayFactors=repmat(acfDecayFactors,nChannels, 1); + +% P function lowpass filter decay (only one value needed) +%pDecayFactor=exp(-dt/params.lambda); + +% ACF +% lagPointers is a list of pointers relative to 'time now' +lagPointers=round(lags/dt); +lagWeights=ones(nChannels,nLags); +if max(lagPointers)+1>inputLength + error([' filteredSACF: not enough signal to evaluate ACF. Max(lag)= ' num2str(max(lags))]) +end + + + + acf=zeros(nChannels,nLags); + sampledacf = zeros(length(gridpoints),nChannels,nLags); + % create a runup buffer of signal + buffer= zeros(nChannels, max(lagPointers)); + +inputSignalMatrix=[buffer inputSignalMatrix]; +[nChannels inputLength]= size(inputSignalMatrix); + +timeCounter=0; biggestSACF=0; +gridcounter =1; +for timePointer= max(lagPointers)+1:inputLength + % acf is a continuously changing channels x lags matrix + % Only the current value is stored + % sacf is the vertical summary of acf ( a vector) and all values are kept and returned + % P is the smoothed version of sacf and all values are kept and returned + % lagWeights emphasise some BF/lag combinations and ignore others + % NB time now begins at the longest lag. + % E.g. if max(lags) is .04 then this is when the ACf will begin. + % AN AN delayed weights filtering + + % This is the ACF calculation + timeCounter=timeCounter+1; + acf = (repmat(inputSignalMatrix(:, timePointer), 1, nLags) .* inputSignalMatrix(:, timePointer-lagPointers)).*lagWeights *dt + acf.* acfDecayFactors; + + %just sample on certain samplepoints + if ~isempty(find(timeCounter==gridpoints)) + sampledacf(gridcounter,:,:)=acf; + gridcounter = gridcounter+1; + end + + end +end + + + +