Hallo,
ich uss ein IIR-Filter in C realisieren.
Also habe ich mir diesen mit MATLAn fdatool entworfen und die
Koeffizienten rausgeben lassen.
Numerator:
0,25
0,5
0,25
Denominator:
1
-1,88859..
0,894476..
Gain:
0,0058868..
Output gain:
1
Als nähstes muss die Gleichung aufstellen, nur weiss ich jetzt nicht
was ich mit Gain machen soll. Soll ich jeden ungefilterten Wert damit
multiplizieren? Oder kann ich gleich alle Numeratoren
durchmultiplizieren? Warum hat das Programm es von selber nicht
gemacht?
Gruss,
Alex
Das Filter hat ne Gleichspannungsverstärkung von 169.89(wenn Du immer
Einsen reinschiebts, kommt nach der Einschwingzeit des Filters immer
169.89 raus), der Kehrwert davon ist der angegebene gainwert. Wenn die
Gleichspannungsverstärkung 1 sein soll, muß Du die
Numeratorkoeffizienten mit der gain multiplizieren.
Cheers
Detlef
Das heisst wemm ich die Gleichspannungsverstärkung behalten will, muss
ich Gain nicht bei der berehnung berücksichtigen?
Die Gleichung währe:
[b0 + b1*z^(-1) + b2*z^(-2)] / [1 - a1*z^(-1) + a2*z^(-2)] =
gefilterter Wert
ist das richtig?
Gruss,
Alex
>Das heisst wemm ich die Gleichspannungsverstärkung behalten will, >muss
ich Gain nicht bei der berehnung berücksichtigen?
So ist es.
>Die Gleichung währe:>[b0 + b1*z^(-1) + b2*z^(-2)] / [1 - a1*z^(-1) + a2*z^(-2)] => gefilterter
Nee, das ist die Übertragungsfunktion. Zur Filterberechnung in C siehe
meine Einlassungen in
http://www.mikrocontroller.net/forum/read-10-232270.html#232983
Cheers
Detlef
also bei mir ist es so, ich lese kontinuirlich werte ein und mein Filter
soll auch nach jedem eingelesenem Wert einen gefilterten Wert liefern.
Kann ich da bei der Berechnung die 2Direktform (oder auch die 2
Kanonische Form genannt) verwenden?
Irgendwie versehe ich dein C-Code nicht ganz.
Gruss,
So sieht das aus in der zweiten kanonischen Direktform:
z2, z1 sind die Zustandsgrößen Deines Filters, x kommt rein, y geht
raus, r ist ne Hilfsvariable, das Rumschieben der Zustrandsgrößen kann
man sich in ner unübersichtlicheren Implementation auch sparen.
z1=0;z2=0;
for(;;){
r=a1*z1+a2*z2;
y=b0*(x-r)+b1*z1+b2*z2;
z2=z1;
z1=x-r;
}
Hallo,
bist du sichet das es stimmt?
ich habe das ganze mit ein paar Werten nachgerechnet und für y kommen
gfalschen Zahlen raus.
Nachfolgend ist eine Tabelle dargestellt, die Werte x werden
nacheinander eingelesen:
x r y z2 z1
45 0 11,25 0 45
49 -84,987 55,99 45 133,987
51 -212,8 88,19 133,987 263,8
45 217,24 ... ... ....
..
Gruss,
Alex
>bist du sichet das es stimmt?
"Woran arbeiten Sie?" wurde Herr K. gefragt. Herr K. antwortete:
"Ich habe viel Mühe, ich bereite meinen nächsten Irrtum vor."
(Bertolt Brecht)
Nein, natürlich war ich nicht sicher, aber diesmal hats gestimmt.
folgendes Matlab script liefert die Folge
y = 11.2500 55.9966 144.1918 271.2316
clear
fb=[0.25 0.5 0.25];
fa=[1 -1.88859 0.894476];
x=[45 49 51 45 ];
y=filter(fb,fa,x);
return
Das gleiche Ergebnis liefert folgendes C-Programm
#include <stdio.h>
void main()
{
double z1=0.0,z2=0.0,r,y;
double x[]={45., 49. ,51., 45.};
double b0=0.25,b1=0.5,b2=0.25;
double a1= -1.88859 , a2=0.894476;
int k;
z1=0;z2=0;
for(k=0;k<4;k++){
r=a1*z1+a2*z2;
y=b0*(x[k]-r)+b1*z1+b2*z2;
z2=z1;
z1=x[k]-r;
printf("%f \n",y);
}
}
Bei Dir ist noch nen bug drin. Debuggen: Berechne Dir mit Matlab die
Impulsantwort, also eine 1 und dann für alle Zeiten Nullen, bei Deinem
C-Programm muß dasgleiche rauskommen.
Cheers
Detlef
Hallo Detlef,
was ich nicht verstehe,wenn ich immer die selben Zahlen z.B. 144
reinschiebe, dann soll doch am Ausgang auch 144 rauskommen. Sonst währe
es ja kein Filter.
Das mit Matlab :
fb=[0.25 0.5 0.25];
fa=[1 -1.88859 0.894476];
x=[144; 144; 144; 145; 148; 142; 150;...]
y=filter(fb,fa,x)*0,00889;
funktioniert gut. Es dauert nur bis der Filter sich einschwingt.
Aber beim C-Prog. steigen die Werte kontinuirlich weiter.
Was ist bei mir falsch???
Ich habe die Koeffizienten mit FDATOOL entworfen und mein Signal mit
100000 Werten dadurch durchlaufen lassen, es kommen auch richtige Werte
raus.
Gruss,
Alexander
Hallo Detlef,
Sorry, das C-Programm funktioniert auch! habe vergessen mal 0.008859 zu
nehmen.
Habe aber noch eine Frage, wie kann man es machen das der Filter sich
schneller einschwingt?
Hi,
Einschwingzeit und Frequenzverhalten hängen zusammen: Je steiler das
Filter ist, umso länger schwingt es ein. Wenn Du willst, daß es kürzer
einschwingt muß Du es weniger 'scharf' machen.
Cheers
Detlef
Hallo alle zusammen,
wo kann ich ein Tutorial finden, dass Gleichungen zur
Koeffizientenbestimmung von IIR-Filtern enthält. Mich interessiert die
mathematische Vorgehensweise bei der Berechnung.
Danke.
Zur Koeffizientenbestimmung von IIR-Filtern gibt es Gleichungen ohne
Ende, das ist ne weites Feld, heißt 'Filterentwurf', da denken Profs
und schwitzen Studis drüber. Es kommt drauf was Du willst. Googeln
sowieso und die Hilfe von Matlab ist auch ganz ok.
Cheers
Detlef