Nullphasenfilter: Bestimmen der Anfangsbedingungen für die Vorwärts-Rückwärts-Filterung

7

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.

user967493
quelle
Die Anfangszustände eines IIR-Filters sollten zu Beginn des Vorwärtsfilterungsdurchlaufs Null und zu Beginn des Rückwärtsfilterungsdurchlaufs Null sein. In beiden Durchgängen wird die zu filternde Signaldatei (oder der zu filternde Puffer) um die scheinbare Länge des IIR länger (wie lange es dauert, bis der Ausgang nahe genug auf Null abfällt, damit Sie den Rest des Abfalls abschneiden können). .
Robert Bristow-Johnson
In der Arbeit behauptet der Autor, dass sich die Vorwärts- und Rückwärtsfilter in ihrer Zustandsraumdarstellung unterscheiden. Kannst du erklären warum?
Maxtron
Nun, da ich die Verwendung von verstehe, 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 verwendet filtfilt, 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.
Robert Bristow-Johnson
Es gibt eine andere Verwendung, die auf einem Papier von Powell und Chau basiert, das filtfiltin 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.
Robert Bristow-Johnson
1
@ robertbristow-johnson: Ich bin auf diese Kopie des Gustafsson-Papiers gestoßen .
DJVG

Antworten:

5

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

user967493
quelle
Lesen Sie auch die scipy Dokumentation zu lfilter_zi, in der standardmäßig scipy.signal.filtfiltdie 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_gustin der Quelle).
DJVG
0

Die zi = (...)\(...)Zeile in der OP-Frage bestimmt den Anfangszustand des Filters. Ich glaube, dass Python genau den gleichen Ansatz verwendet scipy. Laut den Scipy-Dokumenten :

Ein lineares Filter mit der Ordnung m hat eine Zustandsraumdarstellung (A, B, C, D), für die die Ausgabe y des Filters ausgedrückt werden kann als:

z (n + 1) = A z (n) + B x (n)

y (n) = C z (n) + D x (n)

wobei z (n) ein Vektor der Länge m ist, A die Form (m, m) hat, B die Form (m, 1) hat, C die Form (1, m) hat und D die Form (1, 1) hat (unter der Annahme von x) (n) ist ein Skalar). lfilter_zi löst:

zi = A * zi + B.

Mit anderen Worten, es findet die Anfangsbedingung, für die die Antwort auf eine Eingabe aller eine Konstante ist .

(meine Betonung)

Beachten Sie, dass filtfiltder Anfangszustand berechnet zi, 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 ziin einem Filter unter Verwendung der Zustandsraumdarstellung angewendet werden kann, finden Sie hier .

djvg
quelle