Forum: Digitale Signalverarbeitung / DSP / Machine Learning IIR unterschiedliche Koeffizienten +AVR


von kaffeetas (Gast)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

Hier Beitrag "FIR Filter funtioniert nur bei Fg > 0,01?" wird dein Problem 
diskutiert. Dezimieren sollte helfen.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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).

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ich hatte es befürchtet, in Scilab kommt es lesbarer heraus, je nach 
Fensterbreite.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

1
[pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]

von kaffeetas (Gast)


Lesenswert?

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

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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