Hallo, ich habe auf einer Internetseite ein "Anleitung" für einen digitalen Tschebyscheff-Filter gefunden: http://de.academic.ru/dic.nsf/dewiki/1415923 Ich habe mir jetzt damit eine Software geschrieben, um mir die Kosntanten berechnen zu lassen. Hier mal ein Auszug: K = tan(3.14159265f*(grenz / abtast)); int order=2; float gamma=AsinH(rippledb)/order; for (int i=0; i<3; i++) { b[i]=1/( (cosh(gamma)*cosh(gamma)) - ((cos((((2*i)-1)*3.14159265f)/(2*order)))* (cos((((2*i)-1)*3.14159265f)/(2*order)))) ) ; a[i]=K *2*b[i]*sinh(gamma)*cos ( (((2*i)-1)*3.14159265f)/order); } alpha[0]=K*K; alpha[1]=2*K*K; alpha[2]=alpha[0]; beta[0]=(a[0]+alpha[0]+b[0]); beta[1]=(2*(b[1]-alpha[0])); beta[2]=(a[2]-alpha[0]-b[2]); betae[0]=beta[1]/beta[0]; betae[1]=beta[2]/beta[0]; Die beta's sind die Variablen die auf der Internetseite die beta_strich sind. betae dann die betas. So jetzt das Probelm.. Es kommen "merkwürdige" Sachen raus. Und zwar sind alle betas gleich (ich hab das mal mit dem Taschenrechner getestet und die sind wirklich gleich). Liegt am dem cosinus welcher ja periodisch mit pi ist. Und die i sind ja ganze Zahlen. Habe ich da einen Denkfehler oder ist an den Formeln was falsch? Habe die von meiner Software ausgegebenen Konstanten mal getestet und der Filter geht nicht. Habe mir mit einem Online Applet mal Konstanten berechnen lassen, Das geht, also meine Filterstruktur ist richtig.
Als was sind deine Variablen definiert? Zeig mal deinen kompletten Code. Die 3.14... durch eine Konstante (Präprozessor) ersetzen macht es etwas lesbarer. C-Code bitte in [c ] [/c (ohne Leerzeichen)] einfassen.
In tschebicalc.h: Warum includest du math.h? PI würde ich noch ein paar Nachkommastellen spendieren, wobei das zu 99,9% schon in math.h definiert sein sollte. Warum definierst du eine Konstante und nutzt sie dann nicht? Bandwürmer wie diesen
1 | b[i]=1/( (cosh(gamma)*cosh(gamma)) - ((cos((((2*i)-1)*3.14159265f)/(2*order)))* (cos((((2*i)-1)*3.14159265f)/(2*order)))) ) ; |
unbedingt verkürzen, da blickt keiner durch. Ob das eig. Problem vom Programm kommt oder die Formeln Mist sind kann ich dir nicht sagen, wenn es am Programm liegen sollte kontrollier mal auf Überlaufe.
#define PI 3.14f; <- ; gehört weg braucht man aber eh nicht weil math.h includiert wird Programm Ausgabe : Abtastefrequenz: 1000 Grenzfrequenz: 50 K= 0.158384 gamma= -1.156219 a0= 0.025086 a1= 0.050171 a2= 0.025086 b1= 1.759554 b2= -1.000000 was soll denn rauskommen ?
b2= -1.000000 das kommt immer raus, das ist falsch... b1 sollte so bei 1,8 bis 1,99 liegen und b2 so -0,8 - 0.99 aber nie genau 2 bzw 1
ja, verstehe. hab inzwischen auch einen Filter mit diesen berechneten Koeffizienten getestet und der sieht in der Tat nicht gut aus. bei der Programmumsetzung habe ich auf den ersten Blick auch keinen Fehler sehen können. (hmmm)
Habs mal in Java übersetzt -> gleiches Ergebnis. Meiner Meinung nach sind die Formeln Mist.
oder mit Scilab/Octave: http://www.mikrocontroller.net/articles/Digitalfilter_mit_ATmega http://www.scilab.org/product/man/eqiir.html Tscehbyscheff geht mit 'cheb1' oder 'cheb2' (je nach Ripple im Passband oder Stopband, Tschebyscheff gibts zweimal)
Ohne genau draufgekuckt zu haben: Du berechnest 3 a's und b's, ist das nicht dritte Ordnung? Laufen die i's der russischen Formel ab 0 oder ab 1? Fragen über Fragen. Möglicherweise mal eine sorgfältigere Quelle für Chebychew hinzuziehen. Cheers Detlef
Hab noch ein paar Sachen gefunden Term1 := cosh(gamma)*cosh(gamma) könnte laut "Anleitung (anhang) " auch interpretiert werden als cosh(gamma * gamma) Term2 := cos((((2.0*i)-1.0)*PI)/(2.0*order) sollte meiner Meinung nach heissen cos((((2.0*i)-1.0)*PI)/(order) Es hilft aber auch nix, es kommt trotzdem ein nichtrichtiges Ergebnis raus. mfg
... wobei rein mathematisch Deine Interpretation von Term1 schon richtig wäre.
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.