Mittelwertberechnung

kpeter

Level-1
Beiträge
693
Reaktionspunkte
26
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallöchen allerseits

Ich bin mal neugierig was ihr über dieses Thema sagt

Ihr sollt einen Mittelwert von 20 sekunden bilden wie würdet ihr das anstellen

1) z.B. Messwert einlesen , alten wert aus db löschen ,neuen reinschreiben ,dividieren durch die anzahl und mittelwert ist fertig

2) oder ((1*Messwert)+(19*aktueller Mittelwert))/20 = aktueller Mittelwert

natürlich nur wenn man davon ausgeht das man dies nur jede sekunden aufruft

so nun meine frage was ist an der zweiten fariante falsch
oder was würde mir einen fehler einbringen

mfg
 
Hallo,

1) z.B. Messwert einlesen , alten wert aus db löschen ,neuen reinschreiben ,dividieren durch die anzahl und mittelwert ist fertig

Bei der Variante fehlt vor dem Dividieren die Summenbildung :(

2) oder ((1*Messwert)+(19*aktueller Mittelwert))/20 = aktueller Mittelwert

Diese Variante hat den Nachteil, das der aktuelle Mittelwert ja bereits aus 20 alten Werten gebildet worden ist. Im aktuellen Tastschritt erhältst Du nun einen Mittelwert aus 21 Werten, ein zumeist wahrscheinlich nicht auffallender aber gelegentlich vielleicht doch übler Fehler, vor allem bei kleineren n (n: Anzahl der Werte).

Warum nicht so:
Code:
neue_Summe = alte_Summe - ältester_Wert + neuester_Wert
neuer_Mittelwert = neue_Summe / n

Tschüsss Peter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallöchen

zu 1 oki danke die summe ist schon klar macht auch normalerweise ein fb :p

ok zum 2

das problem beim 2 ist wenn die werte stark schwanken stimmt der mittelwert nicht mehr
das mit deinen 21 Werten stimmt nicht ganz du bewertest denn altenMesswert ja nur mit 95% damit fällt dir ja ein Messwert raus
und denn neuen nimmst du zu 5 % in deine Rechnung mit auf somit wieder 100 % und 20 Werte

das ganze ist zwar nur eine annäherung aber ....

sollte stimmen

mfg
 
Hallo,

das mit deinen 21 Werten stimmt nicht ganz du bewertest denn altenMesswert ja nur mit 95% damit fällt dir ja ein Messwert raus
und denn neuen nimmst du zu 5 % in deine Rechnung mit auf somit wieder 100 % und 20 Werte

Doch :evil: :lol: Bei Variante zwei besteht der alte Mittelwert aus 1/20 der Summe von 20 alten Werten, davon gehen 95% in die Ermittlung des neuen MW ein, also 19/20 von jedem der 20 Werte.
Dazu kommt dann 1/20 des neuesten Meßwertes.
Fällt der älteste Wert (der eigentlich nich mehr da sein sollte) stark aus der Reihe, stimmt das Ergebnis der Variante zwei dann eben nicht mehr mit dem Resultat von Variante 1 überein, da dieser das Ergebnis verfälscht!

Peter
 
Zu Variante 2:
Es gehen nicht 21 Werte ein und nicht zu gleichen Teilen, sondern im Prinzip ist die GANZE Vorgeschichte darin enthalten:

S(n)=0.05*Xn+0.95*S(n-1)
S(n-1)=0.05*X(n-1)+0.95*S(n-2)
S(n-2)=0.05*X(n-2)+0.95*S(n-3)
u.s.w.
Wem's Spaß macht, kann nun in die 2. Zeile in die 1. für S(n-1) einsetzen un immer so weiter und eine geschlossenen Formel suchen...

Man bezeichnet das auch als "exponetiell gewichteten gleitenden Mittelwert". Es ist, bis auf daß es sich um zu bestimmten (diskreten) ZeitPUNKTEN erfaßte ("abgetastete") Werte handelt, die genaue Entsprechung zu einem R-C-Tiefpaß oder einem PT1-Glied aus der Regelungstechnik.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

um die Diskussion in eine andere Richtung zu lenken, möchte ich beschreiben, wie ich diese Aufgabenstellung gelöst habe.
1. Aktuellen Messwert lesen
2. Messwert in einen Ringpuffer schreiben. Z.B. ein Array mit x Werten.
Dabei wird nach Programmstart zunächst in den ersten Speicherplatz geschrieben und anschließend bei jedem Schreibvorgang der Index erhöht, bis der letzte Platz beschrieben wurde. Anschließend beginnt die Schleife wieder beim ersten Speicherplatz und der erste bzw. älteste Messwert wird automatisch überschrieben.
3. Die Werte werden aufaddiert und durch die Anzahl geteilt

