2017-07-22 49 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) 

が、私はタイムラグが変わることを期待するが、それはしていません。そのため、私は次のコードで2つの単純な四角の信号で最初にそれを試してみてください!私はなぜ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-correlateを使用する – user8224662

関連する問題