www.mikrocontroller.net

Forum: Compiler & IDEs Gleitender Mittelwert


Autor: TIM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo leute:
kann mir jemand erklären was ein gleitnder mittelwert ist, wozu braucht 
man den gleitenden mittelwert.
kann mir jemand diesen programm erklären:

uint16_t adc_read(uint8_t mux)
{

  uint16_t result;
  static unsigned int  Messwert [3]={0,0,0};
  static unsigned char mittelwertfaktor [3]={16,4,4};

  ADMUX = mux | (1<<REFS0);                      // Kanal waehlen
  //ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen

  ADCSRA = (1<<ADEN) | (1<<ADPS0) | (1<<ADPS1) ;    // Frequenzvorteiler
                               // setzen auf 8 (1) und ADC aktivieren 
(1)

  // nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man 
liest
  //   also einen Wert und verwirft diesen, um den ADC "warmlaufen zu 
lassen
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
  while ( ADCSRA & (1<<ADSC) ) {
    ;     // auf Abschluss der Konvertierung warten
  }
 ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.


Messwert[mux]=((mittelwertfaktor[mux]-1)*Messwert[mux] 
+result)/mittelwertfaktor[mux];

  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)


  return (Messwert[mux]);
}

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen gleitenden Mittelwert kann man brauchen, wenn man einen Mittelwert 
braucht, aber nicht alle Einzelwerte aufheben möchte.

Mittelwert = (Bisheriger Mittelwert + Neuer Einzelwert) * Abschwächung
Und von vorn.

So in der Art zum Beispiel.

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Je nach Ausführung (d.h. Berechnung) passt auch die Bezeichnung 
"digitaler Tiefpass"

Autor: TIM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was ist der mittelwertfaktor in diesem fall

was bedeutet die gleichung

Messwert[mux]=((mittelwertfaktor[mux]-1)*Messwert[mux]
+result)/mittelwertfaktor[mux];

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TIM wrote:
> was ist der mittelwertfaktor in diesem fall
>
> was bedeutet die gleichung
>
> Messwert[mux]=((mittelwertfaktor[mux]-1)*Messwert[mux]
> +result)/mittelwertfaktor[mux];

Der 'Faktor' ist die Anzahl der 'simulierten' Messungen die für die 
nächste Mittelwertberechnung herangezogen werden sollen. Man tut einfach 
so, als ob die letzten n - 1 Messungen alle denselben Wert, nämlich den 
aktuell bekannten Mittelwert, gehabt hätten.

Spiels einfach mal mit ein paar Zahlen durch und du hast schnell 
heraussen, was da eigentlich passiert.

Willst du den Mittelwert aus den letzten 3 Messungen, wird addiert:
   2 * der zuletzt bekannte Mittelwert
   der aktuell ADC Wert

und dann das ganze durch 3, weil ja 3 'Messungen' addiert wurden.

Autor: Michael Lenz (hochbett)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo tim,

> kann mir jemand erklären was ein gleitnder mittelwert ist, wozu braucht
> man den gleitenden mittelwert.
Gegeben ist ein Signal s = [s1, s2, s3, ..., sn].
Ein gleitender Mittelwert mit z. B. drei Mittelungen ist die Folge:

1/3 * [s1+s2+s3, s2+s3+s4, s3+s4+s5, ..., s(n-2)+s(n-1)+s(n)]

Der Mittelwert ist ein digitaler Tiefpaßfilter (Glättungsfilter).

Es gibt verschiedene Variationen, die Du vornehmen kannst, ohne die 
grundlegende Funktion des Filters zu verändern.
- Änderung der Mittelungszeit (z. B. Mittelung über vier oder fünf 
Werte)
- Änderung der Behandlung der Randwerte (z. B. periodisch fortgesetzt 
bzw.
  Spiegelung an den Rändern und dann periodisch fortgesetzt)
- Änderung der Gewichtung der einzelnen Summanden, z. B. so:

  [ 0.25*s1 + 0.25*s2 + 0.5*s3; 0.25*s2 + 0.25*s3 + 0.5*s4; ...]


Gruß,
  Michael

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm, das der OP vorstellt, berechnet nicht den gleitenden 
Mittelwert, nach dem gefragt ist und den Michael erklärt, sondern den 
exponentiellen Mittelwert. Dazu hier einiges: 
Beitrag "Mittelwert sinnvoll bilden"

In den Ausdrücken der digitalen Signalverarbeitung ist der gleitende 
Mittelwert ein FIR-Tiefpaß (3.Ordnung in obigem Beispiel), der 
angewandte exponentielle Mittelwert ein IIR-Tiefpaß 1.Ordnung. Letzterer 
muß sich nur einen 'Wert' merken, ersterer deren drei.

Expoentielle Mittelung ist quick-and-dirty Filterung, es ist nur ein 
Wert abzuspeichern, das Filter läßt sich in integer rechnen, es sind 
große Zeitkonstanten erreichbar, keine Multiplikation nötig:

Grundformel für Integerrechnung:

