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


von ape (Gast)


Angehängte Dateien:

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

von ape (Gast)


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;
}

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.