循环互相关 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))
是否可以使用 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))