Re: Moving average filter ...



On Fri, 31 Oct 2008 09:00:58 +0100, David Brown wrote:

Tim Wescott wrote:
On Thu, 30 Oct 2008 01:14:33 -0700, group wrote:

Hello -

I'm trying to implement a 'smart' moving average algorithm, which
consumes as little memory (RAM) as possible.

Imagine two 8bits registers reg_8_hi and reg_8_lo. These two registes
can be combined into a 16bit register, reg_16.

Algortihm is;

1 - Samples are added to reg_16.
2 - High order of reg_16, reg_8_hi is subtracted from reg_16. 3 -
Average value is high order of reg_16, reg_8_hi. 4 - Registers are
preloaded with reg_8_hi = 127, and reg_8_lo = 255. Which is 'best
guess' on average.

Code:
void MovingAvg(uchar sample)
{
reg_16 += sample; //add sample

reg_8_hi = reg_16 >> 8; //get high order reg_16 -=
reg_8_hi;
//subtract high order from total

reg_8_hi = reg_16 >> 8; //new high order (average)
reg_8_lo = reg_16
& 0xFF; //new loworder
}

A statement is that # of samples is size of reg_8_lo (8 bit = 255
samples),

Questions are now:

1 - is this a valid moving average algortithm ?

2 - does this algorithm have a name ?

3 - if I need lower number of samples can this algorithm be changed
to; reg_8_hi and reg_3_lo. Which would then give me 8 samples. Reason
for this question is that if I do;

Code:
void MovingAvg(uchar sample)
{
reg_16 += sample; //add sample

reg_8_hi = reg_16 >> 3; //get high order reg_16 -=
reg_8_hi;
//subtract high order from total

reg_8_hi = reg_16 >> 3; //new high order (average)
reg_3_lo = reg_16
& 0x07; //new loworder
}

I get an error on the average calculation, which I'm not really able
to compensate for.

Any comments ?


Best regards

As Vladimir mentioned you have rediscovered the 1-st order
exponentially decaying filter. This is going to respond with

out(n) = sum from k = n-7 to n (in(k) (7/8)^(k-n))


I don't think that equation is right - as you say below, he has an IIR,
not an FIR (I suppose rounding will make it technically an FIR).

I like to think of these things as an approximate digital RC filter -
they have a similar effect on the signals, and are just as easy to
implement.

Dangit, you're right. It should be an infinite sum, in(n-k) * (7/8)^k, k
from 0 to infinity.

--

Tim Wescott
Wescott Design Services
http://www.wescottdesign.com

Do you need to implement control loops in software?
"Applied Control Theory for Embedded Systems" gives you just what it says.
See details at http://www.wescottdesign.com/actfes/actfes.html
.



Relevant Pages

  • Moving average filter ...
    ... Algortihm is; ... void MovingAvg ... - is this a valid moving average algortithm? ... - does this algorithm have a name? ...
    (comp.arch.embedded)
  • Re: Moving average filter ...
    ... - is this a valid moving average algortithm? ... - does this algorithm have a name? ... not an FIR. ... I like to think of these things as an approximate digital RC filter - they have a similar effect on the signals, and are just as easy to implement. ...
    (comp.arch.embedded)
  • Re: Moving average filter ...
    ... Algortihm is; ... - is this a valid moving average algortithm? ... - does this algorithm have a name? ... decaying filter. ...
    (comp.arch.embedded)
  • Re: Moving average filter ...
    ... This is not the same thing as the moving average, although it is certainly useful algorithm. ... void MovingAvg ... - is this a valid moving average algortithm? ...
    (comp.arch.embedded)
  • Re: Efficient Moving Average and Moving Variance Calculations
    ... efficient algorithm for computing a moving average. ... algorithm for computing "moving variance": ... Overwrite oldest value in X1 history buffer with X1. ...
    (comp.dsp)

Loading