使用numpy.correlate()的信号之间的时间延迟

时间:2017-07-22 12:25:30

标签: python numpy cross-correlation

我想在Python中使用互相关函数计算某些信号之间的时滞。从numpy文档numpy.correlate()来看,这个函数究竟是做什么的还不是很清楚。因此,我首先尝试使用两个简单的方波信号,其代码如下:

import matplotlib.pyplot as plt
import numpy as np

frequency=100

x = np.linspace(1,2000,frequency)
time = np.arange(x.size)
time = time/(1.0*frequency) #Time in seconds

def func1(x):
    x = np.where((x < 500) | (x > 531), 1, 2)
    return x
y1 = func1(x)

def func2(x):
    x = np.where((x < 600) | (x > 631), 1, 2)
    return x
y2 = func2(x)

def func3(x):
    x = np.where((x < 700) | (x > 731), 1, 2)
    return x
y3 = func3(x)

xcorr12 = np.correlate(y1,y2, "full")
xcorr13 = np.correlate(y1,y3, "full")

lag12 = np.argmax(xcorr12)
lag13 = np.argmax(xcorr13)

print ("lag12:",lag12/frequency)
print ("lag13:",lag13/frequency)

当我改变信号的位置时,我希望时间延迟改变,但事实并非如此!我不明白为什么我得到y1和y2之间的时滞等于1和y3之间的滞后!?

你能帮我理解发生了什么吗? 谢谢:)

1 个答案:

答案 0 :(得分:0)

我不确定y1和y2数组是否以您想要的方式计算

np.count_nonzero(y1)
20
np.count_nonzero(y2)
15

然后

xcorr = np.correlate(y1,y2, "full")
np.count_nonzero(xcorr)
34

对于几乎稀疏的矩阵(数组),滞后不会改变,你可以从信号处理和数学中知道这一点。 看看这个小例子

y1 = [1,2,3,4]
y2 = [1.0,0.5,1.0,2.0]

我们得到了

xcorr = np.correlate(y1,y2, "full")
array([  2. ,   5. ,   8.5,  13. ,   7.5,   5. ,   4. ])

如果我们在第二个数组中移动值

y21= [0.0,1.0,0.5,1.0]

然后产生的xcorr看起来

array([ 1. ,  2.5,  5. ,  7.5,  5. ,  4. ,  0. ])

你遇到的问题是矩阵的稀疏性。它不需要对这个Python包做任何事情。你可以用R仔细检查结果,你会得到相同的值。