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; }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.