Forum: Digitale Signalverarbeitung / DSP / Machine Learning IIR Butterworth Filterkoeffizienten


von srottensteiner (Gast)


Lesenswert?

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

von Werner (Gast)


Lesenswert?

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.

von srottensteiner (Gast)


Lesenswert?

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?

von Helmut L. (helmi1)


Angehängte Dateien:

Lesenswert?

Einfach CalcLowPass oder CalcHighpass aufrufen. dann werden die 
Koeffizienten fuer Butterworth berechnet. Die liegen dann im Q31 Format 
b.z.w. Floatformat vor.

von srottensteiner (Gast)


Lesenswert?

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?

von Helmut L. (helmi1)


Lesenswert?

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.

von Robert K. (Firma: Medizintechnik) (robident)


Lesenswert?

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
Noch kein Account? Hier anmelden.