Ich versuche, einen IIR-Filter 8. Ordnung zu implementieren, und jeder Anwendungsbericht und jedes Lehrbuch, das ich gelesen habe, besagt, dass es am besten ist, Filter mit einer Ordnung von mehr als 2 als Abschnitte zweiter Ordnung zu implementieren. Ich habe tf2sos
in MATLAB die Koeffizienten für Abschnitte zweiter Ordnung ermittelt, wodurch ich erwartungsgemäß 6x4 Koeffizienten für Abschnitte zweiter Ordnung erhalten habe. Vor der Implementierung als SOS mussten für den Filter 8. Ordnung 7 vorherige Abtastwerte gespeichert werden (und auch Ausgabewerte). Muss ich beim Implementieren von Abschnitten zweiter Ordnung, wie der Fluss von der Eingabe zur Ausgabe funktioniert, nur 2 vorherige Beispielwerte speichern? Oder wird der Ausgang des ersten Filters x_in
dem zweiten Filter zugeführt und so weiter?
quelle
Antworten:
Es ist das Letzte, was Sie gesagt haben ("Oder wird die Ausgabe des ersten Filters als x_in in den zweiten Filter eingespeist und so weiter?"). Die Idee ist einfach: Sie behandeln die Biquads als separate Filter zweiter Ordnung, die in Kaskade geschaltet sind. Der Ausgang des ersten Filters ist der Eingang des zweiten und so weiter, so dass die Verzögerungsleitungen auf die Filter verteilt sind. Wenn Sie die Struktur in einer speicherbeschränkten Umgebung optimieren müssen, können Sie feststellen, dass benachbarte Biquads über einen redundanten Verzögerungsspeicher verfügen (dh, die letzten Ausgangsabtastungen von Stufe 1 stimmen mit den letzten Eingangsabtastungen von Stufe 2 überein Sie müssen sie nicht wie gewohnt separat speichern, wenn Sie die Filter nur isoliert implementieren.
quelle
Tatsächlich gibt es zwei Möglichkeiten, Abschnitte zweiter Ordnung zu implementieren: parallel und seriell. In der seriellen Version sind die Ausgänge von Abschnitt N die Eingänge von Abschnitt N + 1. In der parallelen Version haben alle Abschnitte den gleichen Eingang (und nur eine echte Null anstelle eines konjugierten komplexen Nullenpaares) und jeder Abschnitt wird einfach aufsummiert. Die beiden Methoden hängen durch teilweise Expansion der Z-Domänen-Transferfunktion zusammen. WARNUNG: Dies ist ein numerisch schwieriges Problem, und die Matlab-Standardimplementierung "residz" kann für typische Audiofilter, deren Pole nahe am Einheitskreis liegen, sehr große numerische Fehler aufweisen.
quelle
Hier ist ein bisschen Demo-Code, um zu zeigen, warum Sie besser dran sind, Abschnitte 2. Ordnung zu kaskadieren.
Für das im obigen Beispiel angegebene Tiefpassfilter bauen sich die numerischen Fehler in Größenordnungen von etwa 12 bis 13 auf, um eine sichtbar unterschiedliche Impulsantwort für die Implementierung zu ergeben, die keine kaskadierten Biquads verwendet. Abhängig vom Filter variiert Ihre Laufleistung.
ORDER = 10
ORDER = 13
quelle
[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);