Forum: Digitale Signalverarbeitung / DSP / Machine Learning Digitaler Tschebyscheff-Filter


von Thomas (Gast)


Lesenswert?

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.

von doofi (Gast)


Lesenswert?

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.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

hier der quelltext als datei:

von doofi (Gast)


Lesenswert?

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.

von R. M. (exp)


Lesenswert?

#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 ?

von Thomas (Gast)


Lesenswert?

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

von R. M. (exp)


Lesenswert?

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)

von R. M. (exp)


Angehängte Dateien:

Lesenswert?

Habs mal in Java übersetzt -> gleiches Ergebnis.

Meiner Meinung nach sind die Formeln Mist.

von codehamster (Gast)


Lesenswert?

Falls du Matlab hast versuchs mal mit dem fdatool

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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)

von Detlef _. (detlef_a)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

Laufen ab 0, habs so gemacht wie in der "Anleitung"

von R. M. (exp)


Angehängte Dateien:

Lesenswert?

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

von R. M. (exp)


Lesenswert?

... 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
Noch kein Account? Hier anmelden.