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