2017-07-22 307 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