mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP FIR Filter Design Software


Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich steige gerade so ein bisschen in die digitale Filtertechnik ein.

Nach etwas suchen habe ich ein kostenloses Tool zum berechnen der 
Filterkoeffizienten gefunden, dass auch direkt C code produzieren kann.
http://www.winfilter.20m.com/

Das Programm gefällt mir besonders, weil man angeben kann als was man 
die Filterkoeffizienten haben will (8bit - 16bit - float)

Nur leider funktioniert der produzierte C-Code nicht :(

Ich finde leider auch keinen Fehler, vielleicht liegts daran, dass ich 
mich erst seid gestern damit beschäftige ;)

Vielleicht kann ja mal jemand durchschauen und sagen: "Ist doch klar da 
liegt dein Fehler" ;)

Vielen Dank.


/**************************************************************
WinFilter version 0.8
http://www.winfilter.20m.com
akundert@hotmail.com

Filter type: High Pass
Filter model: Butterworth
Filter order: 1
Sampling Frequency: 76 KHz
Cut Frequency: 5.000000 KHz
Coefficents Quantization: 8-bit

Z domain Zeros
z = 1.000000 + j 0.000000

Z domain Poles
z = 0.656873 + j -0.000000
***************************************************************/
#define Ntap 40

#define DCgain 128

__int8 fir(__int8 NewSample) {
    __int8 FIRCoef[Ntap] = {
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
           -1,
           -1,
           -1,
           -2,
           -2,
           -3,
           -5,
           -6,
           -9,
          -12,
          113,
          -12,
           -9,
           -6,
           -5,
           -3,
           -2,
           -2,
           -1,
           -1,
           -1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
    };

    static __int8 x[Ntap]; //input samples
    __int16 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: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Füge mal folgendes am Anfang ein:
#include <stdint.h>

typedef int8_t __int8;
typedef int16_t __int16;

Der Code gefällt mir aber nicht so richtig:
- die 0-Koeffizienten sind nur Rechenzeitverschwendung
- FirCoef sollte man als "const __int8" definieren
- das ist ganz bestimmt kein Butterworth-Filter, Butterworth wäre IIR.

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das mit den 0 Koeffizienten liegt an mir ... ich hab zum Testen so 
viele Taps eingegeben ...

>- FirCoef sollte man als "const __int8" definieren
Das hab ich mir auch schon gedacht ... macht wenig sinn das Array immer 
neu anzulegen.

Es ist ja nicht so, dass es garnicht funktioniert, sondern das 
Eingangssignal ist genau das Ausgangssignal (Wobei das Ausgangssignal 
nen gain von grob geschätzt 1,5 hat)

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tolles Programm, ja...

Gibt mir bei einem FIR-Filter die Fehlermeldung, dass es nicht stabil 
ist.

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmhm den fall hatte ich noch nicht ... kann bei einem FIR Filter ja auch 
nicht sein eigentlich ... Kennt jemand sonst noch eine Software die 
möglichst nix kostet und keine ewige einarbeitungszeit kostet?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja über die seite bin ich auch schon gestolpert nur funktionieren viele 
der Links nicht :( Die anderen basieren alle auf FP technik und das 
wollte ich möglichst vermeiden. Zur not müsste man die Koeffizienten 
eben umrechnen und dann am Ende das Ergebnis durch einen Faktor teilen. 
(Wie es ja auch bei der Software dich ich zu benutzen versuche gemacht 
wird)

PS: Die Einstellungsmöglcihkeiten sind bei der Software irgendwie 
schlecht ... Man kann die Anzahl der benötigten tabs nicht automatisch 
suchen lassen. So muss man etwas probieren, bis man den FIR filter am 
laufen hat. Habs jetzt hinbekommen in dem ich die Filterordung erhöht 
habe und manuell die Anzahl der Taps ausprobiert habe (Erst mal 511 Taps 
ausgewählt und geguckt wieviele davon wirklich genutzt werden.)

Autor: Juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IIR-Filter kommen nicht in Frage? Du würdest so sicher mit weniger 
Koeffizienten auskommen, mußt halt auf Stabilität achten.

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja aber ich hab gelesen, dass IIR-Filter ohne Float durch rundungsfehler 
leicht zu schwingen anfangen. Aber die werd ich mal durchtesten 
vielleicht gehts ja.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du dich auf dem Gebiet nicht gut auskennst würde ich die Finger von 
IIR-Filtern lassen, die sind besonders bei kurzen Wortlängen sehr 
unangenehm zu handhaben. Der Gewinn ist auch nicht so hoch wie im 
Normalfall, da FIR-Filter für Interpolatoren/Dezimatoren in 
Polyphasenstruktur realisiert werden können und damit deutlich schneller 
sind.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier was:
http://www.filter-solutions.com/

Filter Free is the free version of Filter Solutions. Functionality is 
limited 3rd order analog and IIR filters, and 10 tap FIR filters.

Ansonsten geht Filterentwurf sehr gut mit Matlab, mit clones wie scilab 
etc. wahrscheinlich auch. BTW: Auseinandersetzung mit Programmen, die 
instabile FIR-Filter entwerfen können, ist die reine Zeitverschwendung, 
das bringt kein Ergebnis und keinen Erkenntnisfortschritt.

Gute Nacht
Detlef

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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