langen Mittelwert bilden

Gast #2777991
moin,

ich würde gerne einen sehr sehr langen Mittelwert von Messwerten über 
einer großen Zeitspanne ermitteln... Soviele Messwerte, dass diese nicht 
in ein einziges RAM-Array hineinpassen würden.

ich könnte also mehrere kurze Mittelwerte bilden und diese wiederum über 
einen längeren Zeitraum mitteln.

Gibt es aber noch weitere Möglichkeiten, speicherschonend längere 
Mittelwerte zu bilden, als man Werte ausfnehmen kann?

mfg
Gast #2778003
Ich mache das gerne so:

mittelwert = 0.99 * mittelwert + 0.01 * aktuellerWert

Die Faktoren 0.99 und 0.01 können geändert werden, die Summe muss aber 
immer 1.00 ergeben. Der "mittelwert" nähert sich hierbei asymptotisch 
dem aktuellen Wert an.
Je kleiner der Faktor vor dem aktuellen Wert ist, desto länger dauert 
es.
Gast #2778018
Hi,

du kannst dir den Mittelwert MW und die Anzahl N der Werte die zum
Mittelwert gefuehrt haben speichern.
Damit wird

MW = (MW * N + neuerWert) / (N+1);
N = N+1;

Und man sollte sich ueber Ueberlaeufe Gedanken machen.
z.B. MW*N kann zu gross werden, etc.

Gruss
Josef
#2778021
Es geht ja beim gleitenden Mittelwert darum, einen neuen Wert 
draufzuaddieren und dafür den ältesten Wegzuwerfen. Dazu müssen aber 
alle Werten unterwegs gespeichert sein. Wenn man nun nicht den ältesten 
wegwirft sondern eben den Duchschnitt (also den Mittelwert) funktioniert 
das ganze  bei sich langsam ändernden Werten. Dazu ist dann kein Array 
nötig. Die Abweichung vom Idealen gleitenden Mittelwert muss du noch 
beurteilen.

Also MW=MW-(MW/Spanne)+Neu
Gast #2778352
Es gibt drei einfache Möglichkeiten:

1. Absoluter Mittelwert:
Meßwerte in einem Accumulator aufaddieren und dessen Inhalt durch die 
Anzahl an Meßwerten teilen, dabei Überlauf des Accus berücksichtigen. Du 
brauchst einen definierten Startpunkt, an dem Du den Accu und den 
Meßwertzähler auf 0 setzt.

2. Gleitender Mittelwert:
Du behältst die letzten x Meßwerte in einem Ringpuffer und ersetzt 
jeweils den ältesten Wert durch den neusten. Der Mittelwert wird dann 
berechnet, in dem alle x Elemente des Ringpuffers aufaddierten und die 
Summe durch x geteilt wird.

3. PT1-Filter:
Accu = Meßwert * Gewichtung + Accu * (1.0-Gewichtung);
Mit Gewichtung zwischen 0.0 und 1.0

Wichtig:
Obwohl sie auf den ersten Blink ähnlich wirken, haben diese Algorithmen 
unterschiedliches verhalten.
Ein absoluter Mittelwert wird mit fortlaufender Zeit immer träger, weil 
der Einfluß einzelner Meßwerte immer geringer wird.
Ein gleitender Mittelwert und ein PT1 sind immer gleich "schnell", haben 
dafür aber nur ein begrenztes Gedächtnis.
#2778364
@  Bronco (Gast)

>Meßwerte in einem Accumulator aufaddieren und dessen Inhalt durch die
>Anzahl an Meßwerten teilen, dabei Überlauf des Accus berücksichtigen. Du
>brauchst einen definierten Startpunkt, an dem Du den Accu und den
>Meßwertzähler auf 0 setzt.

Jain. Das macht man aber nicht bis Unendlich, sondern nur über eine 
begrenzte Anzahl Messwerte.

>2. Gleitender Mittelwert:
>Du behältst die letzten x Meßwerte in einem Ringpuffer und ersetzt
>jeweils den ältesten Wert durch den neusten. Der Mittelwert wird dann
>berechnet, in dem alle x Elemente des Ringpuffers aufaddierten und die
>Summe durch x geteilt wird.

Praktisch geht das besser. Man hat ebenfall einen Akku, der am Anfang 
auf Null gesetzt wird. Kommt nun ein neuer messwert, wird

der älteste Messwert vom Akku subtrahiert
aus dem Ringpuffer gelöscht
der neue Messwert zum Akku addiert und
im Ringpuffer an stelle des ältesten Messwerts gespeichert

Damit spart man sich massiv Rechenarbeit.

>3. PT1-Filter:
>Accu = Meßwert * Gewichtung + Accu * (1.0-Gewichtung);
>Mit Gewichtung zwischen 0.0 und 1.0