Mittelwert= Mittelwert-(Mittelwert >> c) + Meßwert.

Das Filter wird stationär für Meßwert = (Mittelwert >> c), also wird der 
Meßwert um die Anzahl von c Bits 'verstärkt', dazu muß bei der 
Integerrechnung genug Platz vorhanden sein.

Cheers
Detlef

Autor: tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.frege:  also bei diesem Programm wird der erste AD-wert nicht 
verworfen um den ADC (warmlaufen zu lassen )??? oder wie ist das zu 
verstehen??

2.Frage:  Detlef _a  hat mich durcheinander gemacht, ich möchte wissen 
ob es hier um einen gleitenden Mittelwert geht???

Messwert[mux]=((mittelwertfaktor[mux]-1)*Messwert[mux]
+result)/mittelwertfaktor[mux];

ich bitte um eine Erklärung??

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> um den ADC warmlaufen zu lassen...
Das ist ein kleiner Auszug aus dem Kapitel: Wie sich Halbwahrheiten und 
Volksweisheiten zu Pseudowissen zusammentun  :-/

Je nach Betriebszustand (Initialisierung, Sleep, Power-Down...) und ADC 
kann es sein, dass das erste Messergenbis nicht zuverlässig ist, weil 
noch nicht alle Komponenten (Referenz, Mux...) voll betriebsbereit sind.
Es muß aber nicht vor jeder Wandlung so eine Pseudo-Wandlung 
durchgeführt werden, sondern nur ein einziges Mal nach dem Anlegen der 
Versorgung.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tim wrote:

> 2.Frage:  Detlef _a  hat mich durcheinander gemacht, ich möchte wissen
> ob es hier um einen gleitenden Mittelwert geht???

Lesen der Antwort hätte die Verwirrung möglicherweise verhindert: Nein, 
es wird nicht der gleitende Mittelwert berechnet sondern der 
exponentielle Mittelwert.

> Messwert[mux]=((mittelwertfaktor[mux]-1)*Messwert[mux]
> +result)/mittelwertfaktor[mux];

Kürzer greschrieben:
MWneu=((MWF-1)*MW+res)/MWF
=MW-MW/MWF+res/MWF

Das ist ziemlich genau die Formel, die ich oben für den exponentiellen 
Mittelwert hingeschrieben habe.

Schönen Ostermontag noch
Detlef

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Lothar Miller wrote:
>> um den ADC warmlaufen zu lassen...
> Das ist ein kleiner Auszug aus dem Kapitel: Wie sich Halbwahrheiten und
> Volksweisheiten zu Pseudowissen zusammentun  :-/
>
> Je nach Betriebszustand (Initialisierung, Sleep, Power-Down...) und ADC
> kann es sein, dass das erste Messergenbis nicht zuverlässig ist, weil
> noch nicht alle Komponenten (Referenz, Mux...) voll betriebsbereit sind.
> Es muß aber nicht vor jeder Wandlung so eine Pseudo-Wandlung
> durchgeführt werden, sondern nur ein einziges Mal nach dem Anlegen der
> Versorgung.

Und nach dem Umschalten der Referenzspannung.

Gruß aus Berlin
Michael

Autor: tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok Detlef _a

kannst du mir erklären anhand meines Programms wie der exponentielle 
mittelwert berechnet wird. (wird dann nur eine messung durchgeführt und 
damit berechnet)  oder funktioniert das wie  Karl heinz Buchegger gesagt 
hat

Kral Worte:
>Der 'Faktor' ist die Anzahl der 'simulierten' Messungen die für die
>nächste Mittelwertberechnung herangezogen werden sollen. Man tut einfach
>so, als ob die letzten n - 1 Messungen alle denselben Wert, nämlich den
>aktuell bekannten Mittelwert, gehabt hätten.

>Spiels einfach mal mit ein paar Zahlen durch und du hast schnell
<heraussen, was da eigentlich passiert.

>Willst du den Mittelwert aus den letzten 3 Messungen, wird addiert:
  > 2 * der zuletzt bekannte Mittelwert
   >der aktuell ADC Wert

>und dann das ganze durch 3, weil ja 3 'Messungen' addiert wurden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tim wrote:
> ok Detlef _a
>
> kannst du mir erklären anhand meines Programms wie der exponentielle
> mittelwert berechnet wird. (wird dann nur eine messung durchgeführt und
> damit berechnet)

Ja.

>  oder funktioniert das wie  Karl heinz Buchegger gesagt
> hat

??
Ist doch genau das gleiche!

Ein gleitender Mittelwert ist ein Mittelwert der in einem Zeitfenster 
arbeitet. Die letzten n Messungen werden zur Mittelwertbildung 
herangezogen.

Nur muss man sich dazu natürlich die letzten n Messungen auch merken. 
Also sucht man nach Möglichkeiten, wie man dieses 'Ich muss mir die 
letzten n Messungen speichern' umgehen kann. Und natürlich gibt es dann 
auch noch unzählige Möglichkeiten, wie man diesen Mittelwert an sich 
berechnen kann, je nachdem welche Charakteristik man von diesem 
Mittlwert haben will. Ein exponentieller Mittelwert ist eine Form dieser 
speziellen Berechnung.

