Python规范化一维互相关

Python规范化一维互相关,python,matlab,signal-processing,normalization,correlation,Python,Matlab,Signal Processing,Normalization,Correlation,我编写了一些Python代码来模拟MATLABsxcorr函数的交叉相关性: 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

我编写了一些Python代码来模拟MATLABs
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界限

我试过几件事:

  • corr/=max(corr)
    添加到我的函数末尾,以规范化
    corr
    ,无论选择了哪个比例选项。这会保持上界在检查中,但我不确定这是否正确处理下界
  • corr/=np.sqrt(np.dot(x,x)*np.dot(y,y))
    添加到所有选项的函数末尾,但这似乎将我的值挤压到远离1.0的地方

  • 规范化
    有偏
    无偏
    缩放选项的正确方法是什么?MATLAB没有这方面的功能,Google也没有为有偏/无偏互相关估计的标准化提供任何结果。

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

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

    我很困惑<代码>无表示无标准化,
    有偏
    无偏
    表示适当的标准化,因此输出样本对应于适当的估计值。“我应该对有偏差的相关性估计应用什么标准化,使其限定在[-1,1]”这一点是没有意义的,因为这样估计就不再是有偏差的估计了,它将是其他的东西。唯一具有此特性的估计器(在这组估计器中)是相关系数(的信号处理变量),它是
    coeff
    所对应的

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