Hallo, irgendwo bin ich schonmal über eine Formel zur schrittweisen Berechnung eines Mittelwertes gestoßen, finde sie nur leider nicht mehr. Anwendung: Eine Applikation sammelt N Datenwerte (der N-1 wird im folgenden Zyklus immer wieder verworfen). Steht der N-te Datenwert bereit soll auch der Mittelwert der Datenreihe bekannt sein. Der Gesamtrechenbedarf ist so zwar größer, jedoch kann ich es mir aus Zeit-, Zahlenbereichs- und Speichergründen nicht leisten, erst alle Werte zu sammeln und dann die Rechnung auszuführen. Ein MA-Filter mit einem Riesenfenster ist auch nicht praktikabel.
Man müßte alle Werte speichern, um den jeweils ältesten wieder aus der Statistik zu entfernen, oder habe ich das "der N-1 wird verworfen" falsch verstanden?
wert(n): X [n ist element von 0 .. N-1] Anzahl von Werten je Mittelung: N überlegung: jeder wert der N messungen fliesst zum N-ten teil in die Mittelung ein... --> Mittelwert Y = (X(0)/N)+(X(1)/N)+(X(2)/N)+...(X(N-1)/N) -mach dir ne variable Y = 0; -jeden gelesenen wert X teile durch die anzahl N und addiere sie zu Y auf -nach N gelesenen werten steht die mittelung in Y (auf 0 zurücksetzen)
wie wärs mit einem gleitenden mittelwert? (aktueller Wert + neuer Wert) >> 1 dann ist das Peak-Verhalten nicht ganz so toll. Oder allgemeiner schau mal nach TP1-Filter mit etwas probieren bekommst du auch ohne die theoretischen Kenntnisse was brauchbares hin.
@Sebel de Tutti Besten dank, die war es. @Christoph Es war so gemeint, dass ich einen maximalen Speicherbedarf von 1 Wert habe. Also mit dem aktuellen wird der vorangegange wieder verworfen. @Sven Die Lösung funktioniert auch, die erstere hat jedoch den Vorteil, dass bereits während der Laufzeit ein gültiger Mittelwert vorliegt.
@Hans Dieter Das würde Filter hoher Ordnung bedeuten, was bei mir nicht praktikabel ist. Mein Fall ist ein Mittelding aus Dezimation und Tiefpassfilterung.
Zu der Formel: "((AktuellerMittelwert*N-1)+ZusaetzlicherDatenWert)/N N++" Ist hierbei wirklich (AktuellerMittelwert * N - 1) gemeint oder (AktuellerMittelwert * (N-1))? N ist hierbei ein fortlaufender Zähler? Sorry für die doofe Frage, ich kenne diese Methode nicht...
Er hat die Klammern vergessen gehabt :) XMW(n+1) = (XMW(n)*(N-1) + x(n)) / N XMW(n+1) - neuer Mittelwert XMW(n) - aktueller Mittelwert x(n) - aktueller Wert N - aktuelle Anzahl der Werte (fortlaufender Zähler)
Ich sehe das ein wenig anders. Einen FIFO Speicher mit x Elementen. Eine Mittelwertsumme Y. Der neue Wert Z. Y := Y - FIFO[0] + Z. Mittelwert := Y / x. FIFO[x] := Z. D.h. neben dem FIFO der die letzen X Meßwerte speichert hast du noch eine globale Variable die die Summer aller Werte im FIFO darstellt. Der neue Wert Z muß nun in den FIFO und der älteste Wert aus dem FIFO muß raus. Man subtrahiert also den ältesten FIFO Wert von der Summe und addiert den neuen daruf. Somit enthält Summe mit zwei Additionen immer die aktuelle Summe aller Werte im FIFO. Der gleitende Mittelwert ist dann Summe / Anzahl Elemente im FIFO. Im Grunde ist das dann ein TP. Gruß Hagen
Hast die Implementierung eines Moving-Average Filters beschrieben.
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.