FIR-Filter von "Winfilter" - Performance/Skalierung

OP #5966325
Lesenswert?
• ▲
▼
Hallo Zusammen,

ich möchte auf einem STM32L4 einen FIR-Filter von "winfilter.20m.com"
verwenden. Es soll Festpunktformat sein (int16_t).
Das Programm generiert den nachfolgenden Code. (s. unten)

Der größte Koeffizient ist 19366.
Wenn ich im 16-bit-signed-Bereich bleiben möchte (-32768..32767) kann 
ich nicht mal "2" als Eingangswert verwenden.
Weiterhin hat die Routine noch einen Verschiebeloop am Anfang.
Das kostet zusätzlich Zeit. Ringpuffer wäre doch besser, oder?

Sollte dies Implementierung verwenden oder was schlaueres suchen?

Viele Grüße
runout


#define Ntap 31

#define DCgain 65536

__int16 fir(__int16 NewSample) {
    __int16 FIRCoef[Ntap] = {
            9,
           15,
           20,
           19,
            1,
          -47,
         -142,
         -287,
         -457,
         -557,
         -372,
          495,
         2680,
         7061,
        14645,
        19366,
        14645,
         7061,
         2680,
          495,
         -372,
         -557,
         -457,
         -287,
         -142,
          -47,
            1,
           19,
           20,
           15,
            9
    };

    static __int16 x[Ntap]; //input samples
    __int32 y=0;            //output sample
    int n;

    //shift the old samples
    for(n=Ntap-1; n>0; n--)
       x[n] = x[n-1];

    //Calculate the new output
    x[0] = NewSample;
    for(n=0; n<Ntap; n++)
        y += FIRCoef[n] * x[n];

    return y / DCgain;
}
#5966538
Lesenswert?
• ▲
▼
Moin,

Thomas T. schrieb:
> Wenn ich im 16-bit-signed-Bereich bleiben möchte (-32768..32767) kann
> ich nicht mal "2" als Eingangswert verwenden.

Der Akkumlator (y) ist doch 32bit; dann sollt' das schon so passen.

> Weiterhin hat die Routine noch einen Verschiebeloop am Anfang.
> Das kostet zusätzlich Zeit. Ringpuffer wäre doch besser, oder?

Mach' erstmal so; wenn du dann meinst, dass du da noch irgendwo viel 
Zeit schinden kannst (und unbedingt musst), dann kannst du's immernoch 
aendern.

Gruss
WK

Antwort schreiben

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.

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.