Wednesday 11 January 2017

Gleitender Durchschnittsüberlauf

Ich versuche, einen Weg zu finden, um einen sich bewegenden kumulativen Durchschnitt zu berechnen, ohne die Zähl - und Gesamtdaten, die bisher empfangen werden, zu speichern. Ich kam mit zwei Algorithmen, aber beide müssen die Zähler zu speichern: neue durchschnittliche (alte Daten alte Daten) nächste Daten) nächste Zählung neue durchschnittliche alte Durchschnitt (nächste Daten - alter Durchschnitt) nächste Zählung Das Problem mit diesen Methoden ist, dass die Zählung Wird größer und größer, was zu einer Präzision in dem resultierenden Mittel führt. Die erste Methode verwendet die alte Zahl und die nächste Zahl, die offensichtlich 1 auseinander liegen. Dies hat mich denken, dass vielleicht gibt es einen Weg, um die Zählung zu entfernen, aber leider habe ich es noch nicht gefunden. Es hat mich ein bisschen weiter aber, was in der zweiten Methode aber noch zählen vorhanden ist. Ist es möglich, oder bin ich nur auf der Suche nach dem Unmöglichen gefragt 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 können, indem Sie ein Fenster zu implementieren Größe, die eine Macht von zwei für Bit-Verschiebung statt der Teilung zu ermöglichen, aber nicht brauchen einen Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die a in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Ich habe einen gleitenden Durchschnitt ohne einzelnen Element-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich beginne mit 1 Probe und dividiere durch 1, um die aktuelle Durchschn. Ich füge dann anothe Probe und dividiere durch 2 zu den aktuellen Durchschn. Das geht so lange weiter, bis ich auf die Länge des Durchschnitts komme. Jedes Mal danach, füge ich in der neuen Probe, erhalten Sie den Durchschnitt und entfernen Sie diesen Durchschnitt aus der Gesamtmenge. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathematik-Kerl, aber es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun. Und es funktioniert gut. Denken Sie daran, dass je höher Ihre Länge, desto langsamer folgt es, was Sie folgen wollen. Das kann nicht die meiste Zeit, aber wenn folgende Satelliten, wenn Sie langsam sind, könnte die Spur weit von der tatsächlichen Position und es wird schlecht aussehen. Sie könnten eine Lücke zwischen dem Sat und den nachfolgenden Punkten haben. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um eine ausreichende Glättung und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Spur Punkte erhalten. Antwort # 2 am: November 16, 2010, um 23:03 Uhr Initialisierung insgesamt 0, count0 (jedes Mal, wenn ein neuer Wert dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein dividieren Durchschnitt (totalcount) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, benötigen Sie 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einem älteren inputvariable und berechnen dann den neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (Rechtsverschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung zu beantworten Februar 3 15 bei 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und nicht den gleitenden Durchschnitt. Wie Zähler wird größer wird der Einfluss eines neuen Eingangsbeispiel verschwindend kleiner ndash Hilmar Feb Sie haben wenige laufende Mittelungstechniken versucht, um die Änderung der ADC-Daten in AtMega48 zur Kontrolle von Leuchten (PWM) beim Drehen eines Topfes (ADC) zu glätten. Die Filter (Pseudocodes): I Dass die Filter sehr schön sind. Aber langsam in Reaktion, die erwartet wird. Ich suche nach einem Techniken wie Exponential gleitenden Durchschnitt. Reagiert werden soll. Gibt es eine andere wie diese Wie es heißt: Wo ist zwischen 0 und 1. Wie Code und Optimierung dieser Code klug (ohne Floats) Oder Wie würde ich die Floats in entsprechende ganze Zahlen für die Herstellung von kleinen, schnellen und reaktionsschnellen Code konvertieren. Und ich hielt 1 Andere dann, dass es nicht wie erwartet funktioniert. Weil Idve alle Variablen zu Float ändern. Bitte konzentrieren Sie sich nicht auf folgende Aussage vorerst, sondern beachten Sie. Halten Floats in meinem Code-Basis ist das Ausfüllen der Programmspeicher von 45 bis 137, im Falle von Sie können mit minimalem Overhead durch Begrenzung auf binäre Brüche implementieren. Ich habe dies mit guten Ergebnissen verwendet. Nehmen Sie das bestehende Ergebnis, Shift it N Orten rechts zu teilen durch 2N Subtrahieren Sie es aus dem bestehenden Ergebnis. Neue Daten hinzufügen Dies ist nicht so schnell beim Ändern mit einer Stufenänderung der Eingangsdaten, wie Sie es wünschen, ist aber in vielen Fällen einfach zu implementieren und effektiv genug als Filter. Sie können ihre Reaktion beschleunigen, indem sie informelle Entscheidungen über sein Verhalten in Fällen, die zu unterschiedlich sind. B. eine Anzahl von sequentiellen Eingängen beibehalten, die mehr als eine Grenze sind, die sich von dem existierenden Ergebnis unterscheidet. Wenn dieser Zählwert einen Schwellenwert überschreitet, dann das N-Teilungsverhältnis um einen Faktor ändern. ZB N ist in der Regel 4- Ergebnisse werden rechts verschoben 4 mal 16 teilen. Wenn Eingang mehr als xxx weg von der Antwort ist, tun Sie nur zwei Verschiebungen nach rechts und multiplizieren Sie neue Probe durch 4, bevor Sie addieren. Beantwortet Okt 4 12 at 6:08


No comments:

Post a Comment