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