Forum: Digitale Signalverarbeitung / DSP / Machine Learning Parameterwechsel BiQuad Filter on-the-fly


von blabla (Gast)


Lesenswert?

Hi Leute,

mal kurz zum Hintergrund:

Ich arbeite aktuell an einem Realtime-DSP der über ein externes SPI 
Slave Interface steuerbar ist.

Bisher sind erstmal nur Basics implementiert wie Hochpass, Tiefpass, EQ.
Die BiQuad Koeffizienten werden innerhalb des DSPs errechnet. Ich gebe 
über das SPI slave nur die Parameter wie Frequenz, Gain, Q, Typ usw. 
vor.

Ich habe jetzt mal ein paar Tests gemacht, was passiert, wenn ich 
"on-the-fly" Parameter ändere während Musik durchspielt. Die BiQuad 
Parameter werden hier also instant geändert.

Leider hört man dann (je nachdem welche Amplitude das Audiosignal grad 
hat) deutlich hörbare Pops. Ich habe ein bisschen gesucht im Internet 
und anscheinend hängt das damit zusammen, dass der Biquad kurz instabil 
wird, wenn man Parameter zu schnell ändert.

Folgender Lösungsansatz wurde genannt:
Man nehme zwei Biquad-Filter die man wechselseitig updated und dann ein 
Cross-Fade macht. Um ehrlich zu sein würde ich das aber vermeiden 
wollen, weil ich da quasi für jedes Element einen zweiten BiQuad 
vorsehen müsste und danach nochmal nachträglich summierung -> meiner 
Meinung nach verschwendete Rechenleistung.


Meine Idee war jetzt, dass ich die 5 IIR Koeffizienten quasi 
Tiefpass-Filtere mit einem Single-Pole LPF und das dann in die BiQuads 
füttere.

Denkt Ihr das Konzept würde aufgehen? Hätte hier evtl. auch Bedenken 
bzgl. Stabilität um ehrlich zu sein. Oder muss das vor der Errechnung 
der Koeffizienten passieren? Wenn ja müsste ich aber auch dort dann mit 
jeder Iteration die IIR Koeffizienten mit den Formeln neu berechnen was 
wieder viel Rechenleistung schluckt.

Hat jemand schonmal ähnliche Probleme gehabt und wie habt Ihr es gelöst?

Danke

von blabla (Gast)


Lesenswert?

Ich habe es hinbekommen.

Ich Tiefpassfiltere die Biquadparameter nochmals mit einem 1 Hz 
single-pole LPF durch.
Dadurch justieren sich die Filter dann langsam mit ner Zeitspanne von ~1 
Sekunde dann nach einem Update nach.

Stabilitätsprobleme kann ich bis jetzt keine ausmachen.

Gruß

von J. S. (engineer) Benutzerseite


Lesenswert?

blabla schrieb:
> Ich habe ein bisschen gesucht im Internet
> und anscheinend hängt das damit zusammen, dass der Biquad kurz instabil
> wird, wenn man Parameter zu schnell ändert.

Das wird gerne immer wieder so dargestellt, ist a faktisch meistens 
unrichtig. Das Filter muss nur neu einschwingen und zwar deshalb, weil 
du mit den Änderungen der Parameter sehr steilflankige Änderungen auf 
das Filter gibst. Dieses Einschwingen hat dann leider Oberwellen, die 
nicht mit der Abtastrate zusammenpassen und man hört die entsprechenden 
Harmonischen. Natürlich kann man eng dimensionierte Filter mit massiven 
Änderungen auch in einen absurden Zustand bringen, dass sie überwiegend 
schwingen. Die Plopps gibt es gleichwohl - sie sind eben jene steilen 
Änderungen.

Die Lösung ..
> Man nehme zwei Biquad-Filter die man wechselseitig updated und dann ein
> Cross-Fade macht.
löst das Problem nur scheinbar, weil du dann die tiefrequenten Anteile 
dieser Einschwingvorgänge über hast und in die Mischung bringst. Will 
man das so machen, braucht es ein langsames crossfade und damit bekommt 
man keine Reaktion mehr auf die Änderungen und kann sie getrost gleich 
weglassen.

> Meine Idee war jetzt, dass ich die 5 IIR Koeffizienten quasi
> Tiefpass-Filtere mit einem Single-Pole LPF und das dann in die BiQuads
> füttere.
Das läuft auf das gleiche hinaus. Der Unterschied ist nur, dass du 
(teilweise) im Frequenzbereich fadest. Das ist grundsätzlich 
"musikalischer" und verträglicher, verlangt aber letztens ein genauso 
langsames ändern der Parameter, um die Abtastfrequenz nicht zu 
überladen. Das Problem sind die Polynome höherer Ordnung. Mit jeder 
Ordnung geht es ins Quadrat = Oktave.

Du kommst letztlich um eine Überabtastung nicht herum.

Der Vorschlag 1 wäre eine solche Überabtastung um den Faktor 2. Um mit 
einem Filter 3. Ordnung klarzukommen, solltest du mit Faktor >6 
kalkulieren. Für die anderen Faktoren ähnlich, macht Wurzel (6x6 +4x4 
+2x2) = 8.

> Hat jemand schonmal ähnliche Probleme gehabt
andauernd ...

>und wie habt Ihr es gelöst?
Mit einem Faktor 16 :-)

48kHz Schnuckelaudio x 16 = 768kHz. Das reicht für schnelle Änderungen 
in Polynomfiltern, die noch zu plausiblen Änderungen im Audiosignal 
führen können, also Lautstärke- und Frequenzmodulationen deren Frequenz 
gering ist gegen die Basisfrequenz, also z.B. 10 Hz Potidrehung bei 
1kHz.

Damit das ganze dann 96k/192k-kompatibel wird und die entstehenden 
Harmonischen wirklich sehr klein sind, muss man aber noch mal um Faktor 
4+ steigern und will man wirkliche Ring- und Frequenzmodulation, geht es 
weiter hoch. Der schnellste Interpolator (ein CIIRC) den ich verwende, 
läuft mit der vollen FPGA-Taktfrequenz. Der ist mit der Audiofrequenz 
durchstimmbar. Wenn es ein ordentlicher IIR 6. Ordnung wäre und in einem 
DSP arbeiten sollte, würde Faktor 32-64 reichen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.