def estimate_time_constant(Y, sn, p = None, lags = 5, include_noise = False, pixels = None):
"""
Estimating global time constants for the dataset Y through the autocovariance function (optional).
The function is no longer used in the standard setting of the algorithm since every trace has its own
time constant.
Inputs:
Y: np.ndarray (2D)
input movie data with time in the last axis
p: positive integer
order of AR process, default: 2
lags: positive integer
number of lags in the past to consider for determining time constants. Default 5
include_noise: Boolean
Flag to include pre-estimated noise value when determining time constants. Default: False
pixels: np.ndarray
Restrict estimation to these pixels (e.g., remove saturated pixels). Default: All pixels
Output:
g: np.ndarray (p x 1)
Discrete time constants
"""
if p is None:
raise Exception("You need to define p")
if pixels is None:
pixels = np.arange(np.size(Y)/np.shape(Y)[-1])
from scipy.linalg import toeplitz
npx = len(pixels)
g = 0
lags += p
XC = np.zeros((npx,2*lags+1))
for j in range(npx):
XC[j,:] = np.squeeze(axcov(np.squeeze(Y[pixels[j],:]),lags))
gv = np.zeros(npx*lags)
if not include_noise:
XC = XC[:,np.arange(lags-1,-1,-1)]
lags -= p
A = np.zeros((npx*lags,p))
for i in range(npx):
if not include_noise:
A[i*lags+np.arange(lags),:] = toeplitz(np.squeeze(XC[i,np.arange(p-1,p+lags-1)]),np.squeeze(XC[i,np.arange(p-1,-1,-1)]))
else:
A[i*lags+np.arange(lags),:] = toeplitz(np.squeeze(XC[i,lags+np.arange(lags)]),np.squeeze(XC[i,lags+np.arange(p)])) - (sn[i]**2)*np.eye(lags,p)
gv[i*lags+np.arange(lags)] = np.squeeze(XC[i,lags+1:])
if not include_noise:
gv = XC[:,p:].T
gv = np.squeeze(np.reshape(gv,(np.size(gv),1),order='F'))
g = np.dot(np.linalg.pinv(A),gv)
return g
评论列表
文章目录