Data Smoothing

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/workstation/help/charts/studies/emi.htm

//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);
}

Nice. We’ve stuck with arithmetic moving averages in the past since they are fast and can be implemented in pure integer math, but it’s nice to see someone using this and posting sample code.

You can use this with integer math with changes to the math lib… or use scaling on the weight ratio and final EMA

Second (and higher) order IIR low pass filters have responses similar to this one.