Seite 1 von 2

FIR-Filter für Heimkinoton

Verfasst: 02.01.2018, 14:31
von Buschel
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.

Bild
Crossover Einstellungen

Bild
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.

Bild
keine Laufzeitkorrektur bei minimalphasigem Filter

Bild
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.

Bild
Verschieben "nach vorn" über Rotation

Bild
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.

Bild
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.

Bild
Frequenzganz zeitoptimiertes Filter

Bild
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

Verfasst: 02.01.2018, 16:58
von uli.brueggemann
Andree,

soweit danke. Dazu aber zwei Ergänzungen meinerseits:

1.
Neben der Methode 1, also Erstellen eines minimalphasigen Filters kann man evtl. auch noch eine FFT-Faltung verwenden, die nicht mit konstanten Blockgrößen arbeitet, sondern mit einer "non-uniform partitioned convolution", also nicht konstanten Blockgrößen. Dabei wird mit kurzen Blockgrößen begonnen, z.B. 64 Samples. Derartige Convolver werden auch als latency free convolution beworben. Zwei Vertreter hierzu sind SIR2 und Voxengo Pristine Space (unter Linux z.B. jconvolver). Ich habe großen Respekt vor den Leuten, die solche Convolver inklusive dem nötigen Multithreading programmieren können (ich selbst kann es derzeit nicht).
Damit wird die Faltungszeit richtig kurz.

2.
Das Beschnibbeln des Korrekturfilters ist auch eine mögliche Lösung. Es macht dazu evtl. Sinn zuerst ein Filter mit Länge 131072 taps zu erstellen. Dann kann man mit CutNWindow auf Länge 65536 Samples ab Position 65536-882=64654 und Windowing=on direkt das gewünschte Filter ausscheiden.
Dazu sind dann die sich ändernden Frequenzgänge und Spungantworten der Filter zu kontrollieren.

Grüsse
Uli

Verfasst: 02.01.2018, 18:40
von L_Hörer
Hallo Andree,

sehr interessante Vorschläge, besonders der zweiten Lösungsweg mit der Minimierung der Delays gefällt mir.

Ich tue mich einfach schwer, die FIR-Filter von Acourate für den Videobetrieb zu kastrieren. Deshalb benutze ich bisher den SM-Player, der beliebige Verzögerungen des Video-Bildes erlaubt, und der vom Play-PC das verzögerte Bild direkt an das TV gibt, den Ton an den Convolver-PC und dann an die Lautsprecher.

Das scheint mir aber von der Bildqualität her nur die zweitbeste Lösung zu sein, denn das Bild von Kodi ist m.E. besser - aber Kodi schafft auf meinen Rechnern nur eine Bild-Verzögerung von max. 600 ms und friert dann ein. Und das hat bisher nicht gereicht.

Jetzt werde ich Deinem Vorschlag folgen und das nochmal mit "delayoptimierten" Filtern probieren - würde mich freuen, wenn das klappt.

Viele Grüße und allen ein gutes Neues Jahr
Heinz

Verfasst: 02.01.2018, 18:54
von L_Hörer
Hallo Uli,
uli.brueggemann hat geschrieben: Es macht dazu evtl. Sinn zuerst ein Filter mit Länge 131072 taps zu erstellen. Dann kann man mit CutNWindow auf Länge 65536 Samples ab Position 65536-882=64654 und Windowing=on direkt das gewünschte Filter ausscheiden.Uli
Ist für das längere Filter eine neue Messung mit 131072 taps erforderlich, oder kann ich das aus dem vorliegenden 65536-tap-Filter generieren?

Viele Grüße
Heinz

Verfasst: 02.01.2018, 19:35
von uli.brueggemann
L_Hörer hat geschrieben:Ist für das längere Filter eine neue Messung mit 131072 taps erforderlich, oder kann ich das aus dem vorliegenden 65536-tap-Filter generieren?
Heinz,

in der Datei \Dokumente\Acourate\Acourate.ini gibt es diverse Sektionen gekennzeichent mit [...]
Du kannst in der Sektion [Macro4] einen Zeile eintragen mit
longFilter131072=1 (=0 bedeutet ausschalten)

Dann zeigt Macro4 eine Checkbox 'double length'. Wenn diese markiert ist erzeugt das Macro Filter der Länge 131072 Samples. Damit ist dann keine neue Messung nötig.

Grüsse
Uli

Verfasst: 02.01.2018, 22:21
von Buschel
Hallo Uli,

"non-uniform partitioned convolving" löst zwar keines meiner Probleme (der i3 ist ja fix genug), klingt aber interessant. Das schaue ich mir bei Gelegenheit mal an. Danke für den Hinweis. :D

