Forum: Digitale Signalverarbeitung / DSP / Machine Learning IIR-Filter in ATMega324


von Manuel (Gast)


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?

von Christoph db1uq K. (christoph_kessler)


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.

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.