如何找到一维的自相关矩阵 array/vector

How to find the Autocoorelation Matrix of a 1D array/vector

我有一个大小为 n 的一维数组,代表时域中的一个信号,我需要使用 python 找到这个信号的自相关矩阵,然后我将计算这个信号的特征向量和特征值矩阵.

我试过的是使用 scipy.linalg 中的 Toeplitz 方法,如下所示

res = scipy.linalg.toeplitz(c=np.asarray(signal),r=np.asarray(signal))
eigenValues,eigenVectors = numpy.linalg.eig(res)

我不确定这是否正确,因为在 Matlab 论坛上我看到了一个完全不同的解决方案 Matlab solution

关于相关性的术语令人困惑,所以让我仔细定义您想要计算的内容。

随机信号的自相关矩阵

"Autocorrelation matrix"通常理解为随机向量的表征:对于一个随机向量(X[1], ..., X[N]) 其中每个元素都是real-valued随机变量,自相关矩阵是一个 NxN 对称矩阵 R_XX 其第 (i,j) 个元素是

R_XX[i,j] = E[X[i] ⋅ X[j]]

和E[⋅]表示expectation.

要合理估计自相关矩阵,您需要对随机向量 X 进行多次观察以估计期望值。但听起来你只有一个一维数组 x。如果我们仍然应用上述公式,期望会简化为

R_XX[i,j] = E[X[i] ⋅ X[j]] ~= x[i] ⋅ x[j].

换句话说,矩阵退化为外积 np.outer(x, x),一个具有一个非零特征值的秩为 1 的矩阵。但这是对 R_XX 的糟糕估计,并没有揭示有关信号的新见解。

WSS 信号的自相关

在信号处理中,一个常见的建模假设是信号是"wide-sense-stationary or WSS",这意味着信号的任何时间偏移都具有相同的统计数据。这个假设特别使得上面的期望可以从对信号的单次观察中估计出来:

R_XX[i,j] = E[X[i] ⋅ X[j]] ~= sum_n (x[i + n] ⋅ x[j + n])

其中 n 的总和是所有样本的总和。为简单起见,在此描述中假设 x 是一个无限持续的信号。在 finite-length 信号的实践中,必须在信号边缘做一些事情,但我会掩盖这一点。等价地通过变量 m = i + n 的变化我们有

R_XX[i,j] = E[X[i] ⋅ X[j]] ~= sum_m (x[m] ⋅ x[j - i + m]),

i 和 j 仅在 right-hand 侧一起作为差值 (j - i) 出现。因此,这种自相关通常根据“滞后”k = j - i,

进行索引
R_xx[k] = sum_m (x[m] ⋅ x[j - i + m]).

请注意,这会生成一维数组而不是矩阵。例如,您可以在 Matlab 中使用 scipy.signal.correlate(x, x) in Python or xcorr(x, x) 来计算它。同样,我忽略了信号边缘的边界处理注意事项。请点击这些链接阅读这些实现提供的选项。

您可以通过

将一维相关数组R_xx[k]与矩阵R_XX[i,j]相关联
R_XX[i,j] ~= R_xx[j - i]

你说的是托普利茨。