Die Berechnung einer 128k-Filters gehe ich auch zur Probe an. Damit könnte man die Frequenzauflösung des letztlich verbleibenden "zeitoptimierten" 64k-Filters weiterhin voll ausnutzen, ohne dass knapp die Hälfte der samples genullt wird. Der Gedanke gefällt mir.

Ist das vielleicht auch etwas für die Optionen in den Standardmakros? Ich denke an eine Option, mit der die Verzögerung des Filterpeaks in samples oder ms angegeben werden kann. Im Hintergrund wird dann mit 128k gerechnet und das entsprechende 64k-Stück daraus gewählt und gefenstert.

Hallo Heinz,

du kannst ja das Bild mit kodi nur um wenige hundert ms verzögern (so, dass die Wiedergabe stabil bleibt), und ein Filter mit entsprechend darauf optimiertem delay erstellen. Mit einem so weniger heftig verkürztem Vor-/Einschwingen rechne ich mit irrelevanten Abweichungen vom originären Filter. Berichte mal von deinen Ergebnissen. :cheers:

Viele Grüße,
Andree

Verfasst: 02.01.2018, 22:27
von Lauscher
Hallo an Alle :D

Super interessant hier - das ist mein nächstes Thema.
Erst einmal muss ich allerdings meine LS in den Griff bekommen :wink:

Was mich im Moment noch mehr interessiert ist - wie bekomme ich möglichst verlustfrei den Ton in meinen PC - ich schaue seit Tagen nach einer Lösung:
1) Geht Ihr vom externen BD Player / Receiver mit dem Ton analog über die externe Soundkarte
in den PC ?
2) Oder gar digital ? Wenn ja wie ?
3) Oder Nehmt Ihr den PC als Player ? Wie löst Ihr das direkte abspielen einer BD ?

Der 3te Weg scheint der eigentlich logische Weg zu sein ist aber mit vielen Hindernissen gesegnet . Der erste Weg wird nach meinem heutigen Stand wohl der praktischste und einfachste aber klanglich nicht der beste sein.

Ich würde mich über Eure Lösungsbeschreibungen, gerne in Kurzfassung oder PN, freuen.

Ich hoffe ich weiche das Thema nicht zu sehr auf. :oops:

Viele Grüße
Jens

Verfasst: 03.01.2018, 01:39
von Arthur4ik
3) Blu-Ray Laufwerk + evtl. sowas wie A*yDVD HD + (ne schöne Kombi: MPC-HC + LAV Filters + madVR + ReClock) am PC intern/extern ist doch viel einfacher?

https://mpc-hc.org/
http://madvr.com/
https://jriver.com/video.html

Verfasst: 03.01.2018, 15:05
von Pittiplatsch
Hallo Andree,

ich hatte gerade in einem anderen Thread Deine Aussage dazu gelesen und wollte Dir eine PM schreiben da hattest du schon diesen dedizierten Thread fuer das Thema aufgemacht :).

Ich habe mich gleich gefragt was gegen:
Das Beschnibbeln des Korrekturfilters ist auch eine mögliche Lösung.
spricht? Ich hatte das seinerzeit bei den DRC Filtern ganz naiv schon immer so gemacht und alle 0-Samples vor dem eigentlichen Filter weggeschnitten. Ich hatte mir sogar die Muehe gespart das am Ende wieder auzufuellen weil brutefir ein 0 padding am Ende zu machen scheint, oder ist das zu kurz gedacht? Das Ergebnis scheint gehoermaessig zu passen....

Viele Gruesse,
Tobias

Verfasst: 03.01.2018, 18:14
von L_Hörer
Hallo zusammen,

@Uli
Danke, das vereinfacht den Test. Zukünftig würde ich dann eher mit mehr taps messen.

@Andree
Buschel hat geschrieben:du kannst ja das Bild mit kodi nur um wenige hundert ms verzögern (so, dass die Wiedergabe stabil bleibt), und ein Filter mit entsprechend darauf optimiertem delay erstellen.
Ja, so wirds gemacht, ich nehme 500 ms.
Buschel hat geschrieben:Mit einem so weniger heftig verkürztem Vor-/Einschwingen rechne ich mit irrelevanten Abweichungen vom originären Filter. Berichte mal von deinen Ergebnissen.
Das glaube ich auch, ich werde berichten.

@Jens
Habe meinen Vorstellungsthread aktualisiert, da findest Du meine Lösung.

Viele Grüße
Heinz

