IIR unterschiedliche Koeffizienten +AVR

Gast #1261151
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
#1263115
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.
#1263790
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).
Gast #1264814
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.