Das ist die einfachste Version. Allgemein ist das ein FIR Filter, der 
ein Anzahl alter, gespeicherter Messwerte mit einem Gewischtungsfaktor 
multipliziert und anschließend alles summiert. Auch hier gibt es eine 
rechenzeitsparende Umformung.

>Obwohl sie auf den ersten Blink ähnlich wirken, haben diese Algorithmen
>unterschiedliches verhalten.
>Ein absoluter Mittelwert wird mit fortlaufender Zeit immer träger, weil
>der Einfluß einzelner Meßwerte immer geringer wird.

Damit strebt dessen Grenzfrequenz gegen Null, das will keiner.

>Ein gleitender Mittelwert und ein PT1 sind immer gleich "schnell", haben
>dafür aber nur ein begrenztes Gedächtnis.

Wie so ziemlich alle "normalen" Filter. Das ist OK. Wenn man aber sehr 
niedrige Grenzfrequenzen haben will, ohne massig zu speichern, setzt man 
mehrere gleitende Mittelwerte oder FIR hintereinander, wobei der 
nachfolgende nur jeden nten Messwert des Vorgängers nutzt. Damit 
rediziert man die effektive Abtastrate und damit den Speicheraufwand.

MFG
Falk
Gast #2778418
Falk Brunner schrieb:
> Wie so ziemlich alle "normalen" Filter. Das ist OK. Wenn man aber sehr
> niedrige Grenzfrequenzen haben will, ohne massig zu speichern, setzt man
> mehrere gleitende Mittelwerte oder FIR hintereinander, wobei der
> nachfolgende nur jeden nten Messwert des Vorgängers nutzt. Damit
> rediziert man die effektive Abtastrate und damit den Speicheraufwand.

http://www.dspguide.com/ch15/5.htm
ist an dieser Stelle auch sehr interessant!
Gast #6004114
Josef schrieb:
> Hi,
>
> du kannst dir den Mittelwert MW und die Anzahl N der Werte die zum
> Mittelwert gefuehrt haben speichern.
> Damit wird
>
> MW = (MW * N + neuerWert) / (N+1);
> N = N+1;
>
> Und man sollte sich ueber Ueberlaeufe Gedanken machen.
> z.B. MW*N kann zu gross werden, etc.
>
> Gruss
> Josef

Diese Gleichung ist praktisch, um einen Mittelwert zu bekommen, der 
bspw. alle Messwerte seit Programmstart mittelt, z.B. die im Schnitt 
verbrauchte Energie von einem Motor einer Maschine seit Maschinenstart. 
Vorteil ist, dass ich dann keine große Summe bilden muss, die evtl. zu 
einem Überlauf führen könnte, und ich kann den aktuellen Durchschnitt in 
Echtzeit anzeigen. Ich denke, die Gleichung müsste jedoch korrekt 
lauten:

MW = MW(N-1)/N + MW/N;
N = N + 1;

Überprüfen lässt sich das leicht anhand eines einfachen Beispiels aus 
z.B. 3 Zahlen (N = 3).
Gast #6004139
Frido schrieb:
> Diese Gleichung ist praktisch, um einen Mittelwert zu bekommen, der
> bspw. alle Messwerte seit Programmstart mittelt, z.B. die im Schnitt
> verbrauchte Energie von einem Motor einer Maschine seit Maschinenstart.
> Vorteil ist, dass ich dann keine große Summe bilden muss, die evtl. zu
> einem Überlauf führen könnte, und ich kann den aktuellen Durchschnitt in
> Echtzeit anzeigen. Ich denke, die Gleichung müsste jedoch korrekt
> lauten:
>
> MW = MW(N-1)/N + MW/N;
> N = N + 1;
>
> Überprüfen lässt sich das leicht anhand eines einfachen Beispiels aus
> z.B. 3 Zahlen (N = 3).

Hat aber den Nachteil das es ziemlich lange dauert bis der Endwert 
angezeigt wird. Habe ich für ein DVM so gemacht. 
Wert=Wert_Alt*3+wert_Neu/4 Wenn der bei Null startet dauert was bis der 
Endwert steht.
#6004151
Frido schrieb:
> Josef schrieb:
>> Hi,
>>
>> du kannst dir den Mittelwert MW und die Anzahl N der Werte die zum
>> Mittelwert gefuehrt haben speichern.
>> Damit wird
>>
>> MW = (MW * N + neuerWert) / (N+1);
>> N = N+1;
>>
>> Gruss
>> Josef
>
> Ich denke, die Gleichung müsste jedoch korrekt
> lauten:
>
MW = MW(N-1)/N + nW/N;
> N = N + 1;

Es sind beides identische Formeln. Unterschied ist die Definition von N:
Oben hat der neue Wert die Nummer "N+1", unten "N". Bei der unteren 
Formel habe ich man das zweite "MW" zu einem "nW" (_n_euer _W_ert) 
korrigiert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.