Vorteil dieses Algorythmus ist, das keine aufwendigen Umkopierorgien stattfinden. Der Nachteil ist, das sich der aktuelle messwert nicht an einem festen Speicherplatz befindet.

Gruß Hagen
 
guten Morgen allerseits

danke hagen

genau so habs ich auch programmiert nur brauchst du für das ganze eine ganze menge speicher

kleines Rechenbeispiel

du sollst 20 sek mittelwerte Rechnen bekommst alle 100 ms 1 messwert
das wären 200 Werte ( lassen wir mal denn speicher für die summe und denn aktuellen mittelwert raus ) hast du 800 Byte
das ganze für 300 Messwerte und du hast einen speicherplatz bedarf von 240 Kb

wenn man das ganze auf 5 sek macht sind noch immer 60 kb

bei der anderen lösung verbrauchst du kein einziges bit

Morgen zottel

wobei die vorgeschichte immer mehr verblasst


hier mal eine Graphik

rot ist der richtige mittelwert
gelb ist die berechnung

mal anders gefragt was ist ein mittelwert das ergebnis von x werten durch die anzahl
oder ein geglätter wert der die messwerte wiederspiegelt


mfg
 
Wenn du Speicherplatz sparen willst und trotzdem eher in Richtung "mathematischen" Mittelwert gehen willst, kannst du ja je Sekunde einen Mittelwert bilden und aus diesen wiederum einen Gesamt-Mittelwert. Das nächste Problem ist auch die Rechenungenauigkeit, wenn du sehr viele Werte aufaddierst und dann dividierst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
kpeter schrieb:
Morgen zottel

wobei die vorgeschichte immer mehr verblasst
Wollte ich mit "und nicht tu gleichen Teilen" gesagt haben. Zeigen die Formeln auch und das Wort "exponetiell". Zur Rauschunterdrückung oder Glättung ist gegen die 2. Methode absolut nichts einzuwenden. Sie ist überall da angebracht, wo du in der Analogtechnik einen RC-Tiefpass nehmen würdest.
Übrigens: So, wie du 2 RC-Glieder, durch OP-Amp gepuffert, damit der Strom in das 2. nicht den Ladestrom des 1. belastet, in Reihe schalten kannst, um ein Filter höherer Ordnung zu erhalten, kannst du es auch mit dieser "Mittelwertformel" machen.
In der digitalen Signalverarbeitung heißt so etwas ein IIR-(infinite impulse response) Filter.

Die 1. Variante der Mittelwertbildung ist hingegen ein spezielles FIR-(finite impulse response) Filter. Ein allgemeines FIR-Filter hat eine Reihe von Koeffizienten, so daß der Wert in der ersten Speicherstelle mit dem ersten Koeffizienten multipliziert wird u.s.w. In der 1. Variante sind einfach alle Koeffizienten gleich.
 
Hallöchen

Ralle schrieb:
kannst du ja je Sekunde einen Mittelwert bilden und aus diesen wiederum einen Gesamt-Mittelwert.

Wenn ich das machen würde dann brauch ich gar keinen mittelwert denn der würde mir die ganze sache noch mehr verfälschen

Ralle schrieb:
Das nächste Problem ist auch die Rechenungenauigkeit, wenn du sehr viele Werte aufaddierst und dann dividierst.

Was meinst du mit Rechenungenauigkeit ???

mfg
 
kpeter schrieb:
Hallöchen

Ralle schrieb:
kannst du ja je Sekunde einen Mittelwert bilden und aus diesen wiederum einen Gesamt-Mittelwert.

Wenn ich das machen würde dann brauch ich gar keinen mittelwert denn der würde mir die ganze sache noch mehr verfälschen

Ralle schrieb:
Das nächste Problem ist auch die Rechenungenauigkeit, wenn du sehr viele Werte aufaddierst und dann dividierst.

Was meinst du mit Rechenungenauigkeit ???

mfg

zu 1.
Wieso,
du nimmst 20 Sekunden lang alle 100ms einen Wert und bildest daraus den Mittelwert.
Das sind 200 Werte in 20 Sekunden, aus denen du den Mittelwert bildest.
Wenn du je Sekunde (10 Werte) einen Mittelwert bildest, kannst du aus diesen 20 Werten einen Gesamtmittelwert bilden.

