Forum: Digitale Signalverarbeitung / DSP / Machine Learning digitale Filter


von peter pershing (Gast)


Lesenswert?

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
von Purzel H. (hacky)


Lesenswert?

Ein Tiefpass sollte genuegen. zB
http://www.ibrtses.com/embedded/exponential.html

von ich+ich (Gast)


Lesenswert?

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.

von peter pershing (Gast)


Lesenswert?

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

von max (Gast)


Lesenswert?

running average

von Tauwetter (Gast)


Lesenswert?

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.

von Gerrit B. (gbuhe)


Lesenswert?

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

von peter pershing (Gast)


Lesenswert?

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

von Gerrit B. (gbuhe)


Angehängte Dateien:

Lesenswert?

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

von Dirac I. (dirac-impuls)


Lesenswert?

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)

von Gerrit B. (gbuhe)


Lesenswert?

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

von Dirac I. (dirac-impuls)


Lesenswert?

Jop, du hast Recht, meins ist falsch.

von Jack (Gast)


Lesenswert?

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

von Gerrit B. (gbuhe)


Lesenswert?

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