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]);
}
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.
was ist der mittelwertfaktor in diesem fall
was bedeutet die gleichung
Messwert[mux]=((mittelwertfaktor[mux]-1)*Messwert[mux]
+result)/mittelwertfaktor[mux];
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.
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
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
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??
> 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.
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
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
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.
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.
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??
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.