圆形互相关python

时间:2015-02-02 18:25:25

标签: python numpy matplotlib scipy signal-processing

是否可以在具有numpy / scipy / matplotlib功能的1D阵列上执行循环交叉/自相关?我看过numpy.correlate()和matplotlib.pyplot.xcorr(基于numpy函数),两者似乎都无法进行循环互相关。

为了说明不同之处,我将使用[1,2,3,4]数组的示例。通过循环相关,进行周期性假设,滞后1看起来像[2,3,4,1]。我发现的python函数似乎只使用零填充,即[2,3,4,0]。有没有办法让这些函数进行循环关联?如果没有,是否有循环关联的标准解决方法?

2 个答案:

答案 0 :(得分:10)

您可以使用FFT实现定期(a.k.a.圆形)互相关:

from numpy.fft import fft, ifft

def periodic_corr(x, y):
    """Periodic correlation, implemented using the FFT.

    x and y must be real sequences with the same length.
    """
    return ifft(fft(x) * fft(y).conj()).real

如果你不介意np.hstack((y[1:], y))产生的开销,你也可以使用np.correlate来实现它:

import numpy as np

def periodic_corr_np(x, y):
    """Periodic correlation, implemented using np.correlate.

    x and y must be real sequences with the same length.
    """
    return np.correlate(x, np.hstack((y[1:], y)), mode='valid')

答案 1 :(得分:2)

from numpy import roll, correlate
x = [1,2,3,4] 
roll(x, 1) #[4,1,2,3]
roll(x, 2) #[3,4,1,2]
roll(x, 3) #[2,3,4,1]

要将x与循环移位k的x相关联,您可以

k = 2
correlate(x, roll(x,k))