Verfasst: 03.01.2018, 23:24
von Buschel
Hallo Tobias,
Pittiplatsch hat geschrieben:Ich hatte das seinerzeit bei den DRC Filtern ganz naiv schon immer so gemacht und alle 0-Samples vor dem eigentlichen Filter weggeschnitten.
Nichts spricht gegen dein Vorgehen, wenn du wirklich nur führende Null-samples löschst. Damit erzielst du das Ergebnis, dass du jede unnötige Verzögerung entfernst, ohne das Filterergebnis weiter zu beeinflussen. :)

Allerdings kannst du dann nicht eine gewünschte Verzögerung für das Filter vorgeben, sondern diese ergibt sich aus der Anzahl der führenden Nullen. Wenn du die Verzögerung kontrollieren möchtest, musst du den Impulspeak an die gewünschte Stelle setzen und entsprechend festern (falls nicht wiederum bereits führende Nullen vorliegen).

Viele Grüße,
Andree

Verfasst: 04.01.2018, 10:28
von Pittiplatsch
Hallo Andree,

danke fuer die Erklaerung. Ich bin nach den Ausfuehrungen ueber minimalphasige Filter stutzig geworden. Welchen Vorteil bringen denn dann minimalphasige Filter hinsichtlich Zeitversatz noch wenn ich mir doch auch einen "normalen" Filter zurechtschneiden kann?

Ich schneide uebrigens ganz naiv mit audacity. Der Vorteil fuer ein mehrkanal-setup ist dort fuer mich das ich alle 6 Filter auf einen Blick habe und die Filterpeaks entsprechend relativ zueinander ausrichten kann (vermutlich auch nur weil ich absoluter acourate Laie bin... :oops: ).

Viele Gruesse,
Tobias

Verfasst: 04.01.2018, 19:54
von Buschel
Hi Tobias,

der Vorteil von minimalphasigen Filtern ist, dass sie keinen Zeitversatz einbringen, und sie sind zumindest mit Acourate nur 1 Klick entfernt. Die zeitoptimierten Filter mit Laufzeitkorrektur bringen immer noch einige Millisekunden an Verzögerung. In meinem Beispiel aus dem ersten Beitrag braucht man 3x mehr Verzögerung (etwa 20 ms) als man davon an Laufzeitkorrektur nutzen kann (etwa 6-7 ms).

Das Schnippeln mit wav-Editoren ist vollkommen in Ordnung. Der Vorteil von Acourate beim Schnippeln ist vor allem, dass man sofort die Auswirkungen auf Phase/GLZ und Frequenzgang sieht und mit dem nicht verändertem Filter vergleichen kann.

Grüße,
Andree

Verfasst: 05.01.2018, 00:40
von Gnom52
Buschel hat geschrieben: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.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.
Buschel hat geschrieben:der Vorteil von minimalphasigen Filtern ist, dass sie keinen Zeitversatz einbringen, und sie sind zumindest mit Acourate nur 1 Klick entfernt.
Arthur4ik hat geschrieben:3) Blu-Ray Laufwerk + evtl. sowas wie A*yDVD HD + (ne schöne Kombi: MPC-HC + LAV Filters + madVR + ReClock) am PC intern/extern ist doch viel einfacher?

https://mpc-hc.org/
http://madvr.com/
https://jriver.com/video.html
Hallo Andree
Danke für Deine Überlegungen zu FIR und Minimalphasigen Filtern.
Seit div. Jahren war für mich gesetzt, Audio kann ich verzögern, Video nicht.

Aber Arthur(4ik) hat mit seiner Antwort bei mir neues Interessse geweckt. Der "mpc-hc" kann Audio und Video um +/- 2000ms gegeneinander verzögern/verschieben.
Damit könnte ich die FIR-Filter - ohne einen weiteren Klick - nutzen. Mir fehlt nur noch der Punkt, an dem ich den Convolver auf dem PC/mit mpc-hc in die Audio-Kette klemme.

GrüÜüsse
Wolfgang

Verfasst: 05.01.2018, 07:55
von Buschel
Hallo Wolfgang,

wenn dein Player keine Möglichkeit zum Einbinden hat (ich kenne und nutze mpc-hc nicht), musst du einen online convolver einsetzen, der dir virtuelle Soundkarten bietet. Unter Windows geht das z.B. mit AcourateConvolver, unter Linux mit einer Kombination von snd-aloop und brutefir. Richtig konfiguriert bieten diese Setups dann virtuelle Soundkarten als Eingang in den convolver an. Dein Player gibt Audio an diese virtuelle Soundkarten aus, der convolver wendet die Filter an und letztlich Audio über das Audiointerface aus.

Grüße,
Andree