Dies ist eine alte Version des Dokuments!
Die Taktrückgewinnung wurde hier durch clockrec
realisiert, die Funktion liefert die Taktverschiebung der Aufnahme. Mit Taktverschiebung ist hier der Abstand bis zum Anfang des ersten vollen Takts der Aufnahme gemeint, hier als dt
bezeichnet. Ausgehend von dieser kann man den übrigen Teil der Aufnahme in Abschnitte mit der Länge eines Takts einteilen. Dabei bleibt allerdings auch am Ende der Aufnahme ein Rest übrig, welcher nicht verarbeitet werden kann und entweder weg fällt oder im darauf folgenden Aufnahmestück verarbeitet wird.
Wichtig ist, dass der Funktion mitgeteilt wird mit welcher Taktlänge und auf welcher Taktfrequenz gesendet wird. Das wird hier am Anfang der Funktion festgelegt, kann aber auch über globale Variablen geschehen. Nun wird über einen digitalen Butterworth-Filter das Signal mit der Taktfrequenz aus der Aufnahme herausgefiltert. Dabei sind a
und b
Variablen, die von der Filter-Funktion benötigt werden, welche dann das gefilterte Signal yf
zurück liefert. Jetzt wird die Hüllkurve um den positiven Bereich des gefilterten Signals gebildet. Das geschieht mithilfe der Hilbert-Transformation. Das so erhaltene Signal yh
ist ein binäres Signal, welches die zwei Zustände An und Aus annehmen kann und dem gesendeten Taktsignal entspricht. Daraus wollen wir jetzt die Zeitpunkte der Taktgrenzen ermitteln.
def clockrec(y): '''liefert die Verschiebung des Taktes''' tl = 0.05 f_takt = 12600 b, a = signal.butter(4, [(f_takt-100)*2./RATE, (f_takt+100)*2./RATE], btype="bandpass") yf = signal.lfilter(b,a,y) yh = np.abs(signal.hilbert(yf)) ma = max(y) tol = 0.002 * ma s = ma/5 idx = np.where(np.abs(y-s)<tol) dt = np.fmod(idx, (tl*RATE)) dt = np.mean(dt) return dt