I am working on a radar signal processing project using MATLAB. I am required to simulate range doppler maps for Linear Frequency-Modulation (LFM) targets (non-fluctuating) in noise at various SNRs (40dB to 0 dB) at the range doppler output. I am using the AWGN function to add noise to my received echoes.
My simulation works great for around 11 dB SNR upwards, and the signal processing gain completely matches up with theory. At a theoretical 10 dB output, I am getting a very high fluctuation of SNR, presumably because of random noise addition/subtraction to the target peak. However, when I do manage to get a 10 dB SNR output, I am struggling to distinguish the target from noise peaks.
I am measuring my SNR as (peak target power/mean of noise power), however I am wondering if I should be doing (mean target power/mean noise power)?
Not being able to distinguish the target from noise at 10 dB would have been okay but my supervisors have said that the target should be clearly distinguishable at 10 dB SNR and I am not sure what I am doing wrong. I have normalised my receive and transmit echoes before matched filtering and normalised after the doppler FFT also to ensure reduced noise gain. I have also normalised the tapering windows too (Hanning in both dimensions).
What am I doing wrong?
Here is my code below without the normalised taper windows.
clear all;
clc;
fc=10E9; % carrier frequency
c=3E8; % speed of light
lambda=c/fc; % wavelength
PRF=2000;
PRI=1/PRF; % time from pulse to pulse
fs=1000e6; % sampling frequency
ts=1/fs;
t=0:ts:(PRI/122)-3*ts; % only sampling to 4096 samples
B= 100e6; %bandwidth 5e7
Tp=300/B; % setting the time bandwith product to 300
r=(c.*t)./2 ;
k=B/Tp; % chirp rate
N= 227; % number of pulses
T = length(t);
Vmax=14;
v= linspace((-lambda*PRF/4),(lambda*PRF/4),N);
V0 =Vmax*(-1+2*rand(1,1)); % target velocity
Rmin= 1; % to avoid wrap around
Rmax= 33;
R0 =Rmin + (Rmax-Rmin).*abs(rand(1,1)); % target range
Rcell=round((2*R0/(c*ts))+1); % target range based on cell number
Vcell=round((N-1).*(V0+(Vmax+1))./(2*(Vmax+1))+1); % target velocity based on cell number
A0= 0; % target acceleration
st=rectpuls((t-(Tp/2))/Tp).*exp(1i*2*pi.*(fc.*(t-Tp/2) +0.5*k*(t-Tp/2).^2)); % transmit signal for single lfm pulse
st(1:3000)=st(1:3000).*hanning(3000,'symmetric')';%
z=0:N-1;
Rt= R0 - (V0.*(z)*PRI) -(A0.*(z)*PRI.^2)./2 ; % target range at each pulse
tau=(2.*Rt./c)';
sr=(rectpuls((t-(Tp/2)-tau)./Tp).*exp(1i*2*pi.*(fc*(t-Tp/2 -tau) + 0.5.*k.*(t-Tp/2 -tau).^2))); %return signal
srr=awgn(sr,-45.5,'measured');
h=1:N;
srrW=fft((srr(h,:)./norm(srr(h,:))),[],2); % FFT of normalised return echo
stW=conj(fft(st./norm(st))); %fft of normalised transmitted echo
for j=1:N
correlation(j,:)=stW.*srrW(j,:); %matched filtering
end
matchedfilter=(ifft((correlation),[],2));
for u=1:T
dopplerwindow(:,u)=(hanning(N,'symmetric').*matchedfilter(:,u));
rangedoppler(:,u)= (1/N)*fftshift(fft(dopplerwindow(:,u),[],1),1);
end
rangedoppler1=abs(rangedoppler(:,1:227)).^2; % cropped to 227x227 for CNN input
rangedoppler2=rangedoppler1./max(max(rangedoppler1)); % normalising
MeanNoisepower=10*log10(mean(mean((rangedoppler2(220:227))))); % sampled at edge of map away from targets
SNR=MeanNoisepower; % as target power will be 0 dB, just need noise power
figure;
imagesc(10*log10(rangedoppler2))
clim([-60 0]) % have to keep the limit to -60 dB
colormap("gray")
truesize
figure;
plot(10*log10(rangedoppler2))
ylim([ -60 0])
The heatmap below is a target at 10.4 dB SNR and is located at (x=171, y=196)