www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mittelwert auf 24h bezogen ermitteln


Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe eine Variable die derzeit sekündlich als Mittelwert aus neuem 
Wert und vorigem aktualisiert wird. Das wird aber nur stumpf auf einem 
LCD angezeigt und ist dafür auch erstmal geeignet.

Nun hätte ich aber gern einen Wert der den Durschnitt der letzten 24 
Stunden umfasst. Also müsste ich ja irgendwie immer den Wert von vor 
24Stunden abziehen vom aktuellen Durschnittswert der letzten 24Stunden 
usw!?!

Aber irgendwie hab ich da zur Zeit wohl ein wenig Leim im Hirn, denn ich 
komm einfach auf keinen Zweig wie ich das Ablauftechnisch mache. Könntet 
ihr mir da helfen?

Ich möchte hier kein fertiges Programm sondern bitte nur um 
Denkanregungen in Bezug auf den "Algorithmus" der nötig wäre.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja, ganz stumpf, 3600 Werte sammeln, addieren, durch 3600 teilen.
Aber es gibt verschiedene Mittelwerte und dementsprechend verschiedene 
Methoden, diesen zu ermitteln.

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ähnlich dachte ich mir das auch, das wären in meinem fall aber 3600 
byte werte und das dann noch 4 mal ggg
wenn ich mich nicht vertue also rund 3,5MB + sonstiges variablen die ich 
noch so brauche hehe, doch etwas übel.

also müsste ich wohl irgendwie immer den mittelwert je rechnung 
"weiterführen" aus "(aktueller wert + alt-durchschnittswert) / 2" wie 
halt bisher auch und dann müsste ich irgendwie noch den ersten der 3600 
werte immer "mitführen" und daraus rückrechnen.

klar ist mir natürlich, dass die ersten laufenden 24stunden dieses 
berechnung wenig sinn macht, das ist aber gar nicht schlimm.

Autor: G24 - tec (Firma: G24-tec e.K.) (g24-tec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also falls eine iterative Formel für die Berechnung des Mittelwerts mit 
dieser  Frage gemeint war, dann hier:
s[n]=( (n-1)*s[n-1]+1*x[n] )/n
(wobei s[n] Mittelwert von den vorherigen n Werten ist)
Man kann es auch so bekommen
s[n]=s[n-1]+(x[n]-s[n-1])/n

Aber im Prinzip ist das relativ ineffektiv...

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3,6k * 4=3,5M??
Ich glaube, du vertust dich :-)

Autor: Daniel D. (bademeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne andere Variante wäre ja ein laufender Mittelwert. Also den alten 
Mittelwert + den neuen Wert..

Da das aber nur bedingt Sinn macht, könnte man den alten Mittelwert ja 
auch mit 3599 gewichten und den neuen dazu addieren. Das ganze dann 
durch 3600 und fertig. Sollte auch gar nicht so weit von dem korrekten 
Mittelwert entfernt sein.
Edit: also das was Henning im 2ten Post mit "mitführen" meinte..

Autor: Gast123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum eigentlich 3600?
60Sekunden/Minute, 60 Minuten/Stunde, 24 Stunden Beobachtungszeitraum 
macht doch

60*60*24=86400, oder etwa nicht? :-)

