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
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.