Weighted Moving Average Filter C ++


Ich weiß, das ist erreichbar mit Boost wie pro. But ich wirklich gerne vermeiden, Boost Ich habe gegoogelt und nicht gefunden, keine geeigneten oder lesbaren Beispiele. Basisch möchte ich den gleitenden Durchschnitt eines laufenden Streams von einem Strom von Gleitkommazahlen zu verfolgen Mit den neuesten 1000 Nummern als Datenbeispiel. Was ist der einfachste Weg, dies zu erreichen. Ich experimentierte mit der Verwendung eines kreisförmigen Arrays, exponentiell gleitenden Durchschnitt und ein einfacher gleitender Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array passte meine Bedürfnisse am besten Wenn Sie Ihre Bedürfnisse einfach sind, können Sie nur versuchen, einen exponentiellen gleitenden Durchschnitt zu verwenden. Einfach nur, Sie machen eine Akkumulatorvariable, und wie Ihr Code bei jedem Sample sieht, aktualisiert der Code den Akkumulator mit dem Neuer Wert Du wählst eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen dies. Sie müssen nur einen Wert von Alpha finden, wo die Wirkung einer bestimmten Probe nur für etwa 1000 Proben dauert. Hmm, ich bin nicht wirklich sicher, dass dies ist Passend für dich, jetzt t Habe ich sage es hier Das Problem ist, dass 1000 ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt ist Ich bin mir nicht sicher, dass es ein Alpha gibt, das den Durchschnitt über die letzten 1000 Zahlen verbreiten würde, ohne Unterlauf in der Gleitkomma-Berechnung Aber wenn du Wollte einen kleineren Durchschnitt, wie 30 Zahlen oder so, das ist eine sehr einfache und schnelle Art und Weise zu tun it. answered Jun 12 12 bei 4 44. 1 auf deinem Post Der exponentielle gleitenden Durchschnitt kann das Alpha variabel sein So dies erlaubt es Verwendet werden, um Zeitbasis-Mittelwerte zB Bytes pro Sekunde zu berechnen Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde ist, lassen Sie alpha 1 1 sein. Andernfalls können Sie alpha be usecs seit letzter Aktualisierung 1000000 jxh Jun 12 12 at 6 21.Basically Ich möchte den gleitenden Durchschnitt eines laufenden Streams von einem Strom von Gleitkommazahlen mit den neuesten 1000 Zahlen als Datenbeispiel verfolgen. Hinweis, dass die unten aktualisiert die Summe als Elemente als hinzugefügt ersetzt, vermeiden kostspielige ON Traversal zu berechnen Die Summe - benötigt für th E Durchschnitt - auf Nachfrage. Total ist ein anderer Parameter von T zu unterstützen, z. B. mit einer langen langen, wenn insgesamt 1000 lange s, ein int für char s oder ein doppeltes zu total float s. This ist ein bisschen fehlerhaft in diesem Numsamples könnte Gehen Sie an INTMAX vorbei - wenn Sie sich vorstellen können, können Sie eine vorzeichenlose lange lange benutzen oder ein zusätzliches bool Datenelement verwenden, um aufzuzeichnen, wenn der Container zum ersten Mal gefüllt wird, während er Numsamples um das Array herumtreibt, dann umbenannt etwas Unschuldiges wie pos. answered 12. Juni 12 um 5 19 Ich nehme an, dass void Operator T Probe tatsächlich void Operator T Probe oPless Jun 8 14 bei 11 52. oPless ahhh gut gefleckt eigentlich ich bedeutete dafür, dass es void Betreiber T Probe, aber natürlich könnten Sie verwenden, was Notation Sie mochten Beheben, Danke Tony D Juni 8 14 at 14 27.Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Samples zu implementieren. Ich habe festgestellt, dass ich ein bisschen optimieren kann, indem ich eine Fenstergröße, die eine Macht von zwei zu Erlauben Bit-Verschiebung statt zu teilen, aber nicht brauchen ein buf Fer wäre nett Gibt es eine Möglichkeit, ein neues gleitendes durchschnittliches Ergebnis nur als eine Funktion des alten Ergebnisses und der neuen Probe auszudrücken. Erstellen Sie ein Beispiel gleitenden Durchschnitt, über ein Fenster von 4 Samples zu. Add neue Probe eA gleitenden Durchschnitt kann Rekursiv umgesetzt werden, aber für eine genaue Berechnung des gleitenden Mittelpunktes musst du dich an die älteste Eingangsmuster in der Summe erinnern, dh die a in deinem Beispiel Für eine Länge N gleitenden Durchschnitt berechnen sie. wobei ist das Ausgangssignal und xn die Eingabe Signal Eq 1 kann rekursiv geschrieben werden. So müssen Sie sich immer an die Probe x nN erinnern, um zu berechnen 2.As, die von Conrad Turner angezeigt werden, können Sie stattdessen ein unendlich langes exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur berechnen können Von der vergangenen Ausgabe und dem aktuellen Input. But dies ist nicht ein Standard ungewichtet gleitenden Durchschnitt, sondern ein exponentiell gewichteter gleitender Durchschnitt, wo Proben weiter in der Vergangenheit ein kleineres Gewicht bekommen, aber zumindest in der Theorie Sie nie vergessen, was die Gewichte jus Ich werde kleiner und kleiner für Proben weit in der Vergangenheit. Ich habe einen gleitenden Durchschnitt ohne Einzelposten-Speicher für ein GPS-Tracking-Programm, das ich schrieb. Ich beginne mit 1 Probe und teilen durch 1, um die aktuelle avg. I dann fügen Sie hinzu Probe und Teilen sich mit 2 auf die aktuelle avg. Dies geht weiter, bis ich auf die Länge des durchschnittlichen. Jede Zeit später, füge ich in die neue Probe, bekomm den Durchschnitt und entfernen Sie diesen Durchschnitt aus der total. Ich bin kein Mathematiker aber das Schien wie ein guter Weg, um es zu tun Ich dachte, es würde den Magen eines echten Mathe-Kerl drehen, aber es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun Und es funktioniert gut Nur daran erinnern, dass je höher Ihre Länge, je langsamer es ist Nach dem, was du dir folgen möchtest, das kann die meiste Zeit nicht ausmachen, aber wenn du Satelliten verfolgst, wenn du langsam bist, könnte der Weg weit von der tatsächlichen Position entfernt sein und es wird schlecht aussehen Du könntest eine Lücke zwischen dem Sat und den hinteren Punkten haben Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um ade zu bekommen Quate Glättung und nicht zu weit von der tatsächlichen Sat-Position mit dem geglätteten Pfad dots. answered 16. November 16 um 23 03.initialize insgesamt 0, zählen 0 jedes Mal sehen einen neuen Wert. Then eine Eingabe scanf, man add total newValue, eins Inkrementzählung, eine dividierende durchschnittliche Gesamtzählung. 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 Eingabevariablen 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 zu machen. answered 3. Februar 15 um 4 06.That wird tatsächlich berechnen den Gesamtdurchschnitt und nicht die gleitenden Durchschnitt Als Anzahl Wird größer, die Auswirkungen einer neuen Eingabe Probe wird verschwindend klein Hilmar 3. Februar 15 um 13 53. Ihre Antwort.2017 Stack Exchange, Inc. Exponential Moving Averages für unregelmäßige Zeit Series. In Zeitreihen-Analyse gibt es oft ein Bedürfnis nach Glättung Funktionen, die schnell auf Änderungen des Signals reagieren In der typischen Anwendung können Sie ein Eingangssignal in Echtzeit verarbeiten und wollen solche Dinge wie den jüngsten Mittelwert berechnen oder eine sofortige Steigung für sie erhalten. Aber reale Weltsignale sind oft Verrauscht Ein paar verrauschte Samples machen den aktuellen Wert des Signals oder seine Steigung sehr unterschiedlich. Moving Averages. Die einfachste Glättungsfunktion ist ein fensterförmiger gleitender Durchschnitt Da die Proben kommen, nehmen Sie einen Durchschnitt der letzten N Werte. Das wird glatt Out Spikes, aber führt eine Verzögerung oder Latenz Ihr Durchschnitt wird immer durch die Breite Ihres gleitenden Durchschnitt verzögert werden. Das Beispiel oben ist relativ teuer zu berechnen Für jede Probe müssen Sie über die gesamte Größe des Fensters iterieren Aber es gibt billigere Möglichkeiten Behalte die Summe aller Samples im Fenster in einem Puffer und passt die Summe an, wenn neue Samples hereinkommen. Eine andere Art von gleitendem Durchschnitt ist der gewichtete gleitende Durchschnitt, der für jede Position in der Probe w gewichtet wird Indow Vor der Mittelung vermehren Sie jede Probe durch das Gewicht dieser Fensterposition Technisch wird dies eine Faltung genannt. Eine typische Gewichtungsfunktion wendet eine Glockenkurve auf das Probenfenster an. Dies gibt ein Signal, das mehr auf die Mitte des Fensters abgestimmt ist und immer noch Etwas tolerant von lärmenden Proben In der Finanzanalyse verwenden Sie oft eine Gewichtungsfunktion, die die aktuellsten Samples mehr schätzt, um einen gleitenden Durchschnitt zu geben, der die jüngsten Beispiele genauer verfolgt. Ältere Proben werden progressiv weniger Gewicht gegeben. Dies verringert die Effekte der Latenzzeit etwas, während sie dennoch vernünftig ist Gute Glättung. Mit einem gewichteten Durchschnitt müssen Sie immer über die gesamte Fenstergröße für jede Probe iterieren, es sei denn, Sie können die zulässigen Gewichte auf bestimmte Funktionen beschränken. Der exponentielle bewegte Durchschnitt. Eine andere Art von Durchschnitt ist der exponentielle gleitende Durchschnitt oder EMA Dies Wird oft verwendet, wo Latenz ist kritisch, wie in Echtzeit Finanzanalyse In diesem Durchschnitt, die Gewichte sinken expo Nentially Jede Probe wird einige Prozent kleiner als die nächste letzte Probe bewertet. Mit dieser Einschränkung können Sie den gleitenden Durchschnitt sehr effizient berechnen. Wo Alpha eine Konstante ist, die beschreibt, wie sich die Fenstergewichte im Laufe der Zeit verringern Wenn zum Beispiel jede Probe gewichtet werden soll 80 des Wertes der vorherigen Probe, würdest du alpha 0 setzen 2 Das kleinere Alpha wird um so länger, wenn dein gleitender Durchschnitt z. B. wird es glatter, aber weniger reaktiv auf neue Samples. Die Gewichte für eine EMA mit Alpha 0 20.Sie können Sie Sehen Sie, für jede neue Probe müssen Sie nur mit dem Wert des vorherigen Durchschnitts zu durchschnittlich Also Berechnung ist sehr sehr schnell. In der Theorie alle vorherigen Proben tragen zum aktuellen Durchschnitt, aber ihr Beitrag wird exponentiell kleiner im Laufe der Zeit. Dies ist ein sehr Leistungsstarke Technik, und wahrscheinlich das Beste, wenn Sie wollen, um einen gleitenden Durchschnitt, der schnell reagiert auf neue Proben, hat gute Glättung Eigenschaften und ist schnell zu berechnen. Der Code ist trivial. EMA für Unregelmäßige T Ime Serie. Die Standard-EMA ist in Ordnung, wenn das Signal in regelmäßigen Zeitintervallen abgetastet wird Aber was ist, wenn Ihre Proben in unregelmäßigen Intervallen kommen. Imagine ein kontinuierliches Signal, das in unregelmäßigen Intervallen entnommen wird Dies ist die übliche Situation in der Finanzanalyse In der Theorie gibt es eine Kontinuierliche Funktion für den Wert eines Finanzinstruments, aber Sie können nur dieses Signal ausprobieren, wenn jemand tatsächlich einen Handel ausführt. Ihr Datenstrom besteht aus einem Wert, zuzüglich der Zeit, in der er beobachtet wurde. Ein Weg, um damit umzugehen ist zu konvertieren Das unregelmäßige Signal zu einem regulären Signal, durch Interpolation zwischen Beobachtungen und Resampling Aber das verliert Daten, und es führt wieder Latenz. Es ist möglich, eine EMA für eine unregelmäßige Zeitreihe direkt zu berechnen. In dieser Funktion übergeben Sie die aktuelle Probe aus deinem Signal und die vorherige Probe und die Zeitdauer, die zwischen den beiden verstrichen ist, und der vorherige Wert, der von dieser Funktion zurückgegeben wird. So wie gut funktioniert diese Arbeit Um I ve Gen zu demonstrieren Eine Sinuswelle bewertet, dann in unregelmäßigen Intervallen abgetastet und etwa 20 Rauschen eingeführt. Das ist das Signal, das zufällig variiert wird - 20 aus dem ursprünglichen wahren Sinus-Signal. Wie gut das unregelmäßige, exponentielle gleitende Durchschnitt das Signal wiedergibt, ist die rote Linie Originale Sinuswelle, die in unregelmäßigen Intervallen abgetastet wird Die blaue Linie ist das Signal mit dem Rauschen hinzugefügt Die blaue Linie ist das einzige Signal, das die EMA sieht Die grüne Linie ist die geglättete EMA Sie können sehen, es erholt sich das Signal ziemlich gut Ein wenig wackelig, aber was kann Sie erwarten von solch einem lärmenden Quellsignal. Es wird um 15 nach rechts verschoben, weil die EMA etwas Latenz einführt. Je glatter Sie es wollen, desto mehr Latenz werden Sie sehen, aber von hier aus können Sie zB eine sofortige Steigung für ein Lautes unregelmäßiges signal. Was können Sie mit diesem Hmm machen.

Comments