我想在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之间的滞后!?
你能帮我理解发生了什么吗? 谢谢:)
答案 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仔细检查结果,你会得到相同的值。