Hallo, ich versuche grad einen IIR Filter in nach Atmel Appnote nachzubauen. Die Koeffizienten habe ich mit Filter-Free bestimmt, leider sind diese stark unterschiedlich. D.h. der kleinste ist 7.xxxxe-8 und der größte 2.xxxxxx. Diese Faktoren müßte ich ja ziemlich stark skalieren um überhaupt eine Handvoll wertende Stellen zu erhalten, während die anderen dann schon mächtig groß sind. Macht das überhaupt Sinn? Die Abtastrate ist mit 1,6hz nur sehr gering, deshalb mach ich mir um die Performance prinzipiell auch keine Sorgen. Die Grenzfrequenz ist auch recht klein da die interessante frequenz sehr langsam ist (1/600 hz) und der ganze Rest das nur stört. Hilft evtl. Mehrfachfilterung? Bin leider mit der Mathematik nicht so recht vertraut deshalb frag ich lieber vor ich mich tagelang mit nonsens beschäftige. Grüße kaffeetas
Hier Beitrag "FIR Filter funtioniert nur bei Fg > 0,01?" wird dein Problem diskutiert. Dezimieren sollte helfen.
Mit Scilab (www.scilab.org) und dem Befehl eqiir lassen sich auch IIR-Filter berechnen, sie werden schon in Teilfilter 2.Ordnung zerlegt. Ist das die alte oder neuere Appnote? in der alten war auch noch ein IIR 6.Ordnung beschrieben, das schwingt sehr zuverlässig, außerdem ein paar Schreibfehler im Programm.
Ein Beispiel für ein elliptisches Stopbandfilter, das ich mit dem ATMega48 gebaut habe: // Stopband-Filter für 1750 Hz, Samplerate =18029Hz // Eckfrequenzen 1400Hz, 1700Hz, 1800 Hz, 2100Hz: omega=[2*%pi*(1400/18029),2*%pi*(1700/18029),2*%pi*(1800/18029),2*%pi*(2 100/18029)]; // Maximale Durchgangswelligkeit 0,5 dB deltapass = (1-10**(-0.5/20)) ; // minimale Sperrband-Dämpfung 50 dB deltastop = 10**(-50/20); // IIR-Filter berechnen: [sos,gain,zeroes,poles] = eqiir('sb','el',omega,deltapass,deltastop); // Second order sections anzeigen: sos gain 2 2 2 1 - 1.6219938z + z 1 - 1.6396794z + z 1 - 1.656616z + z sos = -------------------------- ------------------------ ------------------------- 2 2 2 0.9383702 - 1.5100165z + z 0.8466245 - 1.513936z + z 0.9485511 - 1.663563z + z gain = 0.8683583 die Brüche müssen noch in Zähler und Nenner durch z^2 dividiert werden, damit die übliche Schreibweise mit z^(-2) und z^(-1) herauskommt. ( hoffentlich passt das in eine Zeile, sonst wird es unleserlich).
Ich hatte es befürchtet, in Scilab kommt es lesbarer heraus, je nach Fensterbreite.
1 | [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre] |
vielen Dank für die Antworten! hab mir jetzt mal das scilab installiert - naja da muss ich mich jetzt auch noch einarbeiten..... die tutorial von matlab sollen ja ganz gut dazu passen.... auch die CICR-Filter werd ich mal austesten. Ist die aktuelle Apnote von der Homepage der IIR ist 2 Ordnung ist da auch ein Fehler drin? Hab mal zum aufwärmen den FIR umgeschrieben in GCC und Assembler ist auch eine spezielle Welt! Grüße kaffeetas
http://www.mikrocontroller.net/articles/Digitalfilter_mit_ATmega Ich habe mal endlich meinen Artikel zum Thema ins Wiki eingetragen. Noch nicht komplett, aber das wesentliche ist gesagt. Kommentare, am besten unter der dortigen Rubrik "Diskussion" sehr erwünscht.
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.