【问题标题】:Python normalizing 1D cross correlationPython标准化一维互相关
【发布时间】:2017-09-24 23:04:14
【问题描述】:

我编写了一些 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 也没有为有偏/无偏互相关估计的归一化提供任何结果。

【问题讨论】:

    标签: python matlab signal-processing normalization correlation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      以下内容应该可以满足您的需求,但我不确定它在统计上是否有效:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-28
        • 2021-11-15
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        • 2017-07-31
        相关资源
        最近更新 更多