Gast
#862082
Hallo, ich möchte einen Mittelwert über 3 Werte bilden, jedoch habe ich einen Fehler. Der Wert ist zu gering. Kann mir jemand auf die Sprünge helfen?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
|
Anzeige
|
Mittelwert über 3 Werte bilden
Gast
#862082
Hallo, ich möchte einen Mittelwert über 3 Werte bilden, jedoch habe ich einen Fehler. Der Wert ist zu gering. Kann mir jemand auf die Sprünge helfen?
Gast
#862100
Das sieht sehr komisch aus. Versuchs mal so. Habs aber nicht getestet:
Gast
#862121
Dein iValue muss auch static sein. Und die Zuweisung muss so aussehen: iValue += (Value - lastVal ...... D.h. du nimmst deinen "alten" Mittelwert, ziehst den (ältesten Wert)/INTEGRAL ab und addierst den (neusten Wert)/INTEGRAL und erhältst somit den neuen Mittwelwert über 3 Werte. Sieht dann so aus:
Ich würds aus Übersichtlichkeitsgründen aber bisschen anders machen, und zwar so:
Gast
#862122
count noch initialisieren?
Gast
#862129
braucht man im prinzip net. Ob er jetzt das Array von 0 an vollstopft, oder den ersten Wert in die 2 steckt ist Wurst.
Gast
#862134
Oh braucht man doch, beim ersten Zugriff auf das Array steht ja kein % INTEGRAL also noch
Gast
#862139
und noch was..
Sorry für die vielen Posts, aber so früh am morgen, naja, ihr wisst
schon :P
#define INTEGRAL 3
float integralWert(float Value)
{
static float iValue = 0;
static float lastValue[INTEGRAL];
static u08 count;
iValue -= lastValue[count]/INTEGRAL;
count++;
count %= INTEGRAL;
lastValue[count] = Value;
iValue += Value/INTEGRAL;
return(iValue);
}
Gast
#862177
Vielen Dank für den Service. Ich habe vergessen zu Erwähnen dass es um die Differenzen der Werte geht und daraus das Mittel. Ist dein Wert INTEGRAL immer 3 (oder zumindest nicht wesentlich größer als 3). Wenn ja, dann würde ich gar nicht lang umtun und das straight Forward machen
Alleine durch das Fortfallen einer Division gewinnst du soviel Zeit, dass du dir eine Menge anderer Berechnungen erlauben kannst. Ausserdem hast du den Vorteil, dass sich Rundungsfehler auf die Art über längere Zeit gesehen nicht aufsummieren.
Gast
#862205
Naja, die Schleife kann man sich trotzdem sparen, Fällt natuerlich nur für grosse INTEGRAL ins Gewicht. Aber nochmal zu deinem Problem: Du Willst Mittelwert der Differenzen. Dann stimmt die Zuweisung [c] iValue = (Value - lastValue[(count + INTEGRAL - 2) %INTEGRAL])/INTEGRAL; [c\] Und dann müsste dein ursprünglicher Code eigentlich auch richtig sein, bis auf die fehlende Initialisierung von count. Ohne Initialisierung kann ja sein dass count irgendeinen Wert hat der ausserhalb der Array Grenzen liegt und somit dein erster value sonstwo im Speicher landet und natuerlich für die folgende Mittelung nicht zur Verfügung steht. Ausserdem liefert deine Funktion erst nach 3maligem Aufruf sinnvolle Werte, davor ist das Array ja noch nicht komplett mit deinen Werten gefüllt.
Gast
#862353
Hier ein Ansatz µC mit wenig Resourcen , also ohne float nur unsigned char und unsigned short: Allg. Ansatz : Wert1+Wert2+Wert3+Wert3 / 4 = MW über 3 Werte Hier braucht nur geschoben zu werden "<<1" und ">>2" Auch wenn Wert3 nun die doppelte Gewichtung besitzt, sollte dies womöglich für die Anwendung auch egal sein. Nach dem Teilen ">>2" darf natürlich das Runden der Nachkommastellen nicht vergessen werden. gast wrote: > Hier ein Ansatz µC mit wenig Resourcen , also ohne float nur unsigned > char und unsigned short: > > Allg. Ansatz : Wert1+Wert2+Wert3+Wert3 / 4 = MW über 3 Werte > > Hier braucht nur geschoben zu werden "<<1" und ">>2" > > Auch wenn Wert3 nun die doppelte Gewichtung besitzt, sollte dies > womöglich für die Anwendung auch egal sein. > > Nach dem Teilen ">>2" darf natürlich das Runden der Nachkommastellen > nicht vergessen werden. ggf kann man auch statt Wert3 den alten Mittelwert nehmen. Oder man nimmt 16 Werte, also 5 mal den ersten plus 5 mal den 2. plus 5 mal den dritten und ein alten Mittelwert o. Ä. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|