Can simple FIR/IIR filtering recover/estimate a signal plagued with low SNR white noise?

I'm trying to design a filter to restore the original signal from strong noise (low SNR). I have tried low pass FIR and it could work well as the amplitude of original signal is much higher than the background noise. My matlab code of a demo are as follows:

clear
clc
close all

time = 1:10000;
fre1 = 50;
fs = 8000;
amplitude = 100;      % amplitude of the noise

sin_signal1 = sin(2*pi*fre1*time/fs)*50;
noise = rand(1,length(sin_signal1));
noise = amplitude * sqrt(10^(-3/10))*noise;  %noise

sin_signal = sin_signal1+ noise;
figure()
plot(sin_signal);

fir_low = fir1(128,55/8000);
sin_after_filter = filter(fir_low,1,sin_signal);
figure()
plot(sin_after_filter)


When the amplitude of noise is low (eg. amplitude = 0.5), namely a high SNR, the low pass FIR works very well. But when the amplitude of noise is high (eg. amplitude = 150), namely a low SNR, the low pass FIR works very bad. Using IIR low-pass filter also does not improve the situation as show in below picture.

Can some simple filtering operations recover the sinusoid or another band-limited signal when it is contaminated with a high energy random noise source, resulting in a low SNR signal?

• A FIR is a linear operation: It works exactly the same with more or less noise on the input. So, why do you say that it works worse under low-SNR conditions? It just seems to me that, just as expected, more noise means more noise. May 25, 2021 at 16:47
• What's the signal you want to measure ? Do you know about the noise characteristics ?
– Ben
May 25, 2021 at 16:48
• I tried to improve the question in the hope of providing an answer, but looks like this question is still closed. In any case, for the specific example above, some simple non-linear operations can help recover the signal even with low SNR. Here is a link to short python program demonstrating DC and low-energy components removal from noisy signal can help with uniformly distributed noise cancellation. gist.github.com/fsheikh/70b343e2a265f9b130f049a19095f118 Jun 4, 2021 at 15:07
• So you know, in advance, the frequency of the sinusoid you want to scrub? The corrupted signal seems to have both a DC offset and a low-frequency component. Looks like a good sharp bandpass filter or highpass filter, either FIR or IIR might do the trick. Nov 7, 2021 at 1:36

1 Answer

A linear filter just attenuate some frequencies more and others less. If you alter the SNR, the output of the FIR filter should change accordingly.

Many applications use more elaborate noise reduction methods in stead of (or in addition to) linear filtering. If you know that your signal is going to be a sine of known frequency, you may estimate its phase and amplitude embedded in noise using a matched filter. If you know that your noise is shot-noise, you could try to exploit that.

You noise seems to be uniform (non-zero mean) noise. Did you intend to call the normal distributed randn()?

-k