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
|