IIR mit Festkommawerten in µC

Gast #772708
Hallo,

folgendes Problem:

Ich möchte auf einem 8-Bit-Mikrocontroller einen einfachen FIR-Filter 2. 
Ordnung implementieren. Aus Performancegründen soll die Berechnung aber 
nicht mit Fließ-, sondern mit Festkommazahlen laufen. Daher 
multipliziere ich die von Matlab berechneten Koeffizienten a_i und b_i 
mit hier 2^16. Bei Multiplikation mit den 10 Bit breiten Eingangswerten 
x ist in einer 32 Bit Variablen also ausreichend Platz. Folgender Code 
bringt mir bei meinem Tiefpass leider gar nix, das Eingangssignal wird 
nicht geglättet:
1
#define A0 65536 // ohne Multiplikation mit 2^16: 1
2
#define A1 131072 // 2
3
#define A2 65536 // 1
4
#define B1 127376 // 1.943603515625
5
#define B2 -62020 // -0.946350097656250
6

7
uint16_t t, tmax;
8
uint32_t x[1000], y[1000];
9

10
  for (t = 0; t < tmax; t++)
11
  {
12
    if (t >= 2)
13
    {
14
      y[t] = x[t] * A0 + x[t-1] * A1 + x[t-2] * A2 - B1*y[t-1] - B2*y[t-2];
15
      y[t] = y[t] >> 16)); // wieder zurücknormieren
16
    }
17
    else
18
    {
19
      y[t] = x[t];  
20
    }
21
  }
Der Algorithmus konvergiert auch erst, wenn ich bei der Rücknormierung 
einen größeren Wert als die 2^16 anwende.
Führe ich den Algorithmus jedoch ohne den zusätzlichen Faktor 2^16 und 
mit double als Datentype aus, tritt die gewünschte Wirkung ein.

Jemand Ideen?
Mal 'l' ('l' wie lima) an die interger ranhängen. Für z.B. AVR sind 
integer 16 Bit lang und da passen Deine Zahlen nicht rein.
#define A2 65536l // 1

Vielleicht wars das schon, ansonsten den Algorithmus mal aufm PC laufen 
lassen.

Gute Nacht
Detlef

PS: 17Bit Coeff, 10Bit Daten , 5Bit für die Summanden, ein Bit fürs 
Vorzeichen, das gibt nen Overflow. Bißchen zurückhaltender rangehen, 
IIRs in integer zicken gerne
Gast
Das l-Suffix werde ich morgen mal testen.

Den Code hab ich sowohl auf einem PC getestet, als auch in Matlab - mit 
dem gleichen Ergebnis.

Die Koeffizienten hab ich auch mal ein paar Bits kleiner gemacht, nützt 
ebenso wenig.

Antwort schreiben

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