Forum: Digitale Signalverarbeitung / DSP / Machine Learning Nach Mittelwertfilter noch ein "Medianfilter" sinnvoll?


von Daniel R. (sparker)


Lesenswert?

Hallo,

ich habe eine Frage (realisiert auf einem STM32F4-Mikrocontroller):
Ich erhalte nach jeder Messung ein Array aus 1024 Spektralwerten (40 
Messungen pro Sekunde), das ich nach jeder Messung einer rekursiven 
Mittelung zuführe (quasi wie ein simpler IIR-Filter).

Aus diesem gemittelten Spektrum wird mit einem speziellen Algorithmus 
der höchste Peak gesucht und mit dieser Mittelung ergibt sich ein 
quasi-stabiler daraus abgeleiteter Ausgabewert, mit dem ich schon 
ziemlich zufrieden bin.

Nun habe ich mir gedacht, zwecks doch sporadisch auftretender möglicher 
Ausreißer, die den Ausgabewert kurz mal in eine Richtung "ziehen" können 
(sei es auch nur minimal), zur Erhöhung der Robustheit einen 
Median"filter" nachzuschalten (sozusagen nur auf z.B. letzten 5 
Ausgabewerte des gemittelten Arrays losgelassen, und nicht als Ersatz 
für den Mittelwertfilter
- das wäre mit der Sortierung der großen Felder ein zu hoher 
Rechenaufwand - das Sortieren alleine dauert überschlagen im Worst Case 
mit Bubble-Sort [OK, ist nicht die ressourcenschonendste Variante] für 
mehrere Felder schon einige Millisekunden).

Zu viel bzw. "zu lange" möchte bzw. kann ich auch nicht mitteln oder 
"medianisieren", da es aufgrunddessen zu einer Verzögerung kommt.

Ist das eine akzeptable Option oder gibt es dazu andere/bessere Ideen?

von Schorsch X. (bastelschorsch)


Lesenswert?

Wenn der Medianfilter dahinter kommt, sind die Störungen ja schon 
gemittelt - nicht ideal. Versuch doch den Median vorher und schmeiß die 
Ausreiser weg (Nalimov wird mit 1024 Werten wahrscheinlich zu langsam 
auf dem F4 ???). Du kannst noch oberen und unteren Abstand verändern. 
Damit hatte ich bei einigen versauten Messungen schon recht gute Erfolge 
vor der Mittelung.

von Experte (Gast)


Lesenswert?

Bubble-Sort für einen Median? Das ist doch Käse!

Einfach in Google mal "fast median" eintippen. Median kann man in O(n) 
berechnen.

von Sven B. (scummos)


Lesenswert?

Worin besteht denn das Problem? Rauscht der Peak ein bisschen hin und 
her? Evtl. bietet es sich auch an, eine Parabel an den höchsten Punkt 
und 3-5 umliegende Werte zu fitten, statt einfach nur den höchsten Punkt 
zu finden.

von Daniel R. (sparker)


Lesenswert?

OK, ich würde dann mal versuchen einen Medianfilter vorzuschalten.

Dazu würde ich die letzten 5 Spektren heranziehen, das heißt ich brauche 
einen Ringbuffer mit 5 x 1024 Elementen, wo 1024 Mal ein Median aus den 
letzten 5 Spektralwerten pro Durchlauf bestimmt wird und das daraus 
erhaltene Spektrum dem Mittelwertfilter zugeführt wird (ich weiß noch 
nicht, ob das 40x pro Sekunde klappen wird, ggf. nur 3 Elemente).

Kann mann dieses Problem sonst irgendwie optimieren?

Sven B. schrieb:
> Worin besteht denn das Problem? Rauscht der Peak ein bisschen hin
> und
> her? Evtl. bietet es sich auch an, eine Parabel an den höchsten Punkt
> und 3-5 umliegende Werte zu fitten, statt einfach nur den höchsten Punkt
> zu finden.

Das ist ein Radarsystem, die Peak Detection erkennt manchmal kurzzeitig 
einfach ein "falsches Ziel" (bzw. es fliegt etwas durch den 
Radarstrahl), dann steuert der Ausgabewert geringfügig aus.
Ich mache bereits anschließend eine parabolische Interpolation.

von Sven B. (scummos)


Lesenswert?

Das traurige ist, dass der Medianfilter das Rauschen nicht so gut 
reduziert wie ein Mittelwert. Vielleicht ist es besser, von 5 Werten pro 
Kanal den höchsten und den niedrigste wegzulassen (order für deine 
Anwendung nur den höchsten), und die übrigen 3 zu mitteln?

von Daniel R. (sparker)


Lesenswert?

Sven B. schrieb:
> Das traurige ist, dass der Medianfilter das Rauschen nicht so gut
> reduziert wie ein Mittelwert. Vielleicht ist es besser, von 5 Werten pro
> Kanal den höchsten und den niedrigste wegzulassen (order für deine
> Anwendung nur den höchsten), und die übrigen 3 zu mitteln?

Kein Vorteil ohne Nachteil!
-- wäre ja zu schön, wenns anders wäre

So auch hier:
Ich mittle aktuell mit N=10 rekursiv, mit diesem Vorschlag würde ich 
z.B. einen 10x 1024 Buffer verwenden, und den Vorteil einer rekursiven 
Mittelung müsste ich dann kübeln, denn ich müsste nun jeweils die acht 
Mittigen erst suchen und pro Kanal mitteln.

Aber die Idee gefällt mir.

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.