Here is a bit of code to use the Exponential moving average (EMA) function for data smoothing. I find it much superior to that of a straight average because it favors newer samples, making it more responsive. Also it requires one to save only one value between calculations.
To use, call the EMAweight function with the number of samples that you want to smoothing over, it will calculate a weight factor for the EMA function.
call EMA with the oldvalue, newsample and the weight
here is a reference for EMA:
http://www.esignal.com/futuresource/...tudies/emi.htm
Quote:
//prototypes
float EMA (int, int, float );
float EMAweight (float);
// how to use
w = EMAweight (30.0); // set weight
xEMA = EMA( xEMA, newsample, w); // old, new, weight
//
// Ema routines
//
float EMAweight (float samples)
{
return (2.0 / ( 1.0 + samples));
}
float EMA (int prevEMA, int newVALUE, float weightx)
{
return ((weightx * (newVALUE - prevEMA)) + prevEMA);
}
|