Python交叉相关

时间:2014-09-14 06:54:38

标签: 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]

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

我尝试了以下两种方法:

  1. numpy.correlate(data1, data2)
  2. signal.fftconvolve(data2, data1[::-1], mode='full')
  3. 两种方法都给我相同的值,但是我从python获得的值与matlab中的值不同。 Python给了我整数值> 1,而matlab给出的实际相关值介于0和1之间。

    我首先尝试对2个数组进行规范化(值均值/ SD),但我得到的互相关数值是数以千计看起来不正确。

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

    我想模仿matlab有的xcorr()函数,有关如何在python中做到这一点的想法吗?

3 个答案:

答案 0 :(得分:7)

numpy.correlate(arr1,arr2,"full")

给了我与

相同的输出
xcorr(arr1,arr2)

在matlab中给出

答案 1 :(得分:1)

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()

output resembling matlab xcorr output

答案 2 :(得分:0)

此代码将有助于查找音频文件中两个通道之间的延迟

xin, fs = sf.read('recording1.wav')
frame_len = int(fs*5*1e-3)
dim_x =xin.shape
M = dim_x[0] # No. of rows
N= dim_x[1] # No. of col
sample_lim = frame_len*100
tau = [0]
M_lim = 20000 # for testing as processing takes time
for i in range(1,N):
    c = np.correlate(xin[0:M_lim,0],xin[0:M_lim,i],"full")
    maxlags = M_lim-1
    c = c[M_lim -1 -maxlags: M_lim + maxlags]
    Rmax_pos = np.argmax(c)
    pos = Rmax_pos-M_lim+1
    tau.append(pos)
print(tau)