Python 归一化一维互相关

Python normalizing 1D cross correlation

我已经编写了一些 Python 代码来模拟 MATLAB xcorr 互相关函数:

def xcorr(x, y, scale='none'):
    # Pad shorter array if signals are different lengths
    if x.size > y.size:
        pad_amount = x.size - y.size
        y = np.append(y, np.repeat(0, pad_amount))
    elif y.size > x.size:
        pad_amount = y.size - x.size
        x = np.append(x, np.repeat(0, pad_amount))

    corr = np.correlate(x, y, mode='full')  # scale = 'none'
    lags = np.arange(-(x.size - 1), x.size)

    if scale == 'biased':
        corr = corr / x.size
    elif scale == 'unbiased':
        corr /= (x.size - abs(lags))
    elif scale == 'coeff':
        corr /= np.sqrt(np.dot(x, x) * np.dot(y, y))

将不同标度类型的值与 MATLAB 实现进行比较时,我得到了相同的值,所以这似乎是正确的

我想补充的另一件事是能够对互相关值进行归一化,因此峰值不会超过 1.0,并且谷值不会低于 -1.0

coeff 已经标准化,所以我不担心。但是,其他比例类型可以超过 -1/1 范围。

我已经尝试了几件事:

  1. 在我的函数末尾添加 corr /= max(corr) 以规范化 corr,无论选择哪个比例选项。这样可以检查上限,但我不确定这是否正确处理了下限
  2. corr /= np.sqrt(np.dot(x, x) * np.dot(y, y)) 添加到所有选项的函数末尾,但这似乎使我的值远离 1.0

标准化 nonebiasedunbiased 比例选项的正确方法是什么? MATLAB 没有这方面的功能,并且 Google 没有为 biased/unbiased 互相关估计的归一化提供任何结果。

以下内容应该符合您的要求,但我不确定它是否具有统计意义:

corr /= max(np.abs(corr))

我很困惑。 none 表示没有归一化,biasedunbiased 表示适当的归一化,因此输出样本对应于适当的估计量。 “我应该将什么归一化应用于相关性的有偏估计以使其限制为 [-1, 1]” 是没有意义的,因为这样估计就不再是有偏估计了,它会是别的东西。唯一具有此 属性 的估计器(在这群人中)是相关系数(Pearson’s coefficient 的信号处理变体),这就是 coeff 对应的。

这个实现就这样很好。任何在 [-1, 1] 区间内寻找数字的人都知道他们应该通过 np.corrcoef().

询问相关系数