How to denoise chirp signal in low SNR condition with NLMS or any other methods?
7 views (last 30 days)
Show older comments
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');
4 Comments
Yazan
on 19 Aug 2021
This line of research has gotten really wide recently. I haven't worked before on such low SNR values, so I don't have real suggestions apart from experimenting with the time-frequency representations provided by B.Boashash in his tool box. If you're doing research, I believe that it is trivial to say that you need to focus on time-frequency representations for low SNR values particularly.
Accepted Answer
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 Comments
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.
More Answers (0)
See Also
Categories
Find more on Time-Frequency Analysis in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!