Hallo zusammen, ich benötige zum Einlesen von Messwerten über die RS232 Schnittstelle einen Filter. Die Messwerte kommen mit 50Hz an. Ich möchte jetzt das Rauschen der Messwerte rausfiltern. Zusätzlich sollen Ausreisser rausgefiltert werden. Aus dem Studium ist mir bekannt, wie man Frequenzen rausfiltert. Da ich aber eine konstante Frequenz habe, weiss ich grad net weiter. Wie ist hier der Ansatz eines Filterentwurfes? Welche verschiedenen Filtertypen machen hier Sinn? Vielen Dank im voraus. P.S. da sich meine Filterkenntnisse in Grenzen halten, erklärt es bitte so wie Ihr es einem 12-jährigen erkläten würdet;-) muchos gracias
:
Verschoben durch Admin
peter pershing schrieb: > Aus dem Studium ist mir bekannt, wie man Frequenzen rausfiltert. Da ich > aber eine konstante Frequenz habe, weiss ich grad net weiter. Die 50Hz sind deine Abtastfrequenz und natürlich konstant. Mit dem Tiefpass filterst du dann das Rauschen in deinen Abtastwerten raus.
Hallo ich+ich, mit der Fequenz wollte ich nur darstellen, dass die Abtastrate konstant ist und nicht variiert. Auch wenn ich mich jetzt ganz oute. Wenn ich z.B. folgende Werte habe x0=5.03 x1=4.99 x2=4.95 x3=5.1 x4=5.3 x5=0.5 x6=4.8 x7=5.0 x8=5.0 x9=4.95 dann müsste sich theoretisch mit einem Tiefpassfilter ein Wert mit 5 einstellen. Aber wie programmiert man sowas? Wie bekomme ich den Ausreisser x5=0.5 rausgefilert? Vielen Dank schon mal
Max meint: gleitender Mittelwert.
>Wie bekomme ich den Ausreisser x5=0.5 rausgefilert?
Ganz einfach:
Er wird durch den Mittelwert aus x4 und x6 ersetzt.
Ganz schwer:
Es ist gar kein Ausreißer, auch wenn es Dir nicht gefällt. Sorge dafür,
daß die angelieferten Werte richtig erfaßt werden.
Hallo, wie bereits geraten hilft in solchen Fällen ein einfaches Tiefpaßfilter. > dann müsste sich theoretisch mit einem Tiefpassfilter ein Wert mit 5 > einstellen. Aber wie programmiert man sowas? Ich verwende gern IIR-Filter erster Ordnung dafür: y(n)= a * x(n) + (1-a)*y(n-1) x(n) sind die Eingangswerte (5.03, 4.99, 4.95,...) y(n) sind die gefilterten Ausgangswerte a ist der Koeffizient, mit dem die Grenzfrequenz eingestellt wird. Je kleiner der Wert, desto mehr wird gemittelt (kleinere Grenzfrequenz bzw. größere Zeitkonstante). > Wie bekomme ich den Ausreisser x5=0.5 rausgefilert? Solche Fehler kannst Du durch Ermittlung des Median- oder Zentralwertes beseitigen (google). Gruß, Gerrit, DL9GFA
Hallo Gerrit, vielen Dank. Hab es ausprobiert und funktioniert prächtig. Kannst Du mir noch ein, zwei andere einfache Filter mit Funktion nennen. Muss für meine Diplomarbeit ein paar Filter vergleichen. Vielen Dank im voraus peter
Hallo Peter, wenn es in einer Diplomarbeit um den Vergleich von digitalen Filtern geht, ist oft nach Vor- und Nachteilen von IIR- und FIR-Filtern gefragt. Mit einer IIR-Struktur kann man sehr effizient viele verschiedene Funktionen allein durch geschickte Wahl der Koeffizienten realisieren. Es gibt einen sehr schönen Artikel von Richard Lyons dazu, den er treffend "The Swiss Army Knife of Digital Networks" nannte. Ich füge diesen Artikel bei, damit dürftest Du genügend Material haben. Viel Erfolg damit! Gerrit, DL9GFA
Ich meine da ist ein Fehler. So ist es denke ich richtig: y(n)=Ta/tau*x(n)+a*y(n-1) mit - Ta dem Kehrwert der Abtastfrequenz - tau der Zeitkonstante a=exp(-Ta/tau)
Hallo, Dirac Impuls schrieb: > Ich meine da ist ein Fehler. So ist es denke ich richtig: > > y(n)=Ta/tau*x(n)+a*y(n-1) > > mit > - Ta dem Kehrwert der Abtastfrequenz > - tau der Zeitkonstante > > a=exp(-Ta/tau) mein Beitrag oben ist absolut korrekt, daher hat es bei Peter auch gut funktioniert. Wenn wir über die Herleitung des Koeffizienten a in diesem einfachen IIR-Filter y(n)= a * x(n) + (1-a)*y(n-1) diskutieren wollen, sollten wir am besten gleich in 3dB-Grenzfrequenzen rechnen, anstatt mit Zeitkonstanten (für viele leichter). Die Dimensionierung dieses Koeffizienten ist wie folgt: a = 1-exp(-2 pi fg/fs) mit fg als 3dB-Grenzfrequenz und fs als Abtastfrequenz. "Mein" Faktor vor y(n-1), der allein die Grenzfrequenz angibt, entspricht damit genau "Deinem" exp(-Ta/tau). Nur die Gewichtung vor dem x(n), die die Verstärkung des Filters auf 1, also 0dB, setzen soll ist in unseren Angaben nicht identisch. Ein Filter nach Deinen Angaben sollte daher in der Verstärkung abweichen. Was meinst Du dazu? Viele Grüße! Gerrit, DL9GFA
Die Tatsache dass man
so rechnet, ist Mathematische zu verstehen, aber wie soll eine "exp" function auf dem Atmega32 umgesetzt werden, soll man dafür eine LUT anlegen, oder mit der Taylor Riehe "exp" vereinfachen?? Viele Grüße! Jack
Hallo Jack, in den meisten Anwendungen ist die Grenzfrequenz des Filters fest, so daß die beiden Faktoren a und 1-a als Konstanten am Anfang definiert werden. Auf Mikrocontrollern arbeite ich gern mit Faktoren 1/2^x, da sie durch Schiebeoperationen realisiert werden können. Den DSPs ist das egal, da die Multiplikation genauso viele Zyklen benötigt wie das Shiften. Noch eleganter als die Konstantendefinition von a und 1-a ist es, wenn man erst fg als Konstante im Quelltext definiert und in den Zeilen darunter die Faktoren durch den Pre-prozessor des Assemblers oder C-Compilers errechnen läst. Hier kann man die Expotentialfunktion einfach hinschreiben. Wenn Du die Grenzfrequenz des Filters allerdings wärend der Laufzeit verändern möchtest, mußt Du tatsächlich mit Tabelle oder Reihenentwicklung arbeiten. Bei IIR-Filtern darf man allerdings nicht einfach die Koeffizienten umschalten und die Inhalte der Zustandsspeicher weiter verwenden, da das Filter dann instabil werden kann. Bei erster Ordnung, wie im Bsp. oben, ist das noch kein Problem, bei Ordnung >1 allerdings schon. Man kann dann das IIR-Filter zwar mit den Initialisierungswerten (Null in jedem Zustandsspeicher) wieder starten, aber es gibt dann natürlich einen "Knacks" im Ausgangssignal. Eine Option ist das parallele Einschwingen lassen eines zweiten IIR-Filters mit der neuen Grenzfrequenz und kontrolliertes "Überblenden" von einem zum anderen Ausgangssignal. In der Praxis werden digitale Filter mit zur Laufzeit veränderlichen Grenzfrequenz vorzugsweise als FIR-Filter implementiert. Hier kann man auch bei sehr hoher Ordnung einfach die Koeffizienten austauschen und das "Überblenden" funktioniert quasi automatisch und ohne Stabilitätsprobleme. Die Berechnung der Koeffizienten zur Laufzeit ist natürlich auch hier etwas aufwändig und kann auf unterschiedliche Weise erfolgen (Tabelle, Funktionsapproximation). Der beste Weg hängt von den konkreten Anforderungen ab. Die Mittenfrequenz eines FIR-Bandpaßfilters kann man z.B. durch Multiplikation der Koeffizienten mit Kosinusabtastwerten - die wiederum einfach mit einem digitalen IIR-Oszillator erzeugt werden können - beliebig hin und her verschieben. Das ist allerdings eher etwas für DSPs und nicht für den ATmega. Wenn Du Deine genauen Anforderungen mitteilst, könnte ich ggf. darauf eingehen. Viele Grüße! Gerrit, DL9GFA
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.