Digitaler IIR Filter nach Atmel Appnote

Gast #104769
Hallo Forum,

Ich möchte auf meinem AVR einen digitalen Bandpass-Filter realisieren.
Von Atmel gibt es da ja ne Appnote die das beschreibt. Leider sind die
Sourcen die beiliegen für den IAR Compiler.
Hab den Code jetzt erstmal nach Java portiert, so dass ich auf dem PC
etwas damit rumspielen kann (also Frequenzen reinschicken und gucken
was rauskommt) beim FIR-Filter ist mir das auch gelungen. Leider lässt
sich damit aber nich wirklich nen Bandpassfilter realisieren.
jedenfalls nich mit nem 8 order Filter und viel mehr bringt der AVR
wohl nicht.

Leider funktioniert das umschreiben mit dem IIR Filter nich so gut.
Allerdings erscheint mir der Code irgendwie auch nich ganz richtig. Ich
hab mal den wesentlichen Code angehangen. Ab Zeile 252 werden die
A-Koeffizienten mit den Y-Werten multipliziert. Die Y-Werte werden aber
nicht geupdated, stattdessen erneut die X-Werte. Ich hab testweise an
dieser Stelle mal die X-Werte durch die Y-Werte ersetzt, kam aber auch
nichts wirklich sinnvolles raus.
Außerdem wird nirgendswo was mit dem A0 Koeffizienten gemacht, obwohl
er im zugehörigen PDF aufgelistet ist.

Lange Rede kurzer Sinn, hat jemand schonmal den IIR Filter aus dieser
Appnote erfolgreich implementiert? Bin so langsam am verzweifeln.

ape
Angehängte Dateien:
Gast
So hier mal mein Java Code, kommt leider nur Grütze raus.
Falls jemand den Fehler sieht...



private double[] a;    // enthält die A-Koeffizienten
private double[] b;    // enthält die B-Koeffizienten

private double[] x;    // enthält die letzten Eingangswerte
private double[] y;    // enthält die letzten Ausgangswerte

...

private double iir6(double input) {
    x[0] = input;

    // B-Koeffizienten mit X-Werten multiplizieren
    double output = b[6] * x[6];

    x[6] = x[5];
    output += b[5] * x[5];

    x[5] = x[4];
    output += b[4] * x[4];

    x[4] = x[3];
    output += b[3] * x[3];

    x[3] = x[2];
    output += b[2] * x[2];

    x[2] = x[1];
    output += b[1] * x[1];

    x[1] = x[0];
    output += b[0] * x[0];  // Hier wird der Input-Wert eingefügt


    // A-Koeffizienten mit Y-Werten multiplizieren
    output += a[6] * y[6];

    y[6] = y[5];
    output += a[5] * y[5];

    y[5] = y[4];
    output += a[4] * y[4];

    y[4] = y[3];
    output += a[3] * y[3];

    y[3] = y[2];
    output += a[2] * y[2];

    y[2] = y[1];
    output += a[1] * y[1];

    y[1] = y[0];
    output += a[0] * y[0];

    y[0] = output;

    return output;
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.