Re: Moving average filter ...
- From: Tim Wescott <tim@xxxxxxxxxxxxxxxxxxxx>
- Date: Fri, 31 Oct 2008 22:31:16 -0500
On Fri, 31 Oct 2008 09:00:58 +0100, David Brown wrote:
Tim Wescott wrote:Dangit, you're right. It should be an infinite sum, in(n-k) * (7/8)^k, k
On Thu, 30 Oct 2008 01:14:33 -0700, group wrote:I don't think that equation is right - as you say below, he has an IIR,
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))
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.
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
.
- Prev by Date: Re: New to C51: large loop counter
- Next by Date: Re: Moving average filter ...
- Previous by thread: Re: New to C51: large loop counter
- Next by thread: Re: Moving average filter ...
- Index(es):
Relevant Pages
|
Loading