Forum: Digitale Signalverarbeitung / DSP / Machine Learning Datenreihe filtern, aber wie?


von Gast (Gast)


Lesenswert?

Hi, ich habe in einem Mikrocontroller ein Array, indem die empfangenen 
Datenwerte gespeichert sind. Nun möchte ich mittels eines Filter (IIR 
oder FIR) die Datenwerte mitteln. Damit möchte ich die Ausreißer 
herausfiltern.
Ich habe mir dabei gedacht, ich mache eine Filterung, indem ich 10 mal 
die Datenwerte im Mikrocontroller erfasse und dann einen Filterung 
durchführe.
Ein IIR Filter wäre denke ich besser dafür geeignet, da dieses Filter 
weniger Koeffizienten hat und die Berechnung schneller erfolgt wie bei 
einem FIR Filter. Was meinst ihr dazu? Wie könnte man sowas in Ansi C 
realisieren?
Für jeden Ratschlag bin ich sehr dankbar

von Michael L. (Gast)


Lesenswert?

> Hi, ich habe in einem Mikrocontroller ein Array, indem die empfangenen
> Datenwerte gespeichert sind. Nun möchte ich mittels eines Filter (IIR
> oder FIR) die Datenwerte mitteln. Damit möchte ich die Ausreißer
> herausfiltern.
> Ich habe mir dabei gedacht, ich mache eine Filterung, indem ich 10 mal
> die Datenwerte im Mikrocontroller erfasse und dann einen Filterung
> durchführe.
> Ein IIR Filter wäre denke ich besser dafür geeignet, da dieses Filter
> weniger Koeffizienten hat und die Berechnung schneller erfolgt wie bei
> einem FIR Filter. Was meinst ihr dazu? Wie könnte man sowas in Ansi C
> realisieren?
> Für jeden Ratschlag bin ich sehr dankbar
Die grundlegende Frage lautet ja, welche Art von Filterung Du 
durchführen willst. Erst danach stellt sich die Frage, wie das im µC 
realisiert werden kann.

Das einfachste Filter zum Auslöschen von Ausreißern ist das 
Medianfilter.
Dabei sortierst Du die Werte aus der Umgebung von x(n), d. h. 
beispielsweise, Du sortierst die Zahlen [ x(n-5) ... x(n) ... x(n+5) ] 
und ersetzt x(n) durch den mittleren der Werte, also


Du kannst natürlich auch ein gewöhnliches FIR-Tiefpaßfilter nehmen. Die 
Filterkoeffizienten und den Algorithmus würde ich zunächst in Matlab/GNU 
Octave austesten.

Gruß,
  Michael

von Anon N. (fuechslein)


Lesenswert?

Du musst nicht unbeding sortieren um den Median herauszufinden. Google 
nach Quickselect.

von Gast (Gast)


Lesenswert?

Danke für eure Hilfe. Ich hab mir das so gedacht:
10 Messreihen ermitteln und über diese Messreihen eine art Statistik 
erstellen. Dabei dachte ich mir dies geht mit einem Filter (z.B. IIR) 
mit dem ich so zusagen eine Mittellung durchführe.

von Anon N. (fuechslein)


Lesenswert?

Kopfschuettel. Das hast du doch schon in deinem ersten Post 
geschrieben und wir haben dir gesagt dass man das so nicht macht sondern 
mit einem Median Filter. Ich mein, selbst wenn deine Methode 
funktioniert... Elegant ist sie nicht und wenn du das irgendjemand 
anderem zeigst dann hat der dich gleich unter Nullpeiler abgestempelt.

von Michael L. (Gast)


Lesenswert?

Hallo,

> Danke für eure Hilfe. Ich hab mir das so gedacht:
> 10 Messreihen ermitteln und über diese Messreihen eine art Statistik
> erstellen. Dabei dachte ich mir dies geht mit einem Filter (z.B. IIR)
> mit dem ich so zusagen eine Mittellung durchführe.

wenn Du immer den gleichen Wert oder den gleichen Verlauf erwartest, 
kannst Du eine Statistik erstellen. In diesem Fall bietet es sich an, 
das sogenannte Scharmittel (bzw. den Scharmedian) zu bilden. Das 
bedeutet, daß Du über die Wiederholung mittelst.

Wenn Du einen komplizierten Verlauf erwartest, der in dieser Form nur 
einmal auftritt, mußt Du zeitlich mitteln, wobei das Medianfilter 
tendenziell besser ist als die arithmetische Mittelung.

Es wäre hilfreich, wenn Du die Daten und Dein Konzept an einem Beispiel 
darstellen würdest. Denn nur am konkreten Beispiel läßt sich eine 
optimale Lösung finden.

Über FIR/IIR oder sonstwas können wir uns dann unterhalten.


Gruß,
  Michael

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.