循环互相关 python

circular cross correlation python

是否可以使用 numpy/scipy/matplotlib 函数在一维数组上执行循环 cross-/auto-correlation?我看过 numpy.correlate() 和 matplotlib.pyplot.xcorr(基于 numpy 函数),两者似乎都无法进行循环互相关。

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

您可以使用 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')
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))