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.
Je nach Ausführung (d.h. Berechnung) passt auch die Bezeichnung "digitaler Tiefpass"
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.