mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Digitaler Tschebyscheff-Filter


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: doofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier der quelltext als datei:

Autor: doofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: R. M. (exp)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. M. (exp)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: R. M. (exp)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habs mal in Java übersetzt -> gleiches Ergebnis.

Meiner Meinung nach sind die Formeln Mist.

Autor: codehamster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls du Matlab hast versuchs mal mit dem fdatool

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder mit Scilab/Octave:
http://www.mikrocontroller.net/articles/Digitalfil...
http://www.scilab.org/product/man/eqiir.html
Tscehbyscheff geht mit 'cheb1' oder 'cheb2' (je nach Ripple im Passband 
oder Stopband, Tschebyscheff gibts zweimal)

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

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

Autor: R. M. (exp)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: R. M. (exp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... wobei rein mathematisch Deine Interpretation von Term1

schon richtig wäre.

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.