2017-07-22 5 views
0

Ich möchte die Zeitverzögerung zwischen einigen Signalen mit Kreuzkorrelationsfunktion in Python berechnen. Aus der numpy Dokumentation numpy.correlate(), ist es nicht sehr klar, was genau diese Funktion tut. Deshalb versuche ich es zuerst mit zwei einfachen Rechtecksignalen mit dem folgenden Code:Zeitverzögerung zwischen Signalen mit 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) 

Wenn ich die Position der Signale ändern, ich die Zeitverzögerung zu ändern, erwarten, aber es funktioniert nicht! Ich verstehe nicht, warum ich die Zeitverzögerung zwischen y1 und y2 gleich der Verzögerung zwischen 1 und y3 bekomme!

Können Sie mir helfen zu verstehen, was passiert? Thanks :)

Antwort

1

Ich bin nicht sicher, dass die Y1 und Y2-Arrays in einer Art und Weise berechnet werden, die Sie

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

Dann

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

Mit fast Sparse Matrix (Array) Willen hinken wollte nicht ändern, das kennen Sie aus Signalverarbeitung und Mathematik. Werfen Sie einen Blick auf dieses kleine Beispiel

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

Und wir

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

bekommen Wenn wir Werte in der zweiten Reihe

y21= [0.0,1.0,0.5,1.0] 

Dann resultierende xcorr bewegen sieht

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

Das Problem, das Sie haben, ist die Seltenheit Ihrer Matrix. Sie muss nichts mit diesem Python-Paket machen. Sie können Ergebnisse mit R überprüfen, Sie erhalten die gleichen Werte.

+0

Okay, ich habe das Beispielsignal geändert. jetzt gibt es keinen Nullwert. Trotzdem ist das Problem nicht gelöst. Warum bekomme ich die Zeitverzögerung zwischen y1 und y2 ist gleich der Verzögerung zwischen y1 und y3? :( – user8224662

+0

Vielleicht sollten Sie hier fragen https://stats.stackexchange.com/ – MishaVacic

+0

Ich habe dort schon gefragt, aber der Beitrag ist als Off-Thema dort auf Eis gelegt! https://stats.stackexchange.com/ Fragen/293969/time-lag-between-signals-using-numpy-korrelieren – user8224662

Verwandte Themen