Python规范化一维交叉相关

时间:2017-04-27 08:45:47

标签: python matlab signal-processing normalization 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))

在比较不同比例类型的值与MATLABs实现时,我得到相同的值,所以这似乎是正确的

我想补充的另一件事是能够规范化互相关值,使峰值不超过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
  3. 规范化nonebiasedunbiased缩放选项的正确方法是什么? MATLAB没有这方面的功能,谷歌也没有提出任何有偏差/无偏差交叉相关估计标准化的结果。

2 个答案:

答案 0 :(得分:0)

以下内容应该按照您的要求进行,但我不确定它是否在统计上有效:

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

答案 1 :(得分:0)

我很困惑。 none表示没有规范化,biasedunbiased表示适当的规范化,因此输出的样本对应于适当的估算器。因为“我应该对相关的有偏估计应用什么规范化以使其与[-1,1]有界”是没有意义的,因为那时估计不再是偏差估计,它将是别的。具有此属性的唯一估计器(在此束中)是相关系数(Pearson’s coefficient的信号处理变体),这是coeff对应的。

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