# How to denoise chirp signal in low SNR condition with NLMS or any other methods?

6 views (last 30 days)
yan liu on 18 Aug 2021
Commented: Yazan on 20 Aug 2021
I am trying to denoise a chirp (LFM) signal for further analysis, like Short Time Fourier Transform and FrFT. But when in low SNR condition, the STFT results seems to be terrible, and I'm trying to enhance it with dsp.LMSFilter function.
The desired output is the prediction of noise in current pulse, and the reference noise is the WGN with zero signal. It seems that the NLMS filter doesn't work.
Here are my script, it can run in Matlab directly. Can you help me?
T = 10*10^(-6); % Total time 10us
fs = 500*10^6; % 500MHz
t = 0:1/fs:(T-1/fs); % time points
n = length(t); % number of time points
A_lfm = 1; % lfm amplitude (lfm is same as chirp)
fc_lfm = 100*10^6; % start frenquency
B = 100*10^6; % lfm bandwidth 100MHz
SNR = -9; % low SNR
Kr_lfm = B/T; % modulation rate
y_lfm = A_lfm*cos(2*pi*fc_lfm*t + pi*Kr_lfm*t.^2); % original chirp signal
y_n1 = awgn(y_lfm, SNR);% actual input signal for further analysis
y_0 = zeros(1,length(y_lfm));
y_v = awgn(y_0, SNR); % refenence noise
noise = y_v';
x = y_n1'; % NLMS input
mu = 0.01;
L = 100;
nlms = dsp.LMSFilter(L,'StepSize',mu,'Method','Normalized LMS');
[y_nlms_noise,e,w] = nlms(x,noise); % y_nlms_noise is the output, prediction of noise in current pulse
y_n1_denoise =y_n1 - (y_nlms_noise)'; % denoise
figure;
p=plot(t(1:500),y_lfm(1:500), t(1:500),y_n1(1:500),...
t(1:500),y_n1_denoise(1:500));
legend('ideal denoise result','signal with noise','actual denose result');
% p(1).Color='g'; p(2).Color='b';p(3).Color='c';
xlabel('time');ylabel('amplitude'); yan liu on 20 Aug 2021
I'm sdutying radar systems, it is not very unusual to deal with this kind of low SNR condition :-D

Yazan on 19 Aug 2021
Edited: Yazan on 20 Aug 2021
As I mentioned in my comments to your question, it is recommended that you experiment with some state-of-the-art time-frequency representations other than the STFT. Matlab starting from R2018b provides a native function for the Wigner-Ville distribution and its pseudo version. I experimented with it. The result was not so bad.
clc, clear
T = 10*10^(-6);
fs = 500*10^6;
t = 0:1/fs:(T-1/fs);
fc = 100*10^6;
B = 100*10^6;
SNR = -9;
Kr = B/T;
% I do not have the communication toolbox to use awgn function
x = cos(2*pi*fc*t + pi*Kr*t.^2);
n = db2mag(mag2db(rms(x))-SNR)*randn(size(x));
y = x+n;
% smoothed Pseudo Wigner-Ville distribution
% I am using kaiser windows of different lengths for the time and frequency
% axes
[d, f, t] = wvd(y, fs, 'smoothedPseudo', kaiser(512-1, 20), kaiser(128-1, 20));
imagesc(t, f, d), xlabel('Time - sec'); ylabel('Frequency - Hz') ##### 2 CommentsShowHide 1 older comment
Yazan on 20 Aug 2021
If you are dealing with linear chirps, the Wigner distribution is the optimal time-frequency representation. Problems arise when dealing with multiple components (e.g., two chirps), as noisy cross-terms will be present due to nonlinear interactions between the signal's components. If the signal is a noisy one-component signal, you need to use the pseudo version to reduce the noise power, but at the expense of losing some resolution. The performance of any time-frequency representation is signal-dependent. Some are good for a class of signals, but not so much for signals out of this class. It is much easier to focus on representations that suit the signals that you're dealing with.

R2021a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!