zu 2.
Je nachdem wie groß die Werte sind, die du aufaddieren mußt, kommst du evtl. in Größenbereiche, die nicht mehr genau dargestellt werden.
Gleitpunkt hat (ich muß mal raten 7 Stellen + Exponent).
Es wird also irgendwann "gerundet".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallöchen

[quote="Ralle
zu 1.
Wieso,
du nimmst 20 Sekunden lang alle 100ms einen Wert und bildest daraus den Mittelwert.
Das sind 200 Werte in 20 Sekunden, aus denen du den Mittelwert bildest.
Wenn du je Sekunde (10 Werte) einen Mittelwert bildest, kannst du aus diesen 20 Werten einen Gesamtmittelwert bilden.".[/quote]

das problem ist das der messwert ziemlich stark schwandkt +- 20 A pro 100 ms
wenn ich dann nur jede 1 s einen messwert nehme hab ich zufallswerte


[quote="Ralle
zu 2.
Je nachdem wie groß die Werte sind, die du aufaddieren mußt, kommst du evtl. in Größenbereiche, die nicht mehr genau dargestellt werden.
Gleitpunkt hat (ich muß mal raten 7 Stellen + Exponent).
Es wird also irgendwann "gerundet".[/quote]

mit denn 7 Stellen hast du recht aber ich hab denn strom nur von 0.0 bis 435.0 A

schönes wochenende
 
Hallo,

wenn tatsächlich der artithmetische Mittelwert fortlaufend aus einer festgelegten Anzahl von Werten berechnet werden muss, kommt man um das Zwischenspeichern jedes einzelnen Wertes nicht herum. Es muss exakt der älteste Wert aus der Berechnung herausfallen. Dies wäre z.Bsp. für statistische Auswertungen notwendig.

Soll jedoch lediglich ein Messwert geglättet werden, so muss man diesen speicherkillenden Aufwand nicht betreiben. Möglichkeiten wurden ja schon genannt. Ein gutes Beispiel ist auch auf der homepage von Jürgen Müller zu finden. Wer es gerne etwas exakter mag, kann auch im OB35 mit der e-Funktion hantieren.

Gruss, Onkel
 
Bin auch auf der Suche nach einer einfacheren Filtermethode hier gelandet.

Hallo,
Ein gutes Beispiel ist auch auf der homepage von Jürgen Müller zu finden. Wer es gerne etwas exakter mag, kann auch im OB35 mit der e-Funktion hantieren.
Ist in der Tat ein gutes Beispiel.

Die dort verwendete Formel: ((W-FW) * (1/K)) + FW
und die Formel aus dem Ursprungs-Beitrag: (W+((K-1)*FW)) / K
sind eigentlich rechnerisch ident.
(W: Messwert, FW: Gefilterter Wert, K: Konstante)

Rechnerisch bilden beiden Funktionen sehr schön ein PT1-Glied ab, sollte sich als gut zum dämpfen eines Messwertes eignen.

Die erste Formel scheint jedoch (zumindest mit der Genauigkeit der S7) eine bessere Annäherung an den Messwert zu schaffen bevor die Berechnung stoppt.
Des weiteren ist die Zahl der benötigten Anweisungen (sofern K in Formel 1 als z.B.: 0,001 angegeben) kleiner.

(Habs mal in Excel ausprobiert, so sieht das Ergebnisse aus)
PT1-Glied_Annäherung.jpg
 

Anhänge

  • PT1-Glied_Annäherung_XLS.zip
    355,2 KB · Aufrufe: 40
Zuletzt bearbeitet:
Hallöchen allerseits

Ich bin mal neugierig was ihr über dieses Thema sagt

Ihr sollt einen Mittelwert von 20 sekunden bilden wie würdet ihr das anstellen

1) z.B. Messwert einlesen , alten wert aus db löschen ,neuen reinschreiben ,dividieren durch die anzahl und mittelwert ist fertig

2) oder ((1*Messwert)+(19*aktueller Mittelwert))/20 = aktueller Mittelwert

natürlich nur wenn man davon ausgeht das man dies nur jede sekunden aufruft

so nun meine frage was ist an der zweiten fariante falsch
oder was würde mir einen fehler einbringen

mfg

1)-Arithmetischer Mittelwert
2)-Gleitender Mittelwert (Tiefpass)
 
Zurück
Oben