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