[sdiy] ADC filtering (was Re: A/D converter with good accuracy for a reasonable price?)

dan snazelle subjectivity at hotmail.com
Sun May 8 01:28:22 CEST 2011


could anyone point me to a (maybe in C) code example of how this would work?
or just some more info?

would it be sort of like putting using a FOR statement to let it read 4 values, then average them?
(do you use the un-averaged AND averaged readings? or do you throw out the first four?

thanks






On May 6, 2011, at 5:53 PM, Tom Wiltshire wrote:

> 
> On 6 May 2011, at 00:43, Scott Gravenhorst wrote:
> 
>> jon schatz <jon at divisionbyzero.com> wrote:
>>> On 5/5/2011 3:02 PM, Scott Gravenhorst wrote:
>>> 
>>>> If you are averaging (for example) four ADC readings, you collect them,
>>>> add them together and divide by four (or right shift by 2 bits).
>>> 
>>> you can also do some exponential filtering:
>>> 
>>> newResult = ( prevResult * (n-1) + curAdcReading) / n;
>>> 
>>> which has the advantage of giving you a new result every cycle instead 
>>> of every n cycles (which the above averaging would do). it also means 
>>> that you'll never get a change greater than 1/n * resolution which can 
>>> be a good thing for reducing noise but a bad thing if you want to track 
>>> sharp changes.
>> 
>> Yeah, I was thinking that too after I hit send.  The filter is a single pole lowpass
>> IIR filter and is analogous to a simple RC lowpass filter.  The higher the value of n,
>> the lower the "bandwidth" of the filter, that is more suppression of noise at higher
>> frequencies.  So it really depends on what you need from the sample stream.  I think
>> that for reading the value off of pots, the exponential filter method can be nicely
>> advantageous, and as Jon points out, there is a loss of slew rate, but for pots, how
>> fast can you turn them anyway?  
>> 
>> -- ScottG
> 
> 
> +1 for averaging as a useful technique for microcontroller on-chip ADCs.
> 
> I like to store the past values (say the last 16) and a running total. Then you can get a higher resolution averaged value (e.g. with reduced noise and no abrupt changes) by simply taking off the oldest input value and adding on the new input value.
> 
> If you had a 12-bit input, you could add 16 of them together and get a 16-bit output. It won't be 16-bit accurate, but it'll never vary by more than 1/16th of the value. This is the "loss of slew rate" already mentioned, and it's often pretty handy. It's much better than upshifting the raw 12-bit ADC value to 16-bit since this also multiplies any jitter and errors, which is often the alternative. It's a very basic, dirty sort of digital filtering, but it works usefully well, and if you don't have one-cycle MACs for real filters it might be the best you get (one add, one subtract, maybe a shift if you don't need 16-bits).
> 
> HTH,
> Tom
> 
> 
> 
> _______________________________________________
> Synth-diy mailing list
> Synth-diy at dropmix.xs4all.nl
> http://dropmix.xs4all.nl/mailman/listinfo/synth-diy
> 




More information about the Synth-diy mailing list