Forum: Mikrocontroller und Digitale Elektronik FIR-Filter von "Winfilter" - Performance/Skalierung


von Thomas T. (runout)


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;
}

von Dergute W. (derguteweka)


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

von Thomas T. (runout)


Lesenswert?

Danke,

läuft alles im DMA-Interrupt.

Habe jetzt Lösung mit Ringpuffer und .Q15-Format.

Grüße
Runout

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.