如何找到一维数组/向量的自相关矩阵

问题描述

我有一个大小为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]),其中每个元素都是实值随机变量,自相关矩阵是一个NxN个对称矩阵R_XX,第(i,j)个元素是

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

,E [⋅]表示expectation

要合理地估计自相关矩阵,您需要对随机向量X进行多次观察以估计期望值。但这听起来好像只有一个1D数组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是无限大的信号。实际上,对于有限长度的信号,必须在信号边缘进行一些处理,但我会对此加以介绍。等价于变量m = i + n的变化

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

,其中i和j仅在右侧以差(j-i)的形式出现。因此,这种自相关通常以“滞后” k = j-i,

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

请注意,这将导致一维数组而不是矩阵。您可以使用Python中的scipy.signal.correlate(x,x)或Matlab中的xcorr(x,x)进行计算。再次,我将讨论信号边缘的边界处理注意事项。请点击以下链接以了解这些实现提供的选项。

您可以通过以下方式将一维相关数组R_xx [k]与矩阵R_XX [i,j]相关联

R_XX[i,j] ~= R_xx[j - i]

就像你说的是Toeplitz。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...