Python交叉相关

Sim*_*mon 6 python matlab signals correlation

我有一对1D数组(不同长度),如下所示:

data1 = [0,0,0,1,1,1,0,1,0,0,1]
data2 = [0,1,1,0,1,0,0,1]
Run Code Online (Sandbox Code Playgroud)

我想获得python中2系列的最大互相关.在matlab中,xcorr()函数将返回OK

我尝试了以下两种方法:

  1. numpy.correlate(data1, data2)
  2. signal.fftconvolve(data2, data1[::-1], mode='full')

这两种方法都给了我相同的值,但是我从python获得的值与matlab的值不同.Python给出了整数值> 1,而matlab给出了0到1之间的实际相关值.

我已经尝试首先对2个数组进行标准化(值均值/标准差),但我得到的互相关值是数以千计,似乎不正确.

Matlab还会给出一个交叉相关性最大的滞后值.我假设使用索引很容易做到这一点,但如果我的数组包含数以万计的数值,那么最合适的方法是什么呢?

我想模仿xcorr(matlab的功能,有关如何在python中做到这一点的任何想法?

Che*_*eku 8

numpy.correlate(arr1,arr2,"full")
Run Code Online (Sandbox Code Playgroud)

给了我相同的输出

xcorr(arr1,arr2)
Run Code Online (Sandbox Code Playgroud)

在matlab中给出

  • 你如何摆脱这种时间延迟? (2认同)
  • 将“完整”添加到 numpy.correlate() 可以解决问题。为了获得最大时滞,我只是在从 correlate() 返回时调用 argmax() (2认同)

cod*_*nio 5

MATLAB xcorr(x,y)的实现以及结果与示例的比较。

import scipy.signal as signal
def xcorr(x,y):
    """
    Perform Cross-Correlation on x and y
    x    : 1st signal
    y    : 2nd signal

    returns
    lags : lags of correlation
    corr : coefficients of correlation
    """
    corr = signal.correlate(x, y, mode="full")
    lags = signal.correlation_lags(len(x), len(y), mode="full")
    return lags, corr

n = np.array([i for i in range(0,15)])
x = 0.84**n
y = np.roll(x,5);
lags,c = xcorr(x,y);
plt.figure()
plt.stem(lags,c)
plt.show()
Run Code Online (Sandbox Code Playgroud)

输出类似于 matlab xcorr 输出