Habe ich Manfs Erklärung falsch aufgefasst, oder das richtige Ergebnis und verstehe es nur nicht es zu deuten?
Die Division durch 1000 in Manfs Beispiel gilt nur, wenn man auch über 1000 Messwerte mittelt.
Du rechest aber mit nur 2 Messwerten, bzw. mit 998 Messwerten die = 0 sind.
Wenn du eine Mittelung über x Werte machst, musst du entweder in deinem Programm berücksichtigen, dass du Anfangs noch keine X-Messwerte hast und entsprechende nur durch die Anzahl der vorhandenen Messwerte teilen, oder dich einfach damit abfinden, dass das Programm nach dem Start erst mal eine ganze Zeit lang falsche Messwerte liefert.
Ich habe mal ein bischen in Bascom mit der fliessenden Mittelung rumgespielt. Dan Code füge ich unten ein, wenn du Bascom hast, kannst du ihn dir anpassen und ihn im Simulator von Bascom laufen lassen.
Der erste Teil des Programms geht von einer Mittelung über 50 Messwerte aus, die Messwerte sind immer genau 512, das Programm ignoriert aber so wie du, dass es am Anfang ja noch gar keine 50 Messwerte gibt.
An der Ausgabe kannst du dann sehen, wie sich das Program langsam auf den korrekten Mittelwert "hinarbeitet". Ganz korrekt wird der Mittelwert gar nicht, dass liegt an der Fliesskommaarithmetik.
Anschliessend kannst du dann selber neue Messwerte eingeben und sehen, wie wenig sich ein einzelner Messwert auf das fliessende Mittel auswirkt.
Code:
$sim
$crystal = 16000000
$regfile = "m16def.dat"
$baud = 38400
Dim Messwert As Integer : Messwert = 512
Const Anzahl = 50 ' Anzahl Messwerte
Dim Mittelwert As Single
Dim Mittelwert_int As Integer
Dim Temp As Single
Dim Zaehler As Word : Zaehler = 0
While Mittelwert < 511
Incr Zaehler
Temp = Mittelwert / Anzahl
Mittelwert = Mittelwert - Temp
Temp = Messwert / Anzahl
Mittelwert = Mittelwert + Temp
Print Zaehler ; ": " ; Mittelwert
Wend
'Print Zaehler ; ": " ; Mittelwert
Do
Input "Neuer Messwert: " , Messwert
' For Zaehler = 1 To Anzahl
Temp = Mittelwert / Anzahl
Mittelwert = Mittelwert - Temp
Temp = Messwert / Anzahl
Mittelwert = Mittelwert + Temp
Mittelwert_int = Mittelwert
' Next Zaehler
Print "Neuer Mittelwert: " ; Mittelwert_int
Loop
End
Lesezeichen