Hallo,
ich lese Zahlenwerte ein (8 Bit 2er Komplement). Es handelt sich dabei
um Messwerte. Ich lese diese Werte durchgehend mit in einem variablem
(aber bekanntem) Zeitfenster ein.
Da die Messerte öfters mal Ausreißer haben, würde ich diese gerne
filtern.
Leider habe ich sogut wie keine Ahnung von digitalen Filtern. Überall
liest man nur etwas Allgemeines und mit irgendwelchen Frequenzen.
Gibt es irgendwo eine Übersicht über bekannte Implementierungen von
digitalen Filtern und wie sich diese Verhalten? Was für ein Filter wäre
angebracht um Ausreißer in Messwerten zu eleminieren?
Ausreißer bekommt man gut mit einem Medianfilter Weg.
Das heißt im Klartext ne Ungerade Zahl an Werten so schnell wie es geht
hintereinander einlesen; am besten in ein Aray. Das Array dann sortieren
und den Wert aus der Mitte des Arrays nehmen. Das ist dein gefilterter
Wert zum jeweiligen Zeitpunkt.
Die Berechnung ist aber aufgrund des Sortieralorithmus aber sehr
aufwendig.
Hallo,
Warum nicht ein einfacher Tiefpass? IIR Filter 1. Ordnung danach kannst
vllt auch googlen.
dann machst du nichts weiter als ((n-1)*9 + n)/10, wäre ein digitaler
Tiefpass 1. Ordnung, mit einer Grenzfrequenz die dem 10fachen deiner
Sample Rate entspricht.
Ist schnell, verbraucht wenig Speicher und lässt sich beliebig
aufblasen, dazu kannst du dir dann Bessel oder Tchebychef (oder wie der
geschrieben wird) Koeffizienten angucken. Gibts alles bei Wikipedia
meines erachtens.
Mfg
Tec
> Leider habe ich sogut wie keine Ahnung von digitalen Filtern. Überall> liest man nur etwas Allgemeines und mit irgendwelchen Frequenzen.
Das liegt wohl daran das es zu dieser Thematik das schoene Studium
der Nachrichtentechnik gibt und das der Sacherverhalt etwas
komplizierter ist.
> Ich lese diese Werte durchgehend mit in einem variablem> (aber bekanntem) Zeitfenster ein.
Mit anderen Worten die Abstastzeit ist nicht konstant? Das duerfte die
Sache nochmal komplizieren.
> Was für ein Filter wäre angebracht um Ausreißer in Messwerten zu> eleminieren?
Das haengt davon ab wie du Ausreisser definierst! Ein echter Ausreisser
bei Messwerten hat normalerweise keinen Bezug zur Messung. Nimm als
Beispiel deine Aufgabe waere es eine Kiste mit 500Stueck 1kOhm
Widerstaenden zu messen. Dann sollten die alle innerhalb von 10%
Abweichung liegen.
Was passierst jetzt wenn du darin einen findest mit 100kOhm? Wenn er als
1k beschriftet ist dann ist bei der Produktion was schiefgelaufen und du
musst dir Gedanken um die Qualitaet aller widerstaende machen. Ist der
aber mit 100k beschriftet hat ihn jemand versehentlich in die Kiste
geworfen.
Echte Ausreisser werden deshalb nicht gefiltert sondern mit einem
statistischen Verfahren gefunden und dann einfach ignoriert. Vielleicht
noch mit einem Hinweiss damit jemanden den Typ der da immer 100k
Widerstaende reinwirft in den Hintern tritt. :-)
http://de.wikipedia.org/wiki/Ausreißertest_nach_Grubbs
Hast du dagegen Schwankungen bei der Messung weil das im Verfahren
begruendet liegt, dann kannst du filtern. Nimm z.B mal an du misst
denselben Widerstand 100mal mit deinem Multimeter. Dann sollte da ja
eigentlich immer das gleiche rauskommen. Da das Multimeter aber einen
Fehler hat wird vielleicht immer die letzte Stelle schwanken. Dafuer ist
dann ein Filter angebracht. Der liefert dir dann eine Art Mittelwert.
das Erklaert auch warum es wichtig ist zu unterscheiden. Produzierst du
an dieser Stelle wieder einen Ausreisser weil sich z.B die Messpitzen
beruehren, so wuerde dieser Fehler sich auf mehrere Messungen verteilen
wenn er gefiltert wird.
Und ueber Filtertheorie gibt es wieder hunderte von Buechern. Als
einfacher Einstieg kann vielleicht der Tietze und Schenk gelten.
> Gibt es irgendwo eine Übersicht über bekannte Implementierungen von> digitalen Filtern und wie sich diese Verhalten?
In obigen Buch kannst du dann lernen warum es Filter verschiedener
Ordnung gibt, und was der Unterschied in ihren Auslegungen als
Butterworth, Tschebyscheff usw. angeht. Lass dich dabei nicht davon
verwirren das dieses Buch erstmal analoge Filter behandelt. In der
Praxis benutzt man dazu in Mikrocontrollern dann andere Filter (z.B
FIR). Man kann aber die Koeffizienten umrechnen.
Fuer Leute die nicht aus der Etechnik sondern aus der Mathematischen
Ecke kommen gibt es vermutlich andere Buecher als T&S, aber das sollen
dir mal andere empfehlen. Ich bin mir ziemlich sicher das es auch
Buecher ueber Filtertheorie fuer Informatiker gibt die nur der Autor
selber versteht. :-)
Olaf
Düsendieb schrieb:
> Mittelwert über die letzten n Werte. Wenn um x% abweicht dann Wert> verwerfen.
Also die Werte in ein FIFO und von diesem FIFO dann immer den Mittelwert
benutzen? Wäre eine Möglichkeit. Allerdings stell ich mir das relativ
träge vor wenn sich der "Erwartungswert" schnell ändert oder sich auch
das Vorzeichen ändert.
scriptkiddy schrieb:
> Ausreißer bekommt man gut mit einem Medianfilter Weg.> Das heißt im Klartext ne Ungerade Zahl an Werten so schnell wie es geht> hintereinander einlesen; am besten in ein Aray. Das Array dann sortieren> und den Wert aus der Mitte des Arrays nehmen. Das ist dein gefilterter> Wert zum jeweiligen Zeitpunkt.> Die Berechnung ist aber aufgrund des Sortieralorithmus aber sehr> aufwendig.
Also ein Array als FIFO. In jedem Durchlauf ein neuen Wert ins FIFO,
FIFO sortieren und den Wert fifo[length/2] nehmen? Wäre wohl möglich.
Aber wie würde sich das Verhalten, wenn plötzlich größere "erlaubte"
Sprünge vorkommen?
Olaf schrieb:
> Das liegt wohl daran das es zu dieser Thematik das schoene Studium> der Nachrichtentechnik gibt und das der Sacherverhalt etwas> komplizierter ist.
Yup aber leider habe ich keine 6 Semester Zeit um mich mit dem Thema zu
befassen.
Olaf schrieb:
> Mit anderen Worten die Abstastzeit ist nicht konstant? Das duerfte die> Sache nochmal komplizieren.
Die Abtastzeit ist verändert sich, aber ist zu jedem Zeitpunkt bekannt.
Allerdings glaube ich grade dass man die Abtastzeit doch konstant machen
könnte.
Olaf schrieb:
> Das haengt davon ab wie du Ausreisser definierst!
Ein Ausreißer wäre bei mir ein Messwert der aufgrund des Versuchsaufbau
nicht möglich ist. Wenn bei einem Versuchsaufbau mein theoretischer
Erwartungswert zwischen 1 und 2 liegt, dann würde ich auch gerne "nur" 1
und 2 als Werte einlesen. Durch Schwankungen wären auch noch 0 und 3 OK
aber weitere Werte sind ganz einfach falsch. Das Problem dabei ist dann
noch dass mein "Erwartungswert" sich über die Zeit ändert. Daher ist ein
trivialer Filter wie "if(x > max) x = max; if(x < min) x = min;" nicht
angebracht.
Zudem wäre generell eine Übersicht über verschiedene
Filtermplementierungen nützlich, da man so vergleichen könnte und
dadurch dann auch Entscheidungen für eine bestimtme Filtertechnik
begründen könnte.
Olaf schrieb:
> Echte Ausreisser werden deshalb nicht gefiltert sondern mit einem> statistischen Verfahren gefunden und dann einfach ignoriert.
Ich werde mir den Link mal angucken.
Olaf schrieb:
> Ich bin mir ziemlich sicher das es auch> Buecher ueber Filtertheorie fuer Informatiker gibt
Sowas wär praktisch.
Ohne jetzt der grosse Filterexperte zu sein.
Du kannst nur dann digital filtern, wenn Du entsprechendes Oversampling
hast.
Wenn dein zu messendes Signal sich in 4 Abtastschritten komplett
verändert, kannst Du nicht über 11 Abtastschritte filtern.
Ausserdem ist digitales Filtern kein Allheilmittel. Du musst immer
sicherstellen, daß die maximale Signalfrequenz < halbe Abtastfrequenz
ist, sonst misst Du nur noch Mist. Und das geht nur mit einem guten
alten analogen Filter vor dem AD Wandler.
Siehe auch
http://de.wikipedia.org/wiki/Nyquist-Shannon-Abtasttheorem
Merke: Wer misst misst Misst, wer hirnlos misst misst mehr Mist
Ein Ausreisser weist ueblicherweise auf mangelhafte Hardware, EMV,
Stoerungen hin. Man sollte eigentliche diese Quellen eliminieren bevor
man sich Gedanken ueber Medianfilterung macht.
Das einzige was ich hab und was ich beeinflussen könnte sind die
Messwerte die nach der Messung rauskommen. Also quasi das Ergbnis der
Messung als 8-Bit 2er Komplement Wert. Ich habe auch nicht irgendwelche
Frequenzen oder so (zumindest nicht das ich wüsste). Das verwirrt mich
auch immer wenn ich etwas über Filter lese. Es wird immer von
irgendwelchen Frequenzen gesprochen aber ich hab keine Ahnung wo die
herkommen.
Wenn du nur ein paar sample hast dann sind Sortier-Netzwerke nicht
gerade langsam. Und wenn du ne Menge samples hast dann nimm Quickselect
was ein linearer algorithmus is im Gegensatz zu nlogn von Sortieralg.
hey
du musst einen tiefpassfilter verwenden, also solltest du den
vergangenen messpunkten eine sehr viel höhere priorität geben als dem
aktuellen.
z.B.
yi= aktueller auszurechnender wert
xi=aktueller messwert
a und b = variablen zur wertigkeitsvergabe
yi= b*y(i-1)+xi*a <--- einfachste wahl
wenn du jetzt b=0.8 definierst und a=0,2 ist es ein starker filter und
die spitzen werden heraus gefiltert
wenn du hingegen b=0,3 und a=0,7 definierst filtert er nur schwach und
die spitzen bleiben vorhanden.
gruesse simon
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.