Hallo, Bin gerade bei einem aktuellen Projekt dabei, die Filterfunktionen von Matlab nachzubilden. Verwende dazu C#. Der Grund warum ich diesem Forum schreibe: Ich suche nach einem Algorithmus, um die Filterfoeffizienten eines IIR Butterworth Filters zu berechnen - das ganze sollt sich aber recht einfach programmieren lassen. Bis jetzt habe ich die Koeffizienten immer von Matlab berechnen lassen ( [b, a] = butter (n,fg,'low')). Nun möchte ich aber auch die Koeffizienten selber berechnen - am besten für einen Tiefpass (später sollen auch HP, BP sowie BS folgen). Dazu habe ich mich mal in das Thema der bilinearen Transformation eingelesen - das scheint mir aber nicht gerade der einfachste Weg um an die Koeffizienten zu kommen. Bis jetzt habe ich folgende weitere Möglichkeiten gefunden: 1) So weit ich weiß, gibt es auch eine Möglichkeit, das Pol- Nullstellendiagramm der Übertragungsfunktion als Polynom zu approximieren?! Ist das richtig? Wenn ja, wie müsste dieses Polynom aussehen, wenn ich die Ordnung des Filters variabel gestalten möchte? 2) Sinus - Cosinus Generator. Auch dazu habe ich im Netz ein paas Sachen gefunden, allerdings weiß ich nicht wie ich damit die Koeffizienten berechnen kann. Wäre super, wenn mir bei diesem Thema jemand etwas unter die Arme greifen könnte! Besten Dank Stefan
srottensteiner schrieb: > Dazu habe ich mich mal in das Thema der bilinearen Transformation > eingelesen - das scheint mir aber nicht gerade der einfachste Weg um an > die Koeffizienten zu kommen. Das Butterworthfilter ist dadurch charakterisiert, dass im Nennerpolynom der Übertragungsfunktion als frequenzabhängige Größen nur die höchste Potenz von ω auftritt. Um von da zu einem möglichst ähnlichen zeitdiskreten Filter zu kommen, führt IMHO an der Bilineartransformation so richtig kein Weg vorbei.
Danke für die Antwort. Es ist mir aber noch immer nicht ganz klar, wie ich die bilineare Transformation in c# code implementieren kann. Hat jemand von euch ein Beispielprojekt?
Einfach CalcLowPass oder CalcHighpass aufrufen. dann werden die Koeffizienten fuer Butterworth berechnet. Die liegen dann im Q31 Format b.z.w. Floatformat vor.
So...habe mir den Code durchgesehen. Allerdings habe ich noch Probleme bei den folgenden Berechnungen: // Normierung berechnen Norm = c0 + c1*l + c2*l*l; // Koeffizenten berechnen Coff->D0 = (d0-d1*l+d2*l*l) / Norm; Coff->C0 = (c0-c1*l+c2*l*l) / Norm; Coff->D1 = (2.0*(d0-d2*l*l)) / Norm; Coff->C1 = (2.0*(c0-c2*l*l)) / Norm; Coff->D2 = (d0+d1*l+d2*l*l) / Norm; Coff->C2 = Norm / Norm; Mit ist nicht ganz klar, wie man darauf kommt. Wie könnte das für ein Filter variabler ordnung aussehen? Könnt ihr mit eine gute Literatur zu diesem Thema empfehlen?
srottensteiner schrieb: > Wie könnte das für ein > Filter variabler ordnung aussehen? Filter Variabler Ordnung spaltet man in Teilfilter 1. oder 2. Ordnung auf. Wenn du das Filter nicht aufspaltet hast du das Problem das deine Koeffizienten sehr weit auseinanderliegen und das Filter dadurch sehr ungenau wird. Deshalb geht man in der Praxis ueblicherwiese dazu hin ein Filter hoehere Ordnunn in Teilfilter 1. und 2. Ordnung aufzuspalten. Das kannst du mit dieser Routine auch transformieren. Lediglich die Eingangskoeffizienten .ai und .bi sind dabei anders zu waehlen. Diese .ai und .bi sind die Koeffizienten eines entsprechenden Analogen Filters. Bei einem Butterworth Filter 4. Ordnung z.B. 1. Teilfilter 2. teilfilter .ai = 1.8478 .ai = 0.7654 .bi = 1.0000 .bi = 1.0000 Sowas kann man aus Tabellen entnehmen oder ausrechnen ai = 2 x cos ((2 x i - 1 x Pi / (2 x n) bi = 1 fuer i = 1 .. n/2 n = Ordnung des Filters i = Teilfilterindex fuer Bessel und Butterworth Filter gibt es aenliche aber komplexere Berechnungformeln. Das ganze ist in der einschlaegigen Filterliteratur beschrieben. Man geht erst von einem Analogen filter aus und rechnet dann die Koffs. mit der bilineraren Transformation um.
Mir scheint die Wurzel2 im Code etwas kurz angegeben für den Unmstand, dass mit Q30 gerundet wird. Umgekehrt ist die bilin ja nicht sonderlich genau. Müsste das nicht biquad gerechnet werden?
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.