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:
Was meinst Du dazu?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
mare_crisium







Zitieren

Lesezeichen