2017-07-22 309 views
0

我想计算Python中使用交叉关联函数的一些信号之间的时滞。从numpy文档numpy.correlate(),这个函数究竟做了什么并不是很清楚。因此,我有两个简单的方波信号,首先尝试用下面的代码:使用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

我不知道的是,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来仔细检查结果,你会得到相同的值。

+0

好的,我改变了示例信号。现在没有零值。仍然,问题没有解决。为什么我得到y1和y2之间的时间滞后等于y1和y3之间的滞后? :( – user8224662

+0

可能是你应该问这里https://stats.stackexchange.com/ – MishaVacic

+0

我已经问过那里,但该职位被搁置为脱题! https://stats.stackexchange.com/问题/ 293969 /时间滞后之间-信号-使用-numpy的-相关成分 – user8224662