IIR-Filter in ATMega324

Gast #1767790
Lesenswert?

Hallo, ich habe versucht, für meine Bachelorarbeit ein IIR-Filter erster 
Ordung zu implemetieren, dass das Rauschen am ADC-Eingang unterdrücken 
soll.
1
#define IIR_NUMERATOR       0xF0
2
#define IIR_DENOMINATOR     0x10
3
    // Wert Filtern und in Zielvariable schreiben
4
    stProcessData.ui16AnalogValue = (
5
      __multiply_unsigned(ui8FilterInput,IIR_NUMERATOR) +
6
      __multiply_unsigned(stProcessData.ui16AnalogValue,IIR_DENOMINATOR))>>8;

Die Koeffizienten sind mit Matlab berechnet. Sowohl Daten als auch 
Koeffizienten haben eine Breite von 8-Bit. Nun habe ich das Problem, 
dass durch Rundungsfehler kleine Änderungen sich gar nicht auswirken. 
Dem wollte ich entgegen wirken, indem ich die Auflösung der Daten 
(künstlich) erhöhe, um die Rundungsfelher zu verringern. Leider komme 
ich schon den ganzen Tag damit nicht auf einen grünen Zeig. Hat jemand 
einen Tipp in dieser Richtung?
#1767979
Lesenswert?

Als Blockdiagramm sieht das IIR-Filter so aus:
http://www.mikrocontroller.net/articles/Digitalfilter_mit_ATmega#Von_der_.C3.9Cbertragungsfunktion_zum_Programm

hier sind also nur die Koeffizienten b0 und a1 vorhanden.
Das Ergebnis ist b0 mal Eingang minus a1 * vorheriges Ergebnis.

8 Bit ist für Digitalfilter sehr wenig. Es hilft aber, das 
Zwischenergebnis möglichst lange in 16 Bit Breite zu belassen, und nur 
für den Ausgang auf die oberen 8 Bit zu beschneiden. Das kostet 
allerdings mehr Zeit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren