IIR Butterworth Filterkoeffizienten

Gast #2692387
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
Gast
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.
Gast
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?
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.