Sunday, 21 May 2017

Moving Average Filter Code


Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren kann, indem Sie eine Fenstergröße, die eine Macht von zwei, um Bit-Verschiebung statt zu teilen, aber nicht brauchen Ein Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes durchschnittliches Ergebnis nur als eine Funktion des alten Ergebnisses auszudrücken und das neue Sample Definieren Sie ein Beispiel gleitender Durchschnitt, über ein Fenster von 4 Samples: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine genaue Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingabe Probe in der Summe (dh die a in Ihrem Beispiel) erinnern. Für eine Länge N gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal ist und xn das Eingangssignal ist. Gl. (1) kann rekursiv geschrieben werden, also musst du dich immer an die Probe xn-N erinnern, um zu berechnen (2). Wie von Conrad Turner hervorgehoben, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus der Vergangenheit und dem aktuellen Eingang berechnen können. Dies ist jedoch kein Standard (ungewichtet) gleitender Durchschnitt, sondern exponentiell Gewichteter gleitender Durchschnitt, wo Proben in der Vergangenheit ein kleineres Gewicht bekommen, aber (zumindest in der Theorie) vergisst du niemals etwas (die Gewichte werden in der Vergangenheit immer kleiner und kleiner). Ich habe einen gleitenden Durchschnitt ohne Einzelposten-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich fange mit 1 Probe an und teile mit 1, um die aktuelle avg zu bekommen. Ich füge dann eine Probe hinzu und teile mit 2 auf die aktuelle avg. Das geht weiter, bis ich die Länge des Durchschnitts erreicht habe. Jedes Mal danach füge ich die neue Probe hinzu, bekomme den Durchschnitt und beseitige diesen Durchschnitt von der Summe. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathe-Kerls drehen, aber es stellt sich heraus, dass es eine der akzeptierten Möglichkeiten ist, es zu tun. Und es geht gut Denken Sie daran, dass je höher Ihre Länge desto langsamer ist es, was Sie folgen wollen. Das mag die meiste Zeit nicht ausmachen, aber wenn man den Satelliten folgt, wenn man langsam ist, könnte der Weg weit von der aktuellen Position entfernt sein und es wird schlecht aussehen. Du hättest eine Lücke zwischen dem Sat und den hinteren Punkten. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um ausreichende Glättung zu bekommen und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Pfad-Punkten zu bekommen. Antwortete 16. November 16 um 23:03 initialize total 0, count0 (jedes Mal, wenn du einen neuen Wert sehe, dann eine Eingabe (scanf), man add totalnewValue, ein Inkrement (count), ein divide average (totalcount) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, würde es 4 Eingangsvariablen erfordern, vielleicht jede Eingabe in einen älteren Eingabevariablen kopieren und dann den neuen gleitenden Durchschnitt berechnen, als Summe der 4 Eingangsvariablen, geteilt durch 4 (rechte Verschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung beantwortet Feb 3 15 um 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und NICHT der gleitende Durchschnitt. Wie Zähler wird größer die Auswirkungen einer neuen Eingabe Probe wird verschwindend klein ndash Hilmar Feb 3 15 at 13:53 Ihre Antwort 2017 Stack Exchange, IncMoving Durchschnittliche Filter (MA Filter) Loading Der gleitende Durchschnitt Filter ist ein einfacher Low Pass FIR (Finite Impulse Response) Filter häufig für die Glättung einer Reihe von abgetasteten Datensignal verwendet. Es nimmt M Proben der Eingabe zu einem Zeitpunkt und nehmen Sie den Durchschnitt dieser M-Samples und produziert einen einzelnen Ausgangspunkt. Es ist eine sehr einfache LPF (Low Pass Filter) Struktur, die für Wissenschaftler und Ingenieure praktisch ist, um unerwünschte geräuschvolle Komponenten aus den beabsichtigten Daten zu filtern. Wenn die Filterlänge zunimmt (der Parameter M), erhöht sich die Glätte des Ausgangs, während die scharfen Übergänge in den Daten zunehmend stumpf werden. Dies impliziert, dass dieser Filter eine ausgezeichnete Zeitbereichsantwort hat, aber eine schlechte Frequenzantwort. Der MA-Filter führt drei wichtige Funktionen aus: 1) Es nimmt M Eingangspunkte, berechnet den Mittelwert dieser M-Punkte und erzeugt einen einzelnen Ausgangspunkt 2) Aufgrund der Berechnungsberechnungen. Der Filter führt eine bestimmte Verzögerung ein 3) Der Filter fungiert als Tiefpassfilter (mit schlechter Frequenzbereichsantwort und einer guten Zeitbereichsantwort). Matlab-Code: Nach dem Matlab-Code simuliert die Zeitbereichsantwort eines M-Punkt-Moving Average-Filters und zeichnet auch den Frequenzgang für verschiedene Filterlängen auf. Zeit Domain Response: Auf dem ersten Plot haben wir die Eingabe, die in den gleitenden Mittelfilter geht. Der Eingang ist laut und unser Ziel ist es, den Lärm zu reduzieren. Die nächste Abbildung ist die Ausgangsreaktion eines 3-Punkt-Moving Average-Filters. Es kann aus der Figur abgeleitet werden, dass der 3-Punkt-Moving Average-Filter nicht viel beim Ausfiltern des Rauschens getan hat. Wir erhöhen die Filterhähne auf 51 Punkte und wir können sehen, dass das Rauschen in der Ausgabe viel reduziert hat, was in der nächsten Abbildung dargestellt ist. Wir erhöhen die Hähne weiter auf 101 und 501 und wir können beobachten, dass - obwohl das Rauschen fast null ist, die Übergänge drastisch abgestumpft werden (beobachten Sie die Steigung auf beiden Seiten des Signals und vergleichen Sie sie mit dem idealen Ziegelwandübergang in Unsere Eingabe). Frequenzgang: Aus dem Frequenzgang kann behauptet werden, dass der Roll-off sehr langsam ist und die Stoppbanddämpfung nicht gut ist. Angesichts dieser Stoppbanddämpfung kann eindeutig der gleitende Durchschnittsfilter kein Frequenzband von einem anderen trennen. Da wir wissen, dass eine gute Leistung im Zeitbereich zu schlechter Leistung im Frequenzbereich führt und umgekehrt. Kurz gesagt, der gleitende Durchschnitt ist ein außergewöhnlich guter Glättungsfilter (die Aktion im Zeitbereich), aber ein außergewöhnlich schlechter Tiefpassfilter (die Aktion im Frequenzbereich) Externe Links: Empfohlene Bücher: Primärer SidebarAveragesSimple Gleitender Durchschnitt MittelwerteSimple Gleitender Durchschnitt Sie sind ermutigt, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, mit jeder Sprache, die Sie kennen können. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine stateful functionclassinstance, die eine Periode annimmt und gibt eine Routine zurück, die eine Zahl als Argument annimmt und gibt einen einfachen gleitenden Durchschnitt ihrer Argumente so weit zurück. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160 Zahlen aus dem Strom, 160 wobei 160 P 160 als Periode bekannt ist. Es kann implementiert werden, indem man eine Initialisierungsroutine mit 160 P 160 als Argument, 160 I (P), 160 anruft, die dann eine Routine zurückgeben sollte, die bei Aufruf mit einzelnen, aufeinanderfolgenden Mitgliedern eines Stroms von Zahlen den Mittelwert von (up To), die letzten 160 P 160 von ihnen, nennen wir diese 160 SMA (). Das Wort 160 Stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit von 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Die Periode, 160 P 160 Ein bestellter Container von mindestens den letzten 160 P 160 Zahlen von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe zu 160 I (), 160 der Initialisierer, 160 getrennte Routinen, die 160 nicht 160 teilen gespeicherten Zustand, so dass sie auf zwei unabhängige Datenströme verwendet werden könnte, Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die aktuellsten p-Werte zu halten. Jede Funktion, die von init-moving-average zurückgegeben wird, hat ihren Zustand in einem Atom, das einen Warteschlangenwert hält. Diese Implementierung verwendet eine kreisförmige Liste, um die Zahlen innerhalb des Fensters am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der gerade aus dem Fenster herausgeht und durch den gerade addierten Wert ersetzt wird. Mit einem Closure bearbeiten Momentan ist dieses sma cant nogc, weil es eine Schließung auf dem Heap zuteilt. Einige Escape-Analysen könnten die Heap-Zuweisung entfernen. Verwenden einer Struct-Edit Diese Version vermeidet die Heap-Zuordnung der Schließung, die die Daten im Stack-Frame der Hauptfunktion hält. Gleiche Ausgabe: Um die Gleitkomma-Annäherungen zu vermeiden, die sich aufhäufen und wachsen, könnte der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Status teilen. Es ist idiomatisch in E, um die Eingabe von der Ausgabe zu trennen (aus dem Schreiben lesen), anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixir-Programm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die Run-Funktion liest numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und überprüft dann das Ergebnis auf STDOUT. Die Ausgabe wird unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Schließungen, aber unveränderliche Variablen. Eine Lösung ist dann die Verwendung von Prozessen und eine einfache Nachricht übergeben basierte API. Matrixsprachen haben Routinen, um die Gleitende für eine gegebene Folge von Gegenständen zu berechnen. Es ist weniger effizient zu schleifen wie in den folgenden Befehlen. Kontinuierlich fordert eine Eingabe an. Die am Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND1 gefunden werden, und Mittelwert finden Sie in ListOPS Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: Liste ist die Liste, die gemittelt wird: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisierung der gleitenden Durchschnittsberechnung und Definieren der Periode von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3) und Ergebnis wird auf Variable x gespeichert und angezeigt movinav2 (4, x) : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Indexvariable und zeigt auf das Ende der Unterliste, in der die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion verwendet die Variable i, um zu bestimmen, welche Werte der Liste in der nächsten Durchschnittsberechnung berücksichtigt werden sollen. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen wir p Elemente betrachten, also wird das erste Element dasjenige sein, das von (i-p1) indiziert wird. Bei den ersten Iterationen aber wird die Berechnung gewöhnlich negativ sein, so dass die folgende Gleichung negative Indizes vermeiden wird: max (i-p1,1) oder die Gleichung, max (i-p, 0) 1. Aber die Anzahl der Elemente auf den ersten Iterationen wird auch kleiner sein, der korrekte Wert wird sein (Endindex - Startindex 1) oder die Gleichung (i - (max (ip, 0) 1) 1) und dann , (I-max (ip, 0)). Die Variable z hält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) und die Ziffern werden (iz) Mitte (Liste, z1, iz) die Liste der Wert, der gemittelte Summe ( .) Summiert sie Summe (.) (Iz) ri wird sie lokalisieren und das Ergebnis an der entsprechenden Stelle in der Ergebnisliste speichern fp1 erstellt eine Teilanwendung, die den (in diesem Fall) den zweiten und dritten Parameter festlegt

No comments:

Post a Comment