mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Digitaler IIR Filter nach Atmel Appnote


Autor: ape (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.