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