mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Thomas T. (runout)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Dergute W. (derguteweka)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas T. (runout)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

läuft alles im DMA-Interrupt.

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

Grüße
Runout

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.