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:

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;

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

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.

enter image description here 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?

  • 2
    $\begingroup$ 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. $\endgroup$ May 25 at 16:47
  • $\begingroup$ What's the signal you want to measure ? Do you know about the noise characteristics ? $\endgroup$
    – Ben
    May 25 at 16:48
  • $\begingroup$ 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 $\endgroup$
    – fsheikh
    Jun 4 at 15:07
  • $\begingroup$ 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. $\endgroup$ Nov 7 at 1:36

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()?



Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.