FIR-Filter für Heimkinoton
Verfasst: 02.01.2018, 14:31
Hallo zusammen,
in den letzten Monaten lese ich immer wieder, dass FIR wegen der Verzögerungen nicht für Heimkino eingesetzt werden könne -- mit der Ausnahme von Wiedergabegeräten oder -software, die das Bild verzögern können. Das ist pauschal so nicht richtig, und ich möchte zwei Optionen aufzeigen, wie mittels Acourate online gerechnete FIR-Filter für den Heimkinoeinsatz erstellt werden können. Der erste Ansatz ist in Acourate leicht umsetzbar, bietet aber keine Laufzeitkorrektur mehr. Der zweite Ansatz ist in Acourate manuell mit mittlerem Aufwand umsetzbar, erfordert aber einige Schritte und Iterationen.
Zunächst nochmal einige Grundlagen zum generellen Verständnis und Terminologie.
FIR vs. IIR:
FIR steht für "Finite Impulse Response", also eine endliche Impulsantwort. IIR wiederum steht für "Infinite Impulse Response", also unendlich (lange) Impulsantwort. Alle mit Acourate erstellten Filter sind per se immer FIR-Filter mit einer typischen Länge von 65.536 Werten.
Schnelle Faltung:
Bei Convolvern wird aus Gründen der Recheneffizienz die sogenannte "schnelle Faltung" eingesetzt. Bei dieser wird der Rechenaufwand durch Einsatz von blockweise angewendeter FFT stark reduziert. Anstatt einer Ordnung von N^2 Rechenoperationen benötigt die schnelle Faltung nur noch N*log(N) für N samples bei einer FIR-Länge von N. Diese blockweise Verarbeitung verzögert das Signal jedoch zusätzlich um 2*K samples, wenn K die FFT-Größe ist. Bei den mir bekannten Convolvern gibt es Einstellungen, um diese Blockgröße zu verändern. Je kleiner die Blockgröße, desto kleiner die Verzögerung, aber desto größer die erzeugte Rechenlast.
Signalverzögerung bei Convolving:
Die Verzögerung des Signals durch Convolving besteht immer aus den beiden Komponenten der schnellen Faltung (2 * FFT-Blockgröße) und der in das FIR-Filter eingeprägten Verzögerung. Per default erstellt Acourate Filter, die das Signal um die Hälfte der FIR-Länge verzögern. Bei den für Acourate typischen Filterlängen und einer Samplingfrequenz von 44.100 Hz ergeben sich dabei Gesamtverzögerung im Bereich von 750 ms bis >1 s.
Typische Acourate FIR-Filter:
Wenn man die Standardeinstellungen und Roommakros zur Erstellung von Raumkorrekturfiltern benutzt, wird Acourate ein Filter der Länge 65.536 erstellen und das Signal dabei um 32.768 samples verzögern. Diese Verzögerung ermöglicht es Acourate eine Laufzeitkorrektur einzubringen. Vereinfachtes Beispiel: Ein TT-Chassis läuft den MT/HT-Chassis um 10 ms nach. Acourate wird jetzt ein Filter erzeugen, dass die Signalanteile der MT/HT-Chassis nach der halben FIR-Filterlänge passieren lässt, die Anteile des TT-Chassis jedoch 10 ms davor. Wenn man sich von Acourate erstellten FIR-Filter ansieht, erkennt man häufig, dass links vom Hauptpeak nur sehr kurze Anteile stecken. Diese dienen im Kern der Laufzeitkorrektur für nacheilende Frequenzanteile des zu korrigierenden Systems. Acourate nimmt sich also etwa 740 ms Zeit (44,1 kHz bei FIR-Länge von 65.536 samples), um Chassis-Verzögerungen im ms-Bereich zu kompensieren.
Filter für das zu korrigierende Beispielsystem:
Jetzt du den Lösungen für Heimkino am Beispiel eines Filters, das zur Korrektur eines 2-Wege-Lautsprechers mit Linkwitz-Crossover bei 80 Hz erstellt wurde (simple Addition beider Crossover-Pfade). Das sich ergebende Filter hat einen linearen Frequenzganz, benötigt aber eine Laufzeitkorrektur im Bass von etwa 6-7 ms.
Crossover Einstellungen
Laufzeitkorrektur für 2-Wege-Beispiel
Geringe Delays über Minimalphasenfilter:
Diese einfache Methode benutzt Acourates Funktion "Room > Special: Convert Filters to Minphase", welche aus den vorhandenen Filtern (z.B. Cor1L48.dbl) die korrespondierenden minimalphasigen Versionen (z.B. mpCor1L48.dbl) berechnet. Ein solches minimalphasiges Filter besitzt denselben Frequenzgang wie das ursprüngliche Filter, nimmt aber keine Laufzeitkorrektur mehr vor. Als Vorteil weist das FIR-Filter jetzt keine nennenswerte Verzögerung mehr auf. Dieser Umstand ist daran leicht zu erkennen, dass der Impulspeak jetzt ganz am Anfang des Filters liegt.
keine Laufzeitkorrektur bei minimalphasigem Filter
Impulsantwort des minimalphasigen Filters im Vergleich zum Acourate Standard-FIR
Die verbleibende Signalverzögerung beim Convolving wird jetzt nur noch durch die Blockgröße der schnellen Faltung bestimmt. Diese kann bei heute verfügbaren Rechnern leicht in den zwei- und sogar einstelligen ms-Bereich verschoben werden. Als Hausnummer: Mein i3 zeigt für Stereo, ein FIR-Filter der Länge 65.536 und eine Blockgröße von 512 samples (Gesamtverzögerung etwa 5 ms) eine Last von nur etwa 10%.
Geringe Delays über Filter-Rotation:
Diese Methode ist etwas komplizierter und erfordert manuelle Schritte in Acourate. Wie zuvor beschrieben verzögert Acourate per default das Signal recht stark, auch wenn die eigentliche Laufzeitkorrektur nur wenige ms beträgt. Der Ansatz ist daher, dass die Impulsantwort des berechneten Filters so weit "nach vorn" geschoben wird, dass die gewünschte Laufzeitkorrektur noch greift und die Gesamtverzögerung beim online convolving hinreichend gering bleibt. Was bedeutet hierbei "hinreichend": Der Ton darf nur so weit verzögert werden, dass der zeitliche Versatz zum Bild nicht mehr auffällt. Dazu sei angemerkt, dass TVs das Bild (abhängig vom Fabrikat und den Einstellung) im zweistelligen ms-Bereich verzögern. Diese Bildverzögerung lässt sich nutzen!
Konkret wird ein solches auf geringe Verzögerung optimiertes Filter wie folgt erstellt:
Gewünschte Verzögerung in samples ermitteln:
Zuerst bestimmt man die gewünschte Mögliche maximale Verzögerung durch das convolving: Annahme sei 25 ms. Hiervon zieht man die Verzögerung durch die schnellen Faltung ab: Annahme 5 ms. Das FIR-Filter selbst darf somit noch um 20 ms verzögern. Bei einer Abtastrate von 44.100 Hz entspricht dies 882 samples (dieser Wert wird nachfolgend weiter benutzt).
Impulsantwort "nach vorn" schieben:
Jetzt lädt man das von Acourate berechnete Filter (z.B. Cor1L48.dbl) und wendet "TD-Functions > Rotation" an. Das Filter soll nach links rotiert werden, und der Peak soll danach bei der berechneten Verzögerung von 882 samples liegen. Für die Rotation wird also -31.886 (32.768-882 nach links) eingegeben.
Verschieben "nach vorn" über Rotation
Impulsantwort nach Rotation
Impulsantwort fenstern:
Nach der Rotation beginnt das Filter unstetig, d.h. es blendet nicht sanft ein. Um das Filter sauber, aber kurz einblenden zu lassen, am besten "TD-Functions > Windows" mit "Cosine Tapered 10%" und (ganz wichtig!) "left of pos" mit "Position 882" anwenden.
Anwenden des Fensters vor Peak
Impulsantwort kappen:
Als weiterer Effekt der Rotation sind 31.886 samples, die zuvor auf der linken Seite des Filter lagen, auf die rechte Seite rotiert worden. Diese sind jetzt überflüssig und müssen "genullt" werden. Dazu den zu nullenden Bereich markieren und "TD-Functions > Silence between Markers" ausführen. Voilá!
Im Ergebnis erhält man ein Filter, das immer noch die gewünschte Laufzeitkorrektur für die Lautsprecher macht, aber eine Verzögerung von nur etwa 20 ms aufgeprägt hat. Als Kompromiss treten jetzt im Vergleich zum ursprünglichen Filter Fehler von etwa +/- 0,1 dB im Frequenzgang auf. Diese Fehler sind eine Folge des verkürzten Einschwingens und lassen sich nur über Zulassen einer größeren Verzögerung reduzieren. Wenn man mit dem Ergebnis nicht zufrieden ist, kann man mit einer größeren Verzögerung ein neues Filter berechnen und so nach dem geeigneten Kompromiss suchen.
Frequenzganz zeitoptimiertes Filter
Laufzeitkorrektur zeitoptimiertes Filter
Aus meiner Sicht sind beide Verfahren für Heimkino geeignet. Ich persönlich bevorzuge Variante 1, weil sie einfacher umzusetzen ist, und weil in meinen Setup keine größeren Chassis-Verzögerungen kompensiert werden. Variante 2 ist die genauere, braucht aber mehr Feintuning, um einen geeigneten Kompromiss zwischen Frequenzgang, Laufzeitkorrektur und Verzögerung zu erreichen.
Viele Grüße,
Andree
in den letzten Monaten lese ich immer wieder, dass FIR wegen der Verzögerungen nicht für Heimkino eingesetzt werden könne -- mit der Ausnahme von Wiedergabegeräten oder -software, die das Bild verzögern können. Das ist pauschal so nicht richtig, und ich möchte zwei Optionen aufzeigen, wie mittels Acourate online gerechnete FIR-Filter für den Heimkinoeinsatz erstellt werden können. Der erste Ansatz ist in Acourate leicht umsetzbar, bietet aber keine Laufzeitkorrektur mehr. Der zweite Ansatz ist in Acourate manuell mit mittlerem Aufwand umsetzbar, erfordert aber einige Schritte und Iterationen.
Zunächst nochmal einige Grundlagen zum generellen Verständnis und Terminologie.
FIR vs. IIR:
FIR steht für "Finite Impulse Response", also eine endliche Impulsantwort. IIR wiederum steht für "Infinite Impulse Response", also unendlich (lange) Impulsantwort. Alle mit Acourate erstellten Filter sind per se immer FIR-Filter mit einer typischen Länge von 65.536 Werten.
Schnelle Faltung:
Bei Convolvern wird aus Gründen der Recheneffizienz die sogenannte "schnelle Faltung" eingesetzt. Bei dieser wird der Rechenaufwand durch Einsatz von blockweise angewendeter FFT stark reduziert. Anstatt einer Ordnung von N^2 Rechenoperationen benötigt die schnelle Faltung nur noch N*log(N) für N samples bei einer FIR-Länge von N. Diese blockweise Verarbeitung verzögert das Signal jedoch zusätzlich um 2*K samples, wenn K die FFT-Größe ist. Bei den mir bekannten Convolvern gibt es Einstellungen, um diese Blockgröße zu verändern. Je kleiner die Blockgröße, desto kleiner die Verzögerung, aber desto größer die erzeugte Rechenlast.
Signalverzögerung bei Convolving:
Die Verzögerung des Signals durch Convolving besteht immer aus den beiden Komponenten der schnellen Faltung (2 * FFT-Blockgröße) und der in das FIR-Filter eingeprägten Verzögerung. Per default erstellt Acourate Filter, die das Signal um die Hälfte der FIR-Länge verzögern. Bei den für Acourate typischen Filterlängen und einer Samplingfrequenz von 44.100 Hz ergeben sich dabei Gesamtverzögerung im Bereich von 750 ms bis >1 s.
Typische Acourate FIR-Filter:
Wenn man die Standardeinstellungen und Roommakros zur Erstellung von Raumkorrekturfiltern benutzt, wird Acourate ein Filter der Länge 65.536 erstellen und das Signal dabei um 32.768 samples verzögern. Diese Verzögerung ermöglicht es Acourate eine Laufzeitkorrektur einzubringen. Vereinfachtes Beispiel: Ein TT-Chassis läuft den MT/HT-Chassis um 10 ms nach. Acourate wird jetzt ein Filter erzeugen, dass die Signalanteile der MT/HT-Chassis nach der halben FIR-Filterlänge passieren lässt, die Anteile des TT-Chassis jedoch 10 ms davor. Wenn man sich von Acourate erstellten FIR-Filter ansieht, erkennt man häufig, dass links vom Hauptpeak nur sehr kurze Anteile stecken. Diese dienen im Kern der Laufzeitkorrektur für nacheilende Frequenzanteile des zu korrigierenden Systems. Acourate nimmt sich also etwa 740 ms Zeit (44,1 kHz bei FIR-Länge von 65.536 samples), um Chassis-Verzögerungen im ms-Bereich zu kompensieren.
Filter für das zu korrigierende Beispielsystem:
Jetzt du den Lösungen für Heimkino am Beispiel eines Filters, das zur Korrektur eines 2-Wege-Lautsprechers mit Linkwitz-Crossover bei 80 Hz erstellt wurde (simple Addition beider Crossover-Pfade). Das sich ergebende Filter hat einen linearen Frequenzganz, benötigt aber eine Laufzeitkorrektur im Bass von etwa 6-7 ms.
Crossover Einstellungen
Laufzeitkorrektur für 2-Wege-Beispiel
Geringe Delays über Minimalphasenfilter:
Diese einfache Methode benutzt Acourates Funktion "Room > Special: Convert Filters to Minphase", welche aus den vorhandenen Filtern (z.B. Cor1L48.dbl) die korrespondierenden minimalphasigen Versionen (z.B. mpCor1L48.dbl) berechnet. Ein solches minimalphasiges Filter besitzt denselben Frequenzgang wie das ursprüngliche Filter, nimmt aber keine Laufzeitkorrektur mehr vor. Als Vorteil weist das FIR-Filter jetzt keine nennenswerte Verzögerung mehr auf. Dieser Umstand ist daran leicht zu erkennen, dass der Impulspeak jetzt ganz am Anfang des Filters liegt.
keine Laufzeitkorrektur bei minimalphasigem Filter
Impulsantwort des minimalphasigen Filters im Vergleich zum Acourate Standard-FIR
Die verbleibende Signalverzögerung beim Convolving wird jetzt nur noch durch die Blockgröße der schnellen Faltung bestimmt. Diese kann bei heute verfügbaren Rechnern leicht in den zwei- und sogar einstelligen ms-Bereich verschoben werden. Als Hausnummer: Mein i3 zeigt für Stereo, ein FIR-Filter der Länge 65.536 und eine Blockgröße von 512 samples (Gesamtverzögerung etwa 5 ms) eine Last von nur etwa 10%.
Geringe Delays über Filter-Rotation:
Diese Methode ist etwas komplizierter und erfordert manuelle Schritte in Acourate. Wie zuvor beschrieben verzögert Acourate per default das Signal recht stark, auch wenn die eigentliche Laufzeitkorrektur nur wenige ms beträgt. Der Ansatz ist daher, dass die Impulsantwort des berechneten Filters so weit "nach vorn" geschoben wird, dass die gewünschte Laufzeitkorrektur noch greift und die Gesamtverzögerung beim online convolving hinreichend gering bleibt. Was bedeutet hierbei "hinreichend": Der Ton darf nur so weit verzögert werden, dass der zeitliche Versatz zum Bild nicht mehr auffällt. Dazu sei angemerkt, dass TVs das Bild (abhängig vom Fabrikat und den Einstellung) im zweistelligen ms-Bereich verzögern. Diese Bildverzögerung lässt sich nutzen!
Konkret wird ein solches auf geringe Verzögerung optimiertes Filter wie folgt erstellt:
Gewünschte Verzögerung in samples ermitteln:
Zuerst bestimmt man die gewünschte Mögliche maximale Verzögerung durch das convolving: Annahme sei 25 ms. Hiervon zieht man die Verzögerung durch die schnellen Faltung ab: Annahme 5 ms. Das FIR-Filter selbst darf somit noch um 20 ms verzögern. Bei einer Abtastrate von 44.100 Hz entspricht dies 882 samples (dieser Wert wird nachfolgend weiter benutzt).
Impulsantwort "nach vorn" schieben:
Jetzt lädt man das von Acourate berechnete Filter (z.B. Cor1L48.dbl) und wendet "TD-Functions > Rotation" an. Das Filter soll nach links rotiert werden, und der Peak soll danach bei der berechneten Verzögerung von 882 samples liegen. Für die Rotation wird also -31.886 (32.768-882 nach links) eingegeben.
Verschieben "nach vorn" über Rotation
Impulsantwort nach Rotation
Impulsantwort fenstern:
Nach der Rotation beginnt das Filter unstetig, d.h. es blendet nicht sanft ein. Um das Filter sauber, aber kurz einblenden zu lassen, am besten "TD-Functions > Windows" mit "Cosine Tapered 10%" und (ganz wichtig!) "left of pos" mit "Position 882" anwenden.
Anwenden des Fensters vor Peak
Impulsantwort kappen:
Als weiterer Effekt der Rotation sind 31.886 samples, die zuvor auf der linken Seite des Filter lagen, auf die rechte Seite rotiert worden. Diese sind jetzt überflüssig und müssen "genullt" werden. Dazu den zu nullenden Bereich markieren und "TD-Functions > Silence between Markers" ausführen. Voilá!
Im Ergebnis erhält man ein Filter, das immer noch die gewünschte Laufzeitkorrektur für die Lautsprecher macht, aber eine Verzögerung von nur etwa 20 ms aufgeprägt hat. Als Kompromiss treten jetzt im Vergleich zum ursprünglichen Filter Fehler von etwa +/- 0,1 dB im Frequenzgang auf. Diese Fehler sind eine Folge des verkürzten Einschwingens und lassen sich nur über Zulassen einer größeren Verzögerung reduzieren. Wenn man mit dem Ergebnis nicht zufrieden ist, kann man mit einer größeren Verzögerung ein neues Filter berechnen und so nach dem geeigneten Kompromiss suchen.
Frequenzganz zeitoptimiertes Filter
Laufzeitkorrektur zeitoptimiertes Filter
Aus meiner Sicht sind beide Verfahren für Heimkino geeignet. Ich persönlich bevorzuge Variante 1, weil sie einfacher umzusetzen ist, und weil in meinen Setup keine größeren Chassis-Verzögerungen kompensiert werden. Variante 2 ist die genauere, braucht aber mehr Feintuning, um einen geeigneten Kompromiss zwischen Frequenzgang, Laufzeitkorrektur und Verzögerung zu erreichen.
Viele Grüße,
Andree