??? 10/21/07 10:27 Modified: 10/21/07 10:28 Read: times |
#145970 - You usually don\'t _want_ a stable last digit. Responding to: ???'s previous message |
Someone remarked that I need to implement a low pass (CR circuit) filter in software but how the hell do do that?
There are many ways to implement a digital low-pass filter, and trying to imitate a RC lowpass might not even be the best idea. The simplest way to "stabilize" the last digit would be to use a simple moving average filter, i.e. take the last X ADC outputs, add them together, divide by X, and that's your "stabilized" filter output. Of course, using a power of 2 as X has quite a few advantages, such as making the division by X a simple bit-shift instead of an actual division. All other filters will quite quickly start diving into the realm of digital signal processing. If you've never heard the term "z-transform", you might want to get yourself a book about the basics of DSP. Beware, though - if you're allergic to math, you may want to stay away from that topic as far as possible. I found this book to be very comprehensive, and the author really starts at the basics, but unavoidably starts getting deep into heavy-duty math after the first few chapters. Some of the chapters I found very hard to digest, but the ones about general digital signal processing are very detailed and understandable. http://www.amazon.com/Digital-S...920&sr=8-1 If the frequency response of a moving average filter doesn't fit your requirements, the next best try would be using a different type of FIR (finite impulse response) filters. They have the advantage of being fairly easy to design and hanldle numerically. If you want to imitate an actual analog filter (such as RC), you'll have to use an IIR digital filter (infinite impulse response). Unless you're aware of the can of worms that you're opening by using this type of filter (it's recursive, so it may be unstable, depending on the parameters, and it has some additional pitfalls as far as numerics go), you might want to stick with the very simplest of IIR filters, like Y(n) = X(n) + a * Y(n-1) or Y(n) = 0.5 * (X(n) + X(n-1)) + a * Y(n-1). (Y is the filter output, X is the filter input. a affects the time constant and the gain of the filter, and needs to satisfy -1 < a < 1 for the filter to be stable, and 0 <= a < 1 for the filter to be non-oscillating). Oh ... and you usually don't want a stable last digit in the raw adc output, because this will prevent you from using decimation to increase the resolution of the ADC. |