Wie funktioniert die Kaskadierung von Biquad-Abschnitten für Filter höherer Ordnung?

20

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 tf2sosin 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_indem zweiten Filter zugeführt und so weiter?

anasimtiaz
quelle
Sie müssen für jede Stufe vorherige Zustände speichern, abhängig von der Reihenfolge des Filters in dieser Stufe, damit es nicht nur 2 ist, wie Sie es erwähnt haben

Antworten:

13

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.

Jason R
quelle
Vielen Dank! Ich habe es gerade geschafft, es in MATLAB schnell zu machen. Der Grund für die frühere Verwirrung war, dass ich vergessen hatte, den Gewinn zu multiplizieren (ugh!), Und daher
schlichen sich
Wenn Sie sich nicht die Mühe machen, den Gewinn als Ausgabearg von tf2sos anzufordern (wie in meinem Beispielcode angegeben), müssen Sie ihn nicht erneut multiplizieren.
Learnvst
9

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.

Hilmar
quelle
6

Hier ist ein bisschen Demo-Code, um zu zeigen, warum Sie besser dran sind, Abschnitte 2. Ordnung zu kaskadieren.

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

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

Bildbeschreibung hier eingeben

ORDER = 13

Bildbeschreibung hier eingeben

learnvst
quelle
@learvst Korrigieren Sie mich, wenn ich falsch liege, aber Ihr Code verfehlt die Gewinne. Sollte es nicht sein:[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);
user915783