Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR Filter Design Software


von Hauke R. (lafkaschar) Benutzerseite


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Füge mal folgendes am Anfang ein:
1
#include <stdint.h>
2
3
typedef int8_t __int8;
4
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.

von Hauke R. (lafkaschar) Benutzerseite


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)

von Hubert (Gast)


Lesenswert?

Tolles Programm, ja...

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

von Hauke R. (lafkaschar) Benutzerseite


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?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Hauke R. (lafkaschar) Benutzerseite


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.)

von Juppi (Gast)


Lesenswert?

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

von Hauke R. (lafkaschar) Benutzerseite


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.

von Andreas S. (andreas) (Admin) Benutzerseite


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.

von Detlef _. (detlef_a)


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

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.