Der Moving Average als Filter Der gleitende Durchschnitt wird oft zum Glätten von Daten in Gegenwart von Rauschen verwendet. Der einfache gleitende Durchschnitt wird nicht immer als der Finite Impulse Response (FIR) Filter erkannt, der es ist, während er tatsächlich einer der häufigsten Filter in der Signalverarbeitung ist. Wenn man sie als Filter behandelt, kann man sie beispielsweise mit Fenster-Sinc-Filtern vergleichen (siehe die Artikel über Tiefpass-Hochpass - und Bandpass - und Bandsperrfilter für Beispiele dafür). Der Hauptunterschied zu diesen Filtern besteht darin, dass der gleitende Durchschnitt für Signale geeignet ist, für die die nützlichen Informationen im Zeitbereich enthalten sind. Von denen Glättungsmessungen durch Mittelung ein Beispiel sind. Window-Sinc-Filter sind dagegen starke Darsteller im Frequenzbereich. Mit Ausgleich in der Audioverarbeitung als typisches Beispiel. Es gibt einen detaillierteren Vergleich der beiden Arten von Filtern in Time Domain vs. Frequency Domain Performance von Filtern. Wenn Sie Daten haben, für die sowohl die Zeit als auch der Frequenzbereich wichtig sind, dann möchten Sie vielleicht einen Blick auf Variationen über den Moving Average haben. Die eine Anzahl von gewichteten Versionen des gleitenden Durchschnittes darstellt, die besser sind. Der gleitende Durchschnitt der Länge (N) kann so geschrieben werden, wie es typischerweise implementiert ist, wobei die aktuelle Ausgabeprobe als der Durchschnitt der vorherigen (N) Abtastwerte vorliegt. Als Filter erscheint der gleitende Durchschnitt eine Faltung der Eingangsfolge (xn) mit einem rechteckigen Puls der Länge (N) und der Höhe (1N) (um den Bereich des Pulses und damit die Verstärkung des Filters zu bilden , eins ). In der Praxis ist es am besten, (N) ungerade zu nehmen. Obwohl ein gleitender Durchschnitt auch unter Verwendung einer geraden Anzahl von Abtastwerten berechnet werden kann, hat die Verwendung eines ungeraden Wertes für (N) den Vorteil, daß die Verzögerung des Filters eine ganzzahlige Anzahl von Abtastwerten ist, da die Verzögerung eines Filters mit (N) Proben sind genau ((N-1) 2). Der gleitende Durchschnitt kann dann exakt mit den Originaldaten ausgerichtet werden, indem er durch eine ganzzahlige Anzahl von Samples verschoben wird. Zeitdomäne Da der gleitende Durchschnitt eine Faltung mit einem rechteckigen Puls ist, ist sein Frequenzgang eine Sinc-Funktion. Das macht es so etwas wie das Dual des Fenster-Sinc-Filters, denn das ist eine Faltung mit einem Sinc-Puls, der zu einem rechtwinkligen Frequenzgang führt. Es ist dieser Sinc-Frequenzgang, der den gleitenden Durchschnitt zu einem schlechten Performer im Frequenzbereich macht. Allerdings führt es im Zeitbereich sehr gut aus. Daher ist es perfekt, um Daten zu sperren, um Rauschen zu entfernen, während gleichzeitig noch eine schnelle Schrittantwort beibehalten wird (Abbildung 1). Für die typische additive White Gaussian Noise (AWGN), die oft angenommen wird, hat die Mittelung (N) Samples die Wirkung, das SNR um einen Faktor (sqrt N) zu erhöhen. Da das Rauschen für die einzelnen Proben unkorreliert ist, gibt es keinen Grund, jede Probe anders zu behandeln. Daher wird der gleitende Durchschnitt, der jeder Probe das gleiche Gewicht gibt, die maximale Menge an Rauschen für eine gegebene Schrittantwortschärfe loswerden. Implementierung Da es sich um einen FIR-Filter handelt, kann der gleitende Durchschnitt durch Faltung umgesetzt werden. Es wird dann die gleiche Effizienz (oder das Fehlen davon) wie jeder andere FIR-Filter haben. Allerdings kann es auch rekursiv realisiert werden. Es folgt unmittelbar aus der Definition, dass diese Formel das Ergebnis der Ausdrücke für (yn) und (yn1) ist, dh wo wir bemerken, dass die Änderung zwischen (yn1) und (yn) ist, dass ein zusätzlicher Term (xn1N) erscheint Das Ende, während der Begriff (xn-N1N) von Anfang an entfernt wird. In praktischen Anwendungen ist es oft möglich, die Division durch (N) für jeden Term zu verlassen, indem die resultierende Verstärkung von (N) an einer anderen Stelle kompensiert wird. Diese rekursive Umsetzung wird viel schneller als die Faltung sein. Jeder neue Wert von (y) kann mit nur zwei Additionen berechnet werden, anstelle der (N) Additionen, die für eine einfache Implementierung der Definition notwendig wären. Eine Sache, mit einer rekursiven Umsetzung zu suchen, ist, dass Rundungsfehler sich ansammeln werden. Dies kann oder auch kein Problem für Ihre Anwendung sein, aber es bedeutet auch, dass diese rekursive Implementierung tatsächlich besser funktionieren wird mit einer Integer-Implementierung als mit Gleitkommazahlen. Das ist ganz ungewöhnlich, da eine Gleitkomma-Implementierung in der Regel einfacher ist. Die Schlussfolgerung von all dem muss sein, dass Sie nie unterschätzen die Nützlichkeit der einfachen gleitenden durchschnittlichen Filter in Signalverarbeitung Anwendungen. Filter Design Tool Dieser Artikel wird mit einem Filter Design Tool ergänzt. Experimentiere mit verschiedenen Werten für (N) und visualisiere die resultierenden Filter. Versuchen Sie es jetztFrequenzantwort des laufenden Mittelfilters Der Frequenzgang eines LTI-Systems ist der DTFT der Impulsantwort, Die Impulsantwort eines L-Sample-Gleitdurchschnitts ist Da der gleitende Durchschnittsfilter FIR ist, reduziert sich der Frequenzgang auf das Finite Sum Wir können die sehr nützliche Identität verwenden, um den Frequenzgang zu schreiben, wo wir ae minus jomega gelassen haben. N 0 und M L minus 1. Wir können an der Größe dieser Funktion interessiert sein, um zu bestimmen, welche Frequenzen durch den Filter ungedämpft und die abgeschwächt werden. Unten ist eine Darstellung der Größe dieser Funktion für L 4 (rot), 8 (grün) und 16 (blau). Die horizontale Achse reicht von null bis pi Radiant pro Probe. Beachten Sie, dass in allen drei Fällen der Frequenzgang eine Tiefpasscharakteristik aufweist. Eine konstante Komponente (Nullfrequenz) im Eingang geht durch den Filter ungedämpft. Bestimmte höhere Frequenzen wie pi 2 werden durch den Filter vollständig eliminiert. Allerdings, wenn die Absicht war, einen Tiefpassfilter zu entwerfen, dann haben wir nicht sehr gut gemacht. Einige der höheren Frequenzen werden nur um einen Faktor von etwa 110 (für den 16 Punkt gleitenden Durchschnitt) oder 13 (für den vier Punkt gleitenden Durchschnitt) gedämpft. Wir können viel besser machen. Die obige Auftragung wurde durch den folgenden Matlab-Code erstellt: Omega 0: pi400: pi H4 (14) (1-exp (-iomega4)) (1-exp (-iomega)) H8 (18) (1-exp (- (1-exp (-iomega)) (1-exp (-iomega)) (1-exp (-iomega)) (1-exp (-iomega)) (1-exp (-Iomega) H16)) Achse (0, pi, 0, 1) Copyright Kopie 2000- - Universität von Kalifornien, BerkeleyIm Kodierung etwas in dem Moment, wo ich eine Reihe von Werten im Laufe der Zeit von einem Hardware-Kompass. Dieser Kompass ist sehr genau und aktualisiert sich sehr oft, mit dem Ergebnis, dass, wenn es leicht wackelt, ich am Ende mit dem ungeraden Wert, der wild unvereinbar mit seinen Nachbarn ist. Ich möchte diese Werte ausgleichen. Nachdem ich etwas gelesen habe, scheint es, dass das, was ich will, ein Hochpassfilter, ein Tiefpassfilter oder ein gleitender Durchschnitt ist. Gleitender Durchschnitt kann ich mit unten, halten Sie einfach eine Geschichte der letzten 5 Werte oder was auch immer, und verwenden Sie den Durchschnitt dieser Werte stromabwärts in meinem Code, wo ich war einmal nur mit dem neuesten Wert. Das heißt, ich denke, glätte diese Wackeln schön, aber es schlägt mich, dass seine wahrscheinlich ziemlich ineffizient, und dies ist wahrscheinlich eines der Bekannten Probleme zu richtigen Programmierer, auf die theres eine wirklich ordentliche Clever Math Lösung. Ich bin aber einer dieser schrecklichen, selbstgelehrten Programmierer ohne einen Fetzen der formalen Erziehung in irgendetwas, das sogar vage mit CompSci oder Mathematik verwandt ist. Das Lesen um ein bisschen deutet darauf hin, dass dies ein High-oder Tiefpass-Filter sein kann, aber ich kann nicht alles finden, was erklärt, in verständlich für einen Hack wie mich, was die Wirkung dieser Algorithmen wäre auf eine Reihe von Werten, geschweige denn, wie die Mathematik Arbeitet. Die hier gegebene Antwort Zum Beispiel, technisch beantwortet meine Frage, aber nur in verständlich für diejenigen, die wahrscheinlich schon wissen, wie das Problem zu lösen. Es wäre eine sehr schöne und kluge Person in der Tat, die die Art von Problem erklären könnte, das ist, und wie die Lösungen arbeiten, im Sinne verständlich für einen Kunst-Absolvent. Fragte am 21. September um 13:01 Wenn dein gleitender Durchschnitt lang sein muss, um die erforderliche Glättung zu erreichen, und du brauchst wirklich keine besondere Form des Kernels, dann bist du besser dran, wenn du einen exponentiell verfallenden gleitenden Durchschnitt nimmst: wo du bist Wählen Sie winzig eine passende Konstante (zB wenn Sie winzige 1- 1N wählen, wird es die gleiche Menge an Mittelwert wie ein Fenster der Größe N haben, aber anders verteilt über ältere Punkte). Jedenfalls, da der nächste Wert des gleitenden Durchschnitts nur von der vorherigen und Ihren Daten abhängt, muss man keine Warteschlange behalten. Und du kannst das daran denken, so etwas zu tun, Nun, ich habe einen neuen Punkt, aber ich vertraue es nicht wirklich, also werde ich 80 meiner alten Schätzung der Messung behalten und nur diesem neuen Datenpunkt vertrauen So ziemlich das gleiche wie zu sagen, Nun, ich vertraue nur diesem neuen Punkt 20, und ich benutze 4 andere Punkte, die ich vertraue, die gleiche Menge, außer dass anstatt explizit die 4 anderen Punkte, youre vorausgesetzt, dass die Mittelung Sie letzte Mal War sinnvoll, also kannst du deine bisherige Arbeit benutzen. Antwortete Sep 21 10 at 14:27 Hey, ich weiß, das ist 5 Jahre zu spät, aber danke für eine tolle Antwort. Ich arbeite an einem Spiel, bei dem sich der Klang auf der Grundlage deiner Geschwindigkeit ändert, aber wegen des Spiels auf einem langsamen Computer, würde die Geschwindigkeit wild schwanken, was für das Lenken gut war, aber super nervig in Sachen Sound. Dies war eine wirklich einfache und billige Lösung für etwas, was ich dachte, wäre ein wirklich komplexes Problem. Wenn du versuchst, den gelegentlichen ungeraden Wert zu entfernen, ist ein Tiefpassfilter der beste der drei Optionen, die du identifiziert hast. Deutsch:. Englisch: emagazine. credit-suisse. com/app/art...1007 & lang = en Wenn Sie versuchen, den gelegentlichen ungeraden Wert zu entfernen, Tiefpaßfilter erlauben Niedergeschwindigkeitsänderungen, wie z. B. die, die durch das Drehen eines Kompasses von Hand verursacht werden, während die Absenkung von Hochgeschwindigkeitsänderungen, wie z. B. durch Stöße auf der Straße verursacht wird. Ein gleitender Durchschnitt wird wahrscheinlich nicht ausreichen, da die Effekte eines einzelnen Blips in Ihren Daten mehrere nachfolgende Werte beeinflussen werden, abhängig von der Größe Ihres gleitenden Durchschnittsfensters. Wenn die ungeraden Werte leicht erkannt werden, können Sie sogar besser mit einem Glitch-Entferner-Algorithmus, der sie völlig ignoriert: Hier ist ein Guick-Diagramm zu illustrieren: Die erste Grafik ist das Eingangssignal, mit einem unangenehmen Glitch. Die zweite Grafik zeigt die Wirkung eines 10-prozentigen gleitenden Durchschnitts. Der endgültige Graph ist eine Kombination aus dem 10-Sample-Durchschnitt und dem oben beschriebenen einfachen Glitch-Detection-Algorithmus. Wenn der Glitch erkannt wird, wird anstelle des Istwertes der 10-Sample-Durchschnitt verwendet. Antwortete Sep 21 10 um 13:38 Schön erklärt, und Bonuspunkte für die Grafik) ndash Henry Cooke Sep 22 10 at 0:50 Wow. Selten sah man so eine nette Antwort ndash Muis Jun 4 13 at 9:14 Der gleitende Durchschnitt ist ein Tiefpassfilter. Ndash nomen Oct 21 13 at 19:36 Versuchen Sie, ein runningstreaming Median statt. Ndash kert Apr 25 14 at 22:09 Gleitender Durchschnitt kann ich mit. Aber es schlägt mich, dass seine wahrscheinlich ziemlich ineffizient. Theres wirklich kein Grund ein gleitender Durchschnitt sollte ineffizient sein. Sie halten die Anzahl der Datenpunkte, die Sie in irgendeinem Puffer (wie eine kreisförmige Warteschlange) wünschen. Auf jedem neuen Datenpunkt kommst du den ältesten Wert und subtrahiere ihn von einer Summe und schiebe den neuesten und führe ihn der Summe hinzu. So bringt jeder neue Datenpunkt wirklich nur einen Poppush, eine Addition und eine Subtraktion mit sich. Ihr gleitender Durchschnitt ist immer diese Verschiebungssumme geteilt durch die Anzahl der Werte in Ihrem Puffer. Es wird ein bisschen schwieriger, wenn Sie Daten gleichzeitig von mehreren Threads empfangen, aber da Ihre Daten von einem Hardwaregerät kommen, das mir höchst zweifelhaft erscheint. Oh und auch: schreckliche, selbstgelehrte Programmierer vereinen sich) Der gleitende Durchschnitt schien mir ineffizient zu sein, weil man einen Puffer von Werten speichern muss - besser, nur einige Clever Maths mit deinem Eingabewert und dem aktuellen Wertsatz zu machen, denke ich, wie der exponentielle gleitende Durchschnitt Arbeitet. Eine Optimierung, die für diese Art von gleitendem Durchschnitt gesehen wird, beinhaltet die Verwendung eines festen Längen-Warteschlangen-Verstärkers einen Zeiger auf, wo Sie in dieser Warteschlange sind, und einfach nur den Zeiger umschalten (mit oder einem if). Voila Kein teurer Pushpop Macht zu den Amateuren, Bruder ndash Henry Cooke Sep 22 10 bei 0:54 Henry: Für einen geradlinigen gleitenden Durchschnitt brauchst du den Puffer einfach so, dass du weißt, welcher Wert geknallt wird, wenn der nächste Wert gedrückt wird. Das heißt, die feste Länge Warteschlange amp ein pointerquot Sie beschreiben ist genau das, was ich meinte durch quotcircular queue. quot That39s warum ich sagte, es ist nicht ineffizient. Was meinten Sie, dass ich meinte, und wenn Ihre Antwort ist Quanten-Array, dass verschiebt seine Werte wieder auf jedem indizierten Removequot (wie Std :: Vektor in C). Nun, dann I39m so verletzt ich don39t will sogar noch mehr mit dir reden) ndash Dan Tao Sep 22 10 bei 1:58 Henry: Ich weiß nicht über AS3, aber ein Java Programmierer hat auch Sammlungen wie CircularQueue zu seiner Verfügung (I39m nicht ein Java-Entwickler, also I39m sicher, es gibt bessere Beispiele da draußen, die genau das, was ich von einer schnellen Google-Suche gefunden habe), die genau die Funktionalität implementiert, über die wir reden. I39m ziemlich zuversichtlich, die Mehrheit der Mittel-und Low-Level-Sprachen mit Standard-Bibliotheken haben etwas ähnliches (z. B. in dort39s QueueltTgt). Jedenfalls war ich selbst Philosophie. alles ist vergeben. Ndash Dan Tao Sep 12 10 um 12:44 Ein exponentiell abklingender gleitender Durchschnitt kann von Hand mit nur dem Trend berechnet werden, wenn man die richtigen Werte verwendet. Siehe viermilab. chhackdiete4 für eine Idee, wie man das schnell mit einem Stift und Papier macht, wenn man nach exponentiell geglätteten gleitenden Durchschnitt mit 10 Glättung sucht. Aber da hast du einen Computer, du möchtest wahrscheinlich Binärverschiebung im Gegensatz zur Dezimalverschiebung machen. Auf diese Weise ist alles, was du brauchst, eine Variable für deinen aktuellen Wert und eine für den Durchschnitt. Der nächste Durchschnitt kann dann berechnet werden. Antwortete am 21. September 10 um 14:39 Uhr eine Technik namens ein Bereich Tor, das gut funktioniert mit Low-Auftreten falsche Proben. Vorausgesetzt, die Verwendung einer der oben erwähnten Filtertechniken (gleitender Durchschnitt, exponentiell), sobald man genügend Geschichte hat (eine Zeitkonstante), kannst du das neue, eingehende Datenmuster für Angemessenheit testen, bevor es der Berechnung hinzugefügt wird. Manche Kenntnisse über die maximal vernünftige Änderungsrate des Signals sind erforderlich. Wird die Rohprobe mit dem letzten geglätteten Wert verglichen, und wenn der Absolutwert dieser Differenz größer als der zulässige Bereich ist, wird diese Probe ausgelöst (oder durch eine Heuristik ersetzt, zB eine Vorhersage auf der Grundlage der Steigungsdifferenz oder des Trends Vorhersagewert von doppelter exponentieller Glättung) beantwortet Apr 30 16 at 6: 56A Ein einfacher, einpoliger, tiefer Pass, rekursiver IIR-Filter ist schnell und einfach zu implementieren, zB Wobei x, y die rohen (ungefilterten) XY-Beschleunigungssensoren sind, xf, yf die gefilterten Ausgangssignale und k die Zeitkonstante der Filter (typischerweise ein Wert zwischen 0,9 und 0,9999), wobei ein größerer k eine längere Zeitkonstante bedeutet ). Sie können k empirisch bestimmen, oder wenn Sie Ihre erforderliche Grenzfrequenz, Fc kennen. Dann kannst du die Formel verwenden: wo Fs die Samplerate ist. Beachten Sie, dass xf, yf die vorherigen Werte des Ausgangssignals auf dem RHS und die neuen Ausgangswerte auf dem LHS des obigen Ausdrucks sind. Beachten Sie auch, dass wir hier voraussetzen, dass Sie die Beschleunigungssensoren in regelmäßigen Zeitabständen, z. B. Alle 10 ms Die Zeitkonstante ist eine Funktion sowohl von k als auch von diesem Abtastintervall.
Comments
Post a Comment