Ich brauche eine Art Frequenzweiche für einen AVR. Geht in die Richtung Beitrag "Audio Equalizer" Als einfachste Rechnung habe ich einen TP gebaut, der so funktioniert: TPWert(t+1) = TPWert(t)*0,9 + Input(t)*0,1 was zu einem -6dB Verhalten oberhalb der GF führt. Als Hochpassausgang nehme ich einfach den Rest, also HPWert(t+1= = Input(t) - TPWert(t+1). Frage 1: Ist das so ok, oder muss ich den TPWert(t) nehmen, um die Differenz zu bilden? Ich weiß, dass ich den HP auch anders, getrennt berechnen kann, muss aber in dem Fall sicherstellen, dass zu jedem Zeitpunkt die Summe aus beiden Werten wieder ein weißes Signal ergibt, so als wäre es ungefiltert. Frage 2: Kann ich das kaskadieren, also einfach zwei hintereinanderschalten? Wie muss ich die Dämpfung/Trennung einstellen? Kleiner, Grösser oder genau gleich dem Wert im ersten Filter? Beim Probieren scheint es so zu sein, dass der Knick beim gleichen Wert auch an derselben GF liegt und ab dann die erwünschten 12dB auftreten. Kann ich auch dann wieder einfach die Differenz zwischen dem Input und dem zweifach gedämpften TP bilden?
Zur Berechnung analoger Frequenzweichen habe ich hier mal Literatur gepostet: Beitrag "Re: Rechtecksignal in Tiefpassfilter"
Moin, Rechenfreak schrieb: > Als einfachste Rechnung habe ich einen TP gebaut, der so funktioniert: > TPWert(t+1) = TPWert(t)*0,9 + Input(t)*0,1 was zu einem -6dB Verhalten > oberhalb der GF führt. Als Hochpassausgang nehme ich einfach den Rest, > also HPWert(t+1= = Input(t) - TPWert(t+1). Hm - 0.9 und 0.1 sind so dezimal, mit 0.875 und 0.125 ging's sicher schneller ;-) > Frage 1: Ist das so ok, oder muss ich den TPWert(t) nehmen, um die > Differenz zu bilden? So ausm Bauch raus koennt's schon passen, guck' einfach, ob wenn du in den Apparat einen Dirac reingibst auch die Summe von TP und HP Antwort einen Dirac ergeben. > Ich weiß, dass ich den HP auch anders, getrennt berechnen kann, muss > aber in dem Fall sicherstellen, dass zu jedem Zeitpunkt die Summe aus > beiden Werten wieder ein weißes Signal ergibt, so als wäre es > ungefiltert. Wenn du das so haben willst, dann passt das schon so. > Frage 2: Kann ich das kaskadieren, also einfach zwei > hintereinanderschalten? Ja kannst du schon machen, aber da kommt nix allzu dolles dabei raus. Du kannst damit nur immer einen reellen Pol in deinem Filter kriegen, kein kongungiert-komplexes Polpaar. Das brauchts aber bei allen "vernuenftigen" Filterapproximationen mit Ordung >1. > Kann ich auch dann wieder einfach die Differenz zwischen dem Input und > dem zweifach gedämpften TP bilden? Ja. Gruss WK
Danke für die bisherigen Antworten. Dergute W. schrieb: > damit nur immer einen reellen Pol in deinem Filter kriegen, > kein kongungiert-komplexes Polpaar. Danke für diesen input. Dazu muss ich aber nochmals Literatur wälzen, was das nochmals genau war. Ich frage dann später gfs. nochmals nach. Christoph db1uq K. schrieb: > Zur Berechnung analoger Frequenzweichen habe ich hier mal Literatur > gepostet: > Beitrag "Re: Rechtecksignal in Tiefpassfilter" Ok, aber das bezieht sich doch auf reelle Bauteile. Kriege ich das auch in überschaubare SW hinein?
Um bei der Frequenzweiche einen Übergang zu erreichen, der möglichst keinen Pegelsprung oder Phasenänderung hat, bietet sich ein Linkwitz-Riley Crossover an. Digital lässt sich dieser mit 4 IIR Butterworth Filter implementieren (-> LR4). Jeweils 2 hintereinander geschaltete Filter werden als TP, 2 als HP verwendet. Als Filter-Algorithmus sollte man die klassiscche Bi-Quad Implementierung verwenden, für die Koeffizienten-Berechnung finde ich dieses Excel-Sheet sehr praktisch: https://www.minidsp.com/images/fbfiles/files/All_digital_coefs_v1-20101026.zip https://www.minidsp.com/applications/advanced-tools/advanced-biquad-programming
Rechenfreak schrieb: > Ok, aber das bezieht sich doch auf reelle Bauteile. Kriege ich das auch > in überschaubare SW hinein? Du als Rechenfreak wirst da keine Probleme haben.
Gunar schrieb: > Du als Rechenfreak wirst da keine Probleme haben. Danke für diesen hilfreichen Beitrag. Dergute W. schrieb: > Wenn du das so haben willst, dann passt das schon so. Das war der erste Denkansatz. Allerdings sehe ich, dass es bei Rechtecken zu enormen Sprüngen kommt, weil der Tiefpassanteil in der Phase wegläuft und das Abziehen zu einem gewaltigen Offset führt. Joe F. schrieb: > Linkwitz-Riley Crossover an Eigentlich wollte ich das möglichst einfach halten, wegen der Rechenzeiten. Würde denn dieses Filter das Problem der Phase beheben? D.h. kommt der HP dann auch so raus, dass er phasenverschoben ist und ohne Offset kommt - trotzdem aber die Summe perfekt passt?
Moin, Rechenfreak schrieb: > Allerdings sehe ich, dass es bei > Rechtecken zu enormen Sprüngen kommt, weil der Tiefpassanteil in der > Phase wegläuft und das Abziehen zu einem gewaltigen Offset führt. Da kann ich dir nicht folgen. Das klingt komisch. Was stellst du denn auf dem Bild dar? Schraubst du da von links nach rechts auch an der Grenzfrequenz? Joe F. schrieb: > Um bei der Frequenzweiche einen Übergang zu erreichen, der möglichst > keinen Pegelsprung oder Phasenänderung hat, bietet sich ein > Linkwitz-Riley Crossover an. Linkwitz-Riley TP/HP Kombis haben eine (kleine) Beule in der Gruppenlaufzeit um die Grenzfrequenz herum. Daher ist die Summer der (Dirac)Impulsantworten von HP und TP kein Dirac. Nochdazu ist der Rechenaufwand fuer so ein "serioeses" Filter (aufm AVR) deutlich hoeher. Gruss WK
Dergute W. schrieb: > Schraubst du da von links nach rechts auch an der > Grenzfrequenz? Würde der Rechteck dann nicht an allen Ecken runder werden? Das sieht sehr nach Lade- und Entladekurve aus, so als käme Kapazität hinzu.
Rechenfreak schrieb: > TPWert(t+1) = TPWert(t)*0,9 + Input(t)*0,1 Du rechnest aber hoffentlich nicht mit Floats? Mit Int wäre es: tpwert8 := tpwert8 - tpwert8 div 8 + input; tpwert8 ist 8mal so groß wie der Eingangswert. Das ist nötig um Summierung von Rundungsfehlern zu vermeiden. Natürlich muss der 8fache Eingangsbereich in die Variable passen. div 8 macht ein Shiftright, was wenige Takte dauert. Alles andere dauert deutlich länger. Teiler muss unbedingt 2^n sein. Mit anderen Teilern wird eine Software-Division aufgerufen, die ewig dauert. Es gibt noch einen Rundungsfehler mit div 8, sind die Werte nur positiv kann man das so vermeiden: tpwert8 := input + tpwert8 - (tpwert8 + 4) div 8;
Karl K. schrieb: > Es gibt noch einen Rundungsfehler mit div 8, sind die Werte nur positiv > kann man das so vermeiden: > > tpwert8 := input + tpwert8 - (tpwert8 + 4) div 8; Die Technik ist mir bekannt, aber es muesste auch für negative Werte klappen. Ich runde meistens in einem Schritt und entscheide dann über Addition und Subtraktion. Dergute W. schrieb: > Schraubst du da von links nach rechts auch an der > Grenzfrequenz? Ja sicher, dass ist ein konstantes Rechteck mit variabler Grenzfrequenz und zeigt die Aufteilung in tiefe und hohe Frequenzen. Im Prinzip ist das Ergebnis richtig, weil HP ja aus Eingang - TP gebildet wird. Da aber der Eingang auf Phase 0 liegt und der TP phasenverschoben ist kommt hintenraus sehr viel offset rein. Es wäre wünschenswert, wenn der HP mitverzögert würde. Ich habe aber keinen Schimmer wie man das macht und wie das geht. Dergute W. schrieb: > Linkwitz-Riley TP/HP Kombis haben eine (kleine) Beule Das hört sich aber so an, dass das geeigneter sein könnte. Der Wiki-Artikel unterscheidet offenbar Butterworth und L-R-Filter und zeigt, dass das L-R zweiter Ordnung diese Beule nicht haben soll. Oder beträgt die nur nicht die in der blauen Kurve dargestellten 3dB? https://de.wikipedia.org/wiki/Linkwitz-Riley-Filter Auf der Seite Linkwitzlab wird in der Originalpublikation auch eine flache Kurve als Summe aufgeführt. Die 180°Phasenverschiebung-Thematik muss ich nochmals prüfen, aber das Filter käme mir schon entgegen. Leider tue ich mich schwer die Formeln in eine Vorschrift in den Zeitbereich zu übersetzen. Hier wird das auch angesprochen: Beitrag "Linkwitz-Riley Filter bauen" Und vor allem hier: Beitrag "1 - Tiefpass = Hochpass" Bringt mich aber auch noch nicht direkt auf die Formeln. Was ich den Grafiken entnehme ist, dass einem ein TP+HP und dann ein HP+TP aufgezogen wird. Aus der NT kann ich mich noch dunkel an solche Dinge wie Phasenkompensation erinnern. Wie auch immer: In diesem Bericht wird auf die Konstellation der Lautsprecher abgehoben. Dabei kommt eine anzuwendende Zeitverzögerung vor: https://www.rane.com/note160.html Versteht das jemand wie man das verzögern muss?
Moin, Rechenfreak schrieb: > Ja sicher, dass ist ein konstantes Rechteck mit variabler Grenzfrequenz > und zeigt die Aufteilung in tiefe und hohe Frequenzen. > > Im Prinzip ist das Ergebnis richtig, weil HP ja aus Eingang - TP > gebildet wird. Ja, so seh' ich das dann auch. Rechenfreak schrieb: > Da aber der Eingang auf Phase 0 liegt und der TP > phasenverschoben ist kommt hintenraus sehr viel offset rein. Es wäre > wünschenswert, wenn der HP mitverzögert würde. Ich habe aber keinen > Schimmer wie man das macht und wie das geht. Naja dein Tiefpass hat halt auch alles andere als eine konstante Gruppenlaufzeit. Die Kroete musst du um der Einfachheit halber schlucken. Im Durchlass ist die so von 9..0 samples. Du kannst dein Eingangssignal mal so um 4..5 Samples verzoegern, bevor du von ihm den TP abziehst, um den HP zu erhalten. Die Beule in der Gruppenlaufzeit bei den LR-Filtern sieht man nirgends auf den Bildern. Im engl. Wikipediaartikel kann man's lesen, wenn man drauf achtet: > However, crossovers of higher order than 4th may have less usability > due to their complexity and increasing peak in group delay around > crossover frequency. Aber ist auch klar, denn LR-Filter bestehen aus kaskadierten Butterworthfiltern. Und Butterworth hat eben eine kleine GLZ-Beule, sonst waer's ein Bessel und kein Butterworth... Rechenfreak schrieb: > Das hört sich aber so an, dass das geeigneter sein könnte. Das musst du wissen, ob dir das eher taugt. Und ob du's schnell genug rechnen kannst. Gustl B. schrieb: > Würde der Rechteck dann nicht an allen Ecken runder werden? Nein. > Das sieht > sehr nach Lade- und Entladekurve aus, so als käme Kapazität hinzu. Jepp. Das gehoert dann genauso. Gruss WK
Karl K. schrieb: > Du rechnest aber hoffentlich nicht mit Floats? die Frage ist berechtigt aber immer noch unbeantwortet!
Rechenfreak schrieb: > Leider tue ich mich schwer die Formeln in eine Vorschrift in den > Zeitbereich zu übersetzen. https://ccrma.stanford.edu/~jos/filters/Biquad_Software_Implementations.html https://en.wikipedia.org/wiki/Digital_biquad_filter
Moin, Naja, ob nach einer Linkwitz-Riley HP/TP-Kombi das aufgesplittete Rechtecksignal jetzt "schoener" aussieht, als nach der hier urspruenglich verwendeten Methode? Mehr CPU_Bumms/Sample braucht man auf jeden Fall... Gruss WK
Dergute W. schrieb: > Naja, ob nach einer Linkwitz-Riley HP/TP-Kombi das aufgesplittete > Rechtecksignal jetzt "schoener" aussieht, als nach der hier > urspruenglich verwendeten Methode? Musst Du halt ein Filter dahinterschalten. ;-)
Dergute W. schrieb: > ob nach einer Linkwitz-Riley HP/TP-Kombi das aufgesplittete > Rechtecksignal jetzt "schoener" aussieht, als nach der hier > urspruenglich verwendeten Methode? Ich kann irgendwie nicht erkennen, was dein Diagramm darstellt. Und auch weiss ich nicht, was an einem gefilterten Rechtecksignal als "schön" durchgeht und was nicht. Filter beurteile ich in der Regel mit Hilfe von Sinus-Sweeps und den daraus resultierenden Kurven (Amplitude, Phase).
:
Bearbeitet durch User
Moin, Joe F. schrieb: > Ich kann irgendwie nicht erkennen, was dein Diagramm darstellt. Das stellt jeweils den zeitlichen Verlauf des Ausgangssignal nach einem Hoch- und einem Tiefpass dar, wenn man einen nullsymmetrischen Rechteckburst mit Grundfrequenz in der Naehe der Uebernahmefrequenz der Filter reinschickt. > Und auch weiss ich nicht, was an einem gefilterten Rechtecksignal als > "schön" durchgeht und was nicht. > Filter beurteile ich in der Regel mit Hilfe von Sinus-Sweeps und den > daraus resultierenden Kurven (Amplitude, Phase). Das weiss ich eben auch nicht. Aber das war wohl ein Grund, diesen Thread zu eroeffnen. Und je nachdem was man vorhat, kann ein Filter ruhig auch von aus der Filterantwort im Zeitbereich her definiert werden. Weil wir das aber nicht wissen, und weil Linkwitz-Riley hier genannt wurde und ich heute frueh aus dem Fenster schaute und mir dachte: "Was fuer ein wunderschoener Herbsttag, da muss ich doch gleich mal schauen, wie so eine Filterkombi auf einen Rechteckburst reagiert", schrub ich meinen vorhergehenden Post in diesem Thread ;-) Gruss WK
Joe F. schrieb: > Filter beurteile ich in der Regel mit Hilfe von Sinus-Sweeps und den > daraus resultierenden Kurven Wenn ich eine PWM filtern will interessiert mich das schon, wie der Filter auf einen steilen Anstieg reagiert, und Linkwitz-Riley scheint hier ziemlich abzukacken. Etwas, das man in einem Sinus-Sweep anscheinend nicht sieht.
Karl K. schrieb: > und Linkwitz-Riley scheint > hier ziemlich abzukacken. Das kann man von Biquads wohl so pauschal nicht sagen... Ursprünglich war von "Audio" und "Frequenzweiche" die Rede, und dafür sind die wunderbar geeignet. Wozu willst du denn eine PWM durch eine Frequenzweiche schicken? Tiefpassfiltern (mit höherer Ordnung) würde ich ja noch verstehen, aber was interessiert einen dabei der HP Anteil?
Joachim B. schrieb: > die Frage ist berechtigt aber immer noch unbeantwortet! Nein, Integer, entsprechend hoch skaliert. Das sollte kein Problem sein, oder? Joe F. schrieb: > Rechenfreak schrieb: >> Leider tue ich mich schwer die Formeln in eine Vorschrift in den >> Zeitbereich zu übersetzen. https://ccrma.stanford.edu/~jos/filters/Biquad_Software D.h. der biquad ist der Linkwitz-Riley? - bzw. der LR gehört zu den biquads? Ich habe inzwischen weitergelesen und sehe sich widersprechende Darstellungen. Ich hatte oben schon gemutmaßt, dass das Filter so aufgebaut sein müsse, dass jeweils ein HP und ein LP verschaltet sind, jedenfalls bei dem "2. Ordnung". HighPath = HPF + LPF und LowPath = LPF + HPF. Das erkenne ich an der biquad-Struktur noch nicht wieder. Das ist ja nur ein Pfad (?). Die Struktur kenne ich gleichwohl, ich nehme an dass ich die Koeffizienten aus dem Kochbuch von RBJ entnehmen kann. Dazu habe ich auf dessen DSP-Seite einiges gefunden. Demnach müsste ich den biquad 4x nehmen und jeweile 2 HP und 2 TP aufbauen, wobei ich annehme, dass die HPs und TPs jeweils identisch sind?
Joe F. schrieb: > Das kann man von Biquads wohl so pauschal nicht sagen... > Ursprünglich war von "Audio" und "Frequenzweiche" die Rede, und dafür > sind die wunderbar geeignet. Ja, das ist die Anwendung. > Wozu willst du denn eine PWM durch eine Frequenzweiche schicken? Weil die im Rahmen der Signalverarbeitung durchaus vorkommen könnte. > Tiefpassfiltern (mit höherer Ordnung) würde ich ja noch verstehen, aber > was interessiert einen dabei der HP Anteil? Weil das auf dem HighPath herauskommt und somit dem Verstärker des HT zugeführt wird. Um das technisch sinnvoll zu nutzen muss natürlich noch eine Bandbegrenzung des Highpath rein, als z.B. 25-30kHz. Die Frage ist, ob man das nicht VOR das Trennfilter einbaut, wenn das Filter damit Probleme hat, oder ob es egal ist, weil hinten dasselbe rauskommt.
Phreak schrieb: > Das erkenne ich an der biquad-Struktur noch nicht wieder. Das ist ja nur > ein Pfad Ein Biquad stellt dabei nur einen 2nd-order Filter dar. Du brauchst also insgesamt 4 Biquads (2xHP, 2xTP). Wenn du den Multiplikator für Gain weglässt kommst du so auf 4x4=16 Multiplikationen insgesamt. Die LR4 Struktur sieht dann so aus:
1 | -> HP1 -> HP2 -> OUTPUT_HP |
2 | / |
3 | INPUT -o |
4 | \ |
5 | -> LP1 -> LP2 -> OUTPUT_LP |
Aus irgendeinem Grund, den ich gerade nicht finde, habe ich unterschiedliche Q's für die jeweils hintereinander liegenden Filter verwendet (0.5411 und 1.3068). Fc ist für alle 4 Filter gleich.
:
Bearbeitet durch User
Habs gerade noch mal ausprobiert. Die Qs 0.5411 und 1.3068 waren für einen Crossover mit jeweils 4 Biquads hintereinander (LR8). LR4 kann man ganz prima mit 2 jeweils identischen Biquads mit Q=0.70711 bauen. Das Produkt aller Qs (für einen Pfad) muss insgesamt 0.5 ergeben, damit der Frequenzgang der Summe flach wird. Hier ein Beispiel mit Fc=200 Hz. LP (2x): a1: 1.962980251780930 a2: -0.963653146670958 b0: 0.000168223722508 b1: 0.000336447445016 b2: 0.000168223722508 HP (2x): a1: 1.962980251780930 a2: -0.963653146670958 b0: 0.981658349612971 b1: -1.963316699225940 b2: 0.981658349612971 a0 ist jeweils 1.0 Die Koeffizienten sind im "MiniDSP" Format, evtl. muss für andere BiQuad Implementierungen bei a1 und a2 das Vorzeichen invertiert werden.
:
Bearbeitet durch User
Auf YouTube gibt es ein interessantes Video wo erklärt wird, wie man ein Audio Hochpass / Tiefpass mittels IIR Filter auf einem STM32 realisiert. https://www.youtube.com/watch?v=lNBrGOk0XzE
Egal schrieb: > Auf YouTube gibt es ein interessantes Video Ich will ja nicht meckern, aber ist es wirklich hilfreich 30 Minuten lang jemandem mit sehr anstrengendem Akzent auf youtube zuzuhören, nur um zu erfahren, dass man Audioprocessing mit dem STM32 machen kann? Die Musik am Ende des Videos ist ja sehr hübsch anzuhören, aber eigentlich möchte man lieber Messergebnisse sehen... ;-) Zum Glück gibts da ja noch den Link zu seinem Git-Repository, und da entdeckt man dann, dass die Filterparameter leider sehr ungeeignet für einen Crossover sind. Der Crossoverbereich ist "dank" niedriger Filterordnung (nur je 1 Biquad für HP und TP) sehr groß. Mit Q=0.7 gibt es an der Crossoverfrequenz eine hässliche +3dB Delle. Und nicht erwähnt wird, dass entweder HP oder TP um 180° in der Phase gedreht werden müssen. Nicht wundern, bei meiner Grafik ist der Crossoverpunkt bei 500 Hz, das liegt daran, dass mein Sweep mit 48KHz läuft und die Koeffizienten in dem STM32 Demo-Programm für 96 KHz sind. Das Problem dürfte aber trotzdem sichtbar sein.
Joe F. schrieb: > Ich will ja nicht meckern, aber ist es wirklich hilfreich 30 Minuten > lang jemandem mit sehr anstrengendem Akzent Das ist auch mein Eindruck mit den ganzen Möchtegerns auf dieser Plattform. Drehen ein Video zur Selbstdarstellung und ommeln minutenlang herum, für wenig Information. Da fragt man lieber in einem Fachforum. Danke für deine Bemühungen. Bringt mich weiter!
Karl K. schrieb: > tpwert8 := input + tpwert8 - (tpwert8 + 4) div 8; Das gibt aber sattes digitales Rauschen!
Karl K. schrieb: > tpwert8 ist 8mal so groß wie der Eingangswert. Das ist nötig um > Summierung von Rundungsfehlern zu vermeiden. Natürlich muss der 8fache > Eingangsbereich in die Variable passen. Wieso ausgerechnet 8? Jürgen S. schrieb: > Karl K. schrieb: >> tpwert8 := input + tpwert8 - (tpwert8 + 4) div 8; > Das gibt aber sattes digitales Rauschen! Wie ließe es sich vermeiden? Größere Vektorbreite?
Mark schrieb: >> Das gibt aber sattes digitales Rauschen! > Wie ließe es sich vermeiden? Richtig(er) runden. So ist es immer die 0,5. Das geht schlauer und braucht je nach Abtastung auch weniger Bits. D.h. man kann damit auch die Auflösung im letzten Bit genauer hinbekommen. Hängt vom akzeptablen Rauschspektrum und dessen Lage ab. > Größere Vektorbreite? Die hilft unabhängig davon ebenfalls und je einfacher / schlechter man rundet, desto mehr Zusatzbits braucht es. Rechenfreak schrieb: > Kann ich auch dann wieder einfach die Differenz zwischen dem Input und > dem zweifach gedämpften TP bilden? Ja sicher, ergibt aber eine um so größere Phasenverschiebung. Dieser einfache Filter hat eine zunehmende Phasenverschiebung mit der Frequenz.
Joe F. schrieb: > unterschiedliche Q's für die jeweils hintereinander liegenden Filter > verwendet (0.5411 und 1.3068). Fc ist für alle 4 Filter gleich. Kann es sein, dass die LP das größere Q haben? Vielleicht dazu, damit sie in Relation schmalbandiger sind, aber real dieselbe Bandbreite aufweisen wie die LP mit geringerem Q?
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.