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?