# A question on filters

I am fairly new to DSP have been reading up on digital filters and have a few questions. I have a signal with very high frequencies whose DC component i want to estimate. The magnitudes of these frequencies can be very high too. I can average out the signal, and this works, but the high frequencies mean high sample rate. I want to do this a lot faster. If i can filter the high frequencies, i should be able to average out the signal with a lower sample rate. To do this i need a low pass filter. If i can design a low pass filter that can attenuate all frequencies above the cutoff frequency (Fcutoff) by a factor of K or more decibels (K can be any number, -1000db, -100000db etc;) then i should be able to estimate the DC component (DC component estimate will be a function of K) much faster.

a) Is it possible, in theory, to design such a low pass filter, where i specify not just Fcutoff but also K. And if i were to implement such a filter, which filter would be the best one. FIR or IIR? Butterworth, chebychef, elliptic etc?

b)I was reading up on the butterworth filter on wikipedia and other online sources. Wiki states that the butterworth filter for high frequencies has an attenuation of 20n db/decade, where n is the filter order. Consider a filter of order 5. If i want all frequencies >= 1Hz to be attenuated by >= -100db, then i can move the cutoff to 0.1hz. And if >= 1Hz is to be attenuated by >= -1000db, i can move the cutoff to 0.01hz. Doing this would still allow the DC component to pass through and filter everything else out. Theoretically this should be possible, right?

c) when you have the magnitude response of a filter in decibles do you use the 10log rule or the 20log rule? I am assuming the 10log rule. Is this correct?

Too many things to comment here:

1- Decibels and thousands never go together. -1000dB means $10^{100}$ power attenuation (or $10^{50}$ amplitude attenuation), which is A LOT (an astronomical lot!): the noise level of any electronics, the DAC quantization noise, or the noise introduced by digital arithmetic will make your 1000 dB attenuation useless. Furthermore, designing a filter for such attenuation will normally result in a order so high it is impossible to implement.

Consider maximum gains or attenuations in the 100s of dB. As a reference, signal to noise ratio of CD encoding is around 96 dB. Or a satellite radio link can have a free-space attenuation of hundreds of dB.

2- The $20 N$ dB/decade attenuation of (low-pass) filters is an asymptotic slope. The actual frequency response depends on the type of filter (Butterworth or Bessel have the smoothest response). Which to choose depends on your application.

3- How does your system work?

analog signal -> ADC -> digital LPF -> downsampling -> average

or

analog signal -> analog LPF -> ADC -> average

Why don't you place a big RC filter and sample at a lower frequency? You'll still get your average.

In any case, you always need a low-pass filter before the sampler to avoid aliasing.

4- for your (c) question: if you consider amplitude response of the filter, then it is $20 \log$. If you consider magnitude squared (or power response) then $10 \log$.

• don't you mean "analog xxx -> ADC -> digital xxx" ? – robert bristow-johnson Jan 17 '14 at 21:43
• juancho: thanks for answering. i actually dont have any system that acquires a signal. i am working on a math problem which i converted to a signal and i need to estimate the DC to a high degree of accuracy very fast. just wanted to know if i can use any DSP filtering techniques to solve it. for now the butterworth and chebyshev-I filters seem promising. the high levels of accuracy i require would mean very high attenuation rates but i just wanted to know if i proceed with this approach if it is even feasible, both theoretically as well as practically. – user7502 Jan 17 '14 at 22:24
• Even for a paper problem, one needs to low pass filter before any sampling. – hotpaw2 Jan 18 '14 at 0:48
• If your signal is already sampled, just average the whole lot. In Matlab/Octave it would be avg = mean( x );. This is the fastest you can get and the highest degree of accuracy. – Juancho Jan 18 '14 at 1:06