Autor: G24 - tec (Firma: G24-tec e.K.) (g24-tec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel Dyla wrote:
> Ne andere Variante wäre ja ein laufender Mittelwert. Also den alten
> Mittelwert + den neuen Wert..
>
> Da das aber nur bedingt Sinn macht, könnte man den alten Mittelwert ja
> auch mit 3599 gewichten und den neuen dazu addieren. Das ganze dann
> durch 3600 und fertig. Sollte auch gar nicht so weit von dem korrekten
> Mittelwert entfernt sein.
> Edit: also das was Henning im 2ten Post mit "mitführen" meinte..

Also ich sage nur: ab und zu die Beiträge der anderen lesen...

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man speichert erstmal nur jeweils 24 Werte und bildet daraus den 
Mittelwert. Diesen wiederum in den 3600er-Buffer, passt exakt. Die 24 
ergeben sich aus der Verknispung der Antibinoxe - kurz, du hast 
natürlich Recht.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Antiplinoxe !

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Speichere 60 Sekunden und berechne damit den minuten Schnitt, danach 
benutzte den Speicher für die nächtse Minute.
Speicher diesen minuten Schnitt, und wennn 60 Minuten zusammen sind 
berechnest du den Stunden Schnitt=> speichern ..........

So benötigst du für diese Berechnug 60 * Sekunden Variable + 60 * 
Minuten Variable + 24 mal Stunden Variable.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich würde die Mittelwerte stündlich "gleitend" wie folgt ermitteln:

Summe(n) = Summe(n-1) + x(n)

Mittel(n) = Summe(n) / n

Die 24 Stundenwerte würde ich speichern und daraus das 24-Stunden-Mittel 
rechnen.
Das ist meiner Meinung sogar genau für die Werte zur ganzen Stunde.

Gruß

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M = (3600*Summe(Mi)(i=1-23) + ((3600-n)*M24 + n * 
Ma)(n=1-3600))/(24*3600)

mit
Mi ... Mittelwerte aus den Stunden (-1h ... -24h)
Ma ... Mittelwert aus der aktuellen Stunde
n  ... Sekunde der aktuellen Stunde (1-3600)

Gruss

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bin in mathe ganz ehrlich einfach eine totalniete. g
könnte ich die werte vielleicht gewichten?!

also wenn ein neues wert dazukommt rechne ich halt (bei sekunden) 86399 
teile des alten durschnitts + 1 teil des neuen durschnitts = 
NEUDURSCHNITT
aber dann wird ja die nachpegelung des wertes je nachdem wie lange die 
schaltung lief immer flacher?! ich will ja nur die letzten 24h als bezug 
nehmen!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wenn Du nur den 24 Stundenmittelwert haben willst, musst Du ältere Werte 
rauswerfen. Da Du aber nicht genug Speicher investieren willst, musst Du 
die Daten verdichten. Meine obige Formel rechnet mit den 24 Mittelwerten 
der letzten 24 Stunden.
Der Mittelwert einer Stunde ergibt sich aus der Summe aller Messwerte 
einer Stunde dividiert durch deren Anzahl:

Summe = Summe + Messwert (pro Messung)

Stundenmittel = Summe / 3600 (am Ende der Stunde)

Der 24 Stundenmittelwert ist:

M24 = [Mittel(1) + ... + Mittel(24)] / 24  (Formel 1)

Nach jeder abgelaufenen Stunde musst Du den neuen Stundenmittelwert 
speichern und den 24 Stunden alten wegschmeißen. Die Werte rutschen also 
eins durch:

M(24) <= M(23)
M(23) <= M(22)
...
M(2) <= M(1)
M(1) <= M(abgelaufene Stunde)

Nun liefert Formel 1 den neuen 24 Stundenmittelwert.

Während der Stunde kannst Du auch einen Mittelwert bilden, den 
Mittelwert seit Stundenbeginn:

Stundenmittel(n Sekunden) = Summe(n Sekunden) / n

Damit kannst Du auch während der Stunde einen 24 Stundenmittelwert 
berechnen. Wichtig ist hierbei die Gewichtung. Da Du nur 24 Stunden 
einbeziehen willst, musst Du soviele alte Werte rausschmeißen, wie neue 
Werte dazukommen.
Also:
Während der aktuellen Stunde kommen n neue Werte dazu:

Summe(n) = Summe(n-1) + Messwert(n)

der aktuelle Mittelwert:

M(a) = Summe(n) / n

Wie kombiniert man das nun mit den letzten 24 Stunden?

Vorschlag: n neue Werte ersetzen n alte Werte so, dass n mal der 
Mittelwert  vor 24 Stunden entfern wird:

n*M(a) + (3600-n)*M(24)

Die anderen 23 Stundenmittelwerte haben je das Gewicht von 3600 
Messungen:

3600 * [M(1) + ... + M(23)]

Alle Messungen zusammen ergeben den 24 Stundenmittelwert:

M24 = {3600 * [M(1) + ... + M(23)] + n*M(a) + (3600-n)*M(24)} / (24 * 
3600)

Das ist der in jeder Sekunde beste Mittelwert aus 24 Stunden Messung mit 
stündlicher Messwerteverdichtung.

Gruß

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja genau das war der hakpunkt in meiner überlegung. das mit dem 
verdichten immer auf stündliche werte war mir klar, jedoch war mir nicht 
klar wie ich dann den "durchlaufend stabilen mittelwert" erreiche.

würd ich die minus 24ste stunde komplett killen dann würde mein 
mittelwert ja total aus dem konzept kommen da ihm dann ja 3799 
sekundenwerte auf einmal fehlen täten! ;)

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal die seite an :
http://www.ibrtses.com/embedded/exponential.html

Fuer eine Zeitkonstante von 87600 samples kann man 65656 als 2^16 nehmen 
und ist sehr nahe. Also

output:=input * 1/65536 + output -( output * 1/65536)
oder
output:=input shr 16  + output - output shr  16

Ist doch einfach...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
das ist ein Tiefpass 1. Ordnung kein Mittelwertbildner! Das ist nicht 
das selbe! Die Gewichtung eines Messwertes fällt exponentiell mit dem 
alter.
Ein Mittelwertbildner gewichtet konstant im Auswertungszeitraum!

Gruß

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist korrekt. Ein kleiner akademischer Unterschied. Und deswegen 
lohnt sich der ganze Aufwand ?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll man dazu sagen:

1. Versuch
Der Unterschied zwischen Mittelwert und Tiefpass ist nicht nur 
akademisch! Der Unterschied ist Mathematik und Systemtheorie.
Manchmal stürzen Raumschiffe wegen solcher Unterschiede ab.

2. Versuch
Meine Wetterstation kann das machen wie sie will. Das ist mir egal.

3. Versuch
Die Frage war nach dem Mittelwert. Die nächste Frage könnte nach einer 
Vereinfachung sein. Die nächste aber eben!

Gruß

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja da die rechenleistung sicherlich nicht an ihre grenzen stößt 
sondern eben nur der arbeitsspeicher möchte ich das eigentlich schon 
recht genau haben, ob der unterschied auffällt ist wieder eine andere 
geschichte, aber ich hätte es halt gern so...

Autor: rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Unterschied zwischen Tiefpass und Mittelwert isr sicher da. Zum 
einen ist der Tiefpass kontinuierlich, der Mittelwert nicht. Es kommt 
auf die Aussage an, was den sinnvoller ist. Ich wuerd mal beides 
probieren, Der Tiefpass sind ein paar Register, der Mittelwert braucht 
etwas mehr.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.