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

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