Florian,
einen gleitenden Mittelwert stelle ich mir immer wie eine Warteschlange vor: Jedesmal, wenn ein neuer Messwert dazukommt, rückt die ganze Schlange einen Schritt voran und der erste (also der älteste) Messwert fällt aus der Schlange heraus. In die neue freie Stelle am anderen Ende der Schlange wird der neue Messwert eingeschrieben. Danach werden alle Werte in der Schlange zusammengezählt und durch die Schlangenlänge (Anzahl) dividiert - das ist dann der neue Mittelwert.
Der erste Schritt zur Vereinfachung besteht darin, dass man eine Variable MessWertSumme einführt, die gross genug ist, um den Wert Anzahl*maximaler_Messwert ohne Überlauf aufzunehmen. Diese Variable wird ganz am Anfang mit Null initialisiert. Jedesmal, wenn ein neuer Messwert dazukommt, bleibt das Schlangenballett dasselbe. Aber statt die Summe über alle Werte in der Schlange zu bilden, bildet man die Differenz zwischen dem Messwert, der aus der Schlange herausgefallen ist, und dem neuen und zählt diese Differenz zu MessWertSumme dazu. Um den gleitenden Mittelwert zu berechnen, braucht man jetzt nur noch MessWertSumme durch die Anzahl zu dividieren. Damit ist jetzt überflüssig geworden, die zeitraubende Summe über alle Werte der Schlange zu berechnen .
Die zweite Vereinfachung besteht darin, die ganze Schlange wegzulassen, weil man annimmt, dass die einzelnen Messwerte in der Schlange sich sowieso nicht so sehr vom Mittelwert unterscheiden. Wenn jetzt ein neuer Messwert ankommt, wird davon der alte Mittelwert abgezogen und die Differenz zu MittelWertSumme dazuaddiert. Den neuen Mittelwert bekommt man wieder, indem man MittelWertSumme durch Anzahl dividiert. Damit hat man auch noch den Speicherplatz für die Warteschlange und den Zeitaufwand für das Schlangenballett gespart .
Der Code dazu könnte so aussehen:
Code:
$sim
$crystal = 16000000
$regfile = "m16def.dat"
$baud = 38400
Dim Messwert As Integer : Messwert = 512
Const Anzahl = 50 ' Anzahl Messwerte
Dim MessWSumme As Single
Dim Mittelwert As Single
Dim Mittelwert_int As Integer
Dim Temp As Single
REM der nachfolgende Teil ist IMHO überflüssig
REM Dim Zaehler As Word : Zaehler = 0
REM While Mittelwert < 511
REM Incr Zaehler
REM Temp = Mittelwert / Anzahl
REM Mittelwert = Mittelwert - Temp
REM Temp = Messwert / Anzahl
REM Mittelwert = Mittelwert + Temp
REM Print Zaehler ; ": " ; Mittelwert
REM Wend
REM 'Print Zaehler ; ": " ; Mittelwert
MessWertSumme = 0
Mittelwert = 0
Do
Input "Neuer Messwert: " , Messwert
Temp = Messwert-Mittelwert
MessWSumme = MessWertSumme+Temp
Mittelwert = MessWertSumme/Anzahl
Mittelwert_int = Mittelwert
Print "Neuer Mittelwert: " ; Mittelwert_int
Loop
End
Was meinst Du dazu?
mare_crisium
Lesezeichen