Ist jemand mit Gustafsons Algorithmus zur Minimierung von Transienten bei der Vorwärts-Rückwärts-Filterung vertraut [1]? Ich versuche es zu implementieren und meine erste Vermutung war, Matlabs filtfilt.m zu überprüfen, da sie auf das Papier verweisen. In der Matlab-Funktion wird auch ein lineares Gleichungssystem gelöst, um Anfangsbedingungen zi zu finden, die die Starttransienten minimieren, aber die Beziehung zwischen Referenz und Code ist für mich nicht offensichtlich. Die einzigen Codezeilen bezüglich der Minimierung sind (nfilt ist die Länge der Koeffizientenvektoren):
zi = ( eye(nfilt-1) - [-a(2:nfilt), [eye(nfilt-2); zeros(1,nfilt-2)]] ) \...
( b(2:nfilt) - b(1)*a(2:nfilt) );
Kann mich jemand in die richtige Richtung weisen, wie sich diese Zeilen auf den in Gustafsons Artikel beschriebenen Algorithmus beziehen?
[1] Gustafsson, F. "Bestimmen der Anfangszustände bei der Vorwärts-Rückwärts-Filterung." IEEE®-Transaktionen zur Signalverarbeitung. Vol. 44, April 1996, S. 988–992.
filtfilt()
kann ich nicht verstehen, warum. Ich habe das Gustafson-Papier nicht gelesen (ich bin kein IEEE und kann es nicht kostenlos bekommen. Jeder, der eine Kopie hat, kann mir gerne eine PDF-Datei per E-Mail senden). Wenn man das Konzept von verwendetfiltfilt
, kann man es mit einer ganzen Datei von Samples machen (für mich wäre es eine Audio- oder Sounddatei, wie eine .wav). Zuerst wird der Sound vorwärts gefiltert, wobei er am Ende um Null gepolstert wird, solange Sie erwarten eine Impulsantwort des Vorwärtsfilters. das verlängert die Datei, aber die Ausgabe wird praktisch auf Null. Führen Sie dann die resultierende Datei rückwärts durch den Filter.filtfilt
in Echtzeit die Eingabe in Probenblöcke aufteilt, jeden Block auf Null auffüllt, die Blöcke rückwärts filtert, aber die "Schwänze" zurück in die Vorwärtsrichtung dreht und Überlappungsaddition. Powell-Chau hat dies nicht getan, aber ich denke, dies ist eine gute Anwendung von abgeschnittenen IIR-Filtern, sodass Sie wissen, wann die abklingende Blockausgabe endet.Antworten:
Für alle, die interessiert sind, habe ich zufällig ein Papier gefunden, das die in matlabs filtfilt.m implementierte Methode beschreibt. Ein Link zum Papier ist beigefügt. Zumindest nach meinem Verständnis implementiert matlabs filtfilt.m den Gustafson-Algorithmus nicht.
Sadovsky, P.; Bartusek, K: Optimierung des Einschwingverhaltens eines Digitalfilters, Radioengineering Vol. 9, Nr. 2, 2000
quelle
scipy
Dokumentation zulfilter_zi
, in der standardmäßigscipy.signal.filtfilt
die Anfangsbedingungen ermittelt werden, wie Sie in der Quelle sehen können . In diesem Fall wird standardmäßig "ungerade" Auffüllung verwendet, es kann jedoch auch die Methode von Gustafsson als Option verwendet werden (siehe Definition_filtfilt_gust
in der Quelle).Die
zi = (...)\(...)
Zeile in der OP-Frage bestimmt den Anfangszustand des Filters. Ich glaube, dass Python genau den gleichen Ansatz verwendetscipy
. Laut den Scipy-Dokumenten :(meine Betonung)
Beachten Sie, dass
filtfilt
der Anfangszustand berechnetzi
, mit dem ersten Abtastwert skaliert und dann an weitergeleitet wirdfilter
, wodurch er tatsächlich angewendet wird ( docs ).Ein grundlegendes Beispiel dafür, wie dieser Anfangszustand
zi
in einem Filter unter Verwendung der Zustandsraumdarstellung angewendet werden kann, finden Sie hier .quelle