Amplitude at a given frequency in a wide band signal

Could anyone suggest the most computationally efficient method for finding amplitude at a given frequency having a noisy wide band signal.

To be more specific about a task. I have some physical dynamical system. I'm introducing sinusoidal input with exact frequency and amplitude. And looking for the amplitude at the same frequency on the output signal. While output signal is subject to noise and affected by other physical inputs at the same time.

This is required to detect some aspects of physical model. Experiments shows that this kind of test is sensitive to physical changes I want to detect.

Also I quite limited in resources. I only have small 32 bit MCU that is capable only of fixed-point arithmetic. Or very slow emulated floating point. That's why I'm asking about most effective solutions to the task.

• Welcome to SciComp.SE! This might be a job for the Signal Processing StackExchange. (Not saying your question isn't welcome here.) – Christian Clason May 19 '16 at 20:46
• Thanks a lot. Just implemented with bandpass IIR and checking amplitude. Now looking at Goertzel_algorithm to achieve more presize calculation. – aliko May 20 '16 at 14:02
• BTW: "...only a 32-bit MCU..." ROFL - "Luxury!!"* * Python, M. q.v. ;-) – rbarraud Aug 23 '16 at 7:12

Since you're using a microcontroller, how about implementing a bandpass filter in hardware (i.e. using analog electronics, not digital computation). This might be the fastest option if you're sampling an analog signal.

As for digital filters, bandpass filtering and the Goertzel algorithm (as you mentioned) are good ways to go, and there are ways to optimize them for fixed-point arithmetic.

• Hi! Thanks for suggestions! Unfortunately the hardware is fixed. I switched to sliding DFT finally. This seems like most computationally efficient. But maybe not the best when dealing with noisy signal because of bin size. Maybe will give a try to improved sliding Goertzel. – aliko May 24 '16 at 11:07

If you want the amplitude at a single frequency $f_0$ then you can multiply your signal by $e^{-j 2\pi f_0}$ and then use a simple moving average filter to remove other frequency components. This is probably the most efficient way, computationaly. Especially if you store $\sin$ and $\cos$ values in a look up table.

How noisy is 'noisy'? ... Is the signal above the noise or vice versa?

FFT -> Average bins over a number of measurements ; threshold ; try narrower f-xlated FFT in the same way, rinse and repeat until you have the f as accurate as you want (limited by the noise power in the final BW of course).

HTH :-)

• Sliding DFT with averaging already does its job. – aliko Aug 23 '16 at 10:06