Re: Moving average filter ...
- From: David Brown <david@xxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Fri, 31 Oct 2008 09:00:58 +0100
Tim Wescott wrote:
On Thu, 30 Oct 2008 01:14:33 -0700, group wrote:
Hello -reg_8_hi;
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 -=//subtract high order from totalreg_8_lo = reg_16
reg_8_hi = reg_16 >> 8; //new high order (average)& 0xFF; //new loworderreg_8_hi;
}
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 -=//subtract high order from totalreg_3_lo = reg_16
reg_8_hi = reg_16 >> 3; //new high order (average)& 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.
So you'll never get an exact moving average..
If you choose a shift-varying difference equation you can get an average over some interval, but you can't get a _moving_ average.
What you have is a simple case of an infinite impulse response (IIR in the literature) filter, where a moving average filter is a simple case of a finite impulse response (FIR in the literature) filter.
- Follow-Ups:
- Re: Moving average filter ...
- From: group
- Re: Moving average filter ...
- References:
- Moving average filter ...
- From: group
- Re: Moving average filter ...
- From: Tim Wescott
- Moving average filter ...
- Prev by Date: Re: Moving average filter ...
- Next by Date: Re: Moving average filter ...
- Previous by thread: Re: Moving average filter ...
- Next by thread: Re: Moving average filter ...
- Index(es):
Relevant Pages
|
Loading