Ein paar Hausaufgaben hättest du in der letzten Woche schon selbst 
erledigen können.

Autor: tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also karl
der Mittelwertfaktor ist nicht die anzahl der "simulierten" messungen.
sonder (Mit dem MittelwertFaktor N kann eingestellt werden, wie stark 
das Filter auf Änderungen der Messwerte reagiert) ist das richtig??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tim wrote:
> also karl
> der Mittelwertfaktor ist nicht die anzahl der "simulierten" messungen.

Doch.
Schau dir doch die Formel einmal an.
Dank nach, was sie macht. Das ist wirklich nicht schwer.

   Neuer_Mittelwert = ( ( n - 1 ) * alter_Mittelwert + Messwert ) / n

Ich kann gar nicht verstehen, was es daran nicht zu verstehen gibt.
Um einen Mittelwert aus n Zahlen zu berechnen, hab ich im Idealfall alle 
n Werte zur Verfügung

     10 12 14 12 15 12 13 ...

Wenn ich jeweils 3 Messwerte zusammenfasse, um die Mittelwerte zu 
berechnen, dann hab ich

   ( 10 + 12 + 14 ) / 3 =  36 / 3    = 12
   ( 12 + 14 + 12 ) / 3 =  38 / 3    = 12.666
   ( 14 + 12 + 15 ) / 3 =  41 / 3    = 13.666
   ( 12 + 15 + 12 ) / 3 =  39 / 3    = 13
   ( 15 + 12 + 13 ) / 3 =  40 / 3    = 13.333

Der Mittelwert verändert sich also mit jeder neuen Messung: Zuerst ist 
er 12, dann wird er 12.666, dann 13.666 um auf 13 zu fallen und zu 
13.333 zu steigen.

Kommt eine neue Messung dazu ... 10 ...  dann werden wieder die letzen 2 
Messungen + die neue Messung herangezogen um den nächsten Mittelwert zu 
bilden:

  ( 12 + 13 + 10 ) / 3 = 35 / 3 = 11.666

Der Mittelwert fällt also von 13.33 runter auf 11.666

Und damit man das so rechnen kann, muss man immer die letzten 2 
Messungen vorrätig halten. Bei 3 Werten geht das, bei 2000 Werten mag 
das ein Problem sein. Man kanns aber auch anders machen. Da 12 der 
Mittelwert war, der bei der ersten Messung rausgekommen ist, kann ich 
den nächsten Mittelwert berechnen, indem ich anstelle

   ( 12 + 14 + 12 ) / 3

einfach den zuletzt bekannten Mittelwert anstelle der ersten beiden 
(gemerkten) Messwerte einsetze

  ( 12 + 12 + 12 ) / 3  =  36 / 3 = 12

und analog das ganze mit den anderen jeweils neue dazugekommenen 
Messwerten


     10 12 14 12 15 12 13

  4. Messung:  ( 12     + 12     + 12 ) / 3  = 36     / 3 = 12
  5. Messung:  ( 12     + 12     + 15 ) / 3  = 39     / 3 = 13
  6. Messung:  ( 13     + 13     + 12 ) / 3  = 38     / 3 = 12.666
  7. Messung:  ( 12.666 + 12.666 + 13 ) / 3  = 38.332 / 3 = 12.777
  8. Messung:  ( 12.777 + 12.777 + 10 ) / 3  = 35.554 / 3 = 11.851


Was fällt auf?

Zunächst mal hinkt der Mittelwert etwas hinterher. Er reagiert nicht 
mehr so schnell auf die Änderung des Messwertes, wie das Original. Daher 
auch 'gleitend' - weil er dem tatsächlichen Zahlenwert hinterhergleitet. 
Wenn der Messwert sich auf einen Zahlenwert stabilisert, 'gleitet' der 
Mittelwert an diesen Wert heran.

> sonder (Mit dem MittelwertFaktor N kann eingestellt werden, wie stark
> das Filter auf Änderungen der Messwerte reagiert) ist das richtig??

Warum nimmst du dir nicht wirklich einfach mal ein Excel her, erfindest 
200 Messwerte (die sich ev. nach einem Schema verändern, zb. Zahlenreihe 
von 1 bis 100 und danach 100 mal einen konstanten Wert von 100. 
Vielleicht auch mal einen Messfehler von 200 in diese konstante 
Zahlenreihe eingfügen) und lässt Excel das alles mal durchrechnen und in 
einem Diagramm anzeigen. Da kannst du dann mit den Parametern spielen ud 
dir ansehen, wie sich Änderungen auswirken (wie sich die Kurve, die die 
Veränderung des Mittelwertes anzeigt, mit steigendem/sinkendem n 
verändert). Ist das wirklich so schwer, mit ein wenig Krativität an 
Mathe heranzugehen um einen Überblick zu bekommen? Dauert noch nicht mal 
eine halbe Stunde.

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.