Range Doppler Map on pulsed radar can't get a doppler shift from a moving target

16 ビュー (過去 30 日間)
Thibaut
Thibaut 2024 年 3 月 25 日
回答済み: Greg 2024 年 9 月 23 日
Hello everyone !
I'm simulating a radar and I want to extract from it a 2-D Matrix with the range and the doppler. For that I'm using the Radar Toolbox and create a Radar Scenario. For the moment I just want a simple scenario with a point target moving at a certain distance from my radar. I'm using a radarTransceiver in order to get the IQ signal from the target and then I transfom into range doppler using the Phased.RangeDopplerResponse. First of all it is fair to say that I'm not a pro with radar I'm a beginner actually so please understand that I may lack of understanding in how to go from the IQ signal to the range doppler map.
Basically my problem is that even with the simplest problem I can see the target moving on the range axis but I have no doppler shift even if I try to make the target come towards me or in the opposite way. Please find attached my code so you may understand what is the problem (The values are random for the moment). As I said before the problem must probably be due to how I go from my phase history matrix to the range doppler matrix but I really have no clue where it is wrong. Thank you very much in advance for any help !
c = 3e8;
Fs = 10e6;
Fc = 10e9;
rpos = [0;0;0];
tpos = [2000;0;0];
rvel = [0;0;0];
tvel = [50;0;0];
dmax = 12e3;
prf = c/(2*dmax);
bw = 2e6;
NumElems = 64;
scenario = radarScenario('StopTime',10,'IsEarthCentered',false);
array = phased.ULA(NumElems,freq2wavelen(Fc)/2);
myWav = phased.LinearFMWaveform('SampleRate',Fs,'PRF',prf,...
'SweepBandwidth',bw,'PulseWidth',0.1/prf);
myRadarPlat = phased.Platform('InitialPosition',rpos,'Velocity',rvel);
myTargetPlat = phased.Platform('InitialPosition',tpos,'Velocity',tvel);
myChannel = phased.FreeSpace('SampleRate',Fs,'PropagationSpeed',c,...
'OperatingFrequency',Fc,'TwoWayPropagation',true);
tgtTraj = kinematicTrajectory('Position',tpos,'Velocity',tvel);
rdrTraj = kinematicTrajectory('Position',rpos,'Velocity',rvel);
target = platform(scenario, 'Trajectory',tgtTraj);
radar = platform(scenario, 'Trajectory',rdrTraj);
rdr = radarTransceiver;
rdr.Waveform = myWav;
rdr.TransmitAntenna.Sensor = array;
rdr.ReceiveAntenna.Sensor = array;
rdr.Receiver.SampleRate = Fs;
radar.Sensors = rdr;
myResponse = phased.RangeDopplerResponse(...
'RangeMethod','Matched Filter', ...
'PropagationSpeed',c, 'DopplerOutput','speed',...
'SampleRate', Fs,'OperatingFrequency',Fc,...
'DopplerFFTLengthSource','Property', ...
'DopplerFFTLength',1024);
tstep = 1/prf;
m = 0;
while advance(scenario)
m = m +1;
% [rpos,rvel] = step(myRadarPlat,tstep);
% [tpos,tvel] = step(myTargetPlat,tstep);
iqsig = receive(scenario);
PH = iqsig{1};
% [resp,rng,dop] = myResponse(PH,getMatchedFilter(myWav));
plotResponse(myResponse,PH,getMatchedFilter(myWav))
drawnow
f{m}=getframe(gcf);
% x = step(rdr.Waveform);
% y(:,m) = step(x,rpos,tpos,rvel,tvel);
end
obj = VideoWriter('workplease.avi');
open(obj);
for i = 1:m
writeVideo(obj,f{i});
end
obj.close();

回答 (1 件)

Greg
Greg 2024 年 9 月 23 日
This is an interesting question. Shared here is a summary of the specific changes in the code (below this summary).
Scenario Update Rate:
  • Non-working Code: The radarScenario object is instantiated with a StopTime of 10 seconds and no explicit UpdateRate is set.
  • Working Code: The radarScenario is instantiated with a StopTime of 0.01 seconds and an UpdateRate of 0, which inherits the update rate from the radar sensor. This setting ensures that the scenario updates at the correct rate, matching the PRF.
Operating Frequency:
  • Non-working Code: The operating frequency (Fc) is not explicitly set for the transmit and receive antennas in the radar transceiver.
  • Working Code: The operating frequency (Fc) is explicitly set for both the transmit and receive antennas using rdr.TransmitAntenna.OperatingFrequency = Fc; and rdr.ReceiveAntenna.OperatingFrequency = Fc;.
Beamforming and Matrix Dimensions:
  • Non-working Code: The code attempts to process each frame individually without accumulating a history of frames.
  • Working Code: The code maintains a buffer of the last N frames (N = 15) using the lastNFrames array. This buffer is used to perform "beamforming" by summing the channels and ensuring that the input to plotResponse is a 2D matrix with fast time as the first dimension and slow time as the second dimension.
  • Non-working Code: Directly plots the response using plotResponse without manipulating the data dimensions.
  • Working Code: Performs a simple beamforming operation by summing across channels and reshaping the data to ensure that the matrix passed to plotResponse is correctly dimensioned for range-Doppler processing.
Doppler Response Configuration:
  • Non-working Code: The Doppler FFT length and PRF are set, but the configuration may not properly handle the data dimensions.
  • Working Code: Ensures the Doppler response is configured correctly with explicit properties for PRFSource and PRF, which might help in synchronizing the processing with the waveform characteristics.
These changes primarily address synchronization issues, proper frequency configuration, and correct handling of the signal processing chain, which are critical for generating an accurate range-Doppler map in a pulsed radar system.
c = 3e8;
Fs = 10e6;
Fc = 10e9;
rpos = [0;0;0];
tpos = [2000;0;0];
rvel = [0;0;0];
tvel = [40;0;0];
dmax = 12e3;
prf = c/(2*dmax);
bw = 2e6;
NumElems = 64;
% Need to update the scenario update rate to match the PRF. Set the update
% rate to 0 to inherit the update rate from the radar sensor
scenario = radarScenario('StopTime',0.01,'IsEarthCentered',false,'UpdateRate',0);
array = phased.ULA(NumElems,freq2wavelen(Fc)/2);
myWav = phased.LinearFMWaveform('SampleRate',Fs,'PRF',prf,...
'SweepBandwidth',bw,'PulseWidth',0.1/prf);
tgtTraj = kinematicTrajectory('Position',tpos,'Velocity',tvel);
rdrTraj = kinematicTrajectory('Position',rpos,'Velocity',rvel);
target = platform(scenario, 'Trajectory',tgtTraj);
radar = platform(scenario, 'Trajectory',rdrTraj);
% Need to make sure the sensor is operating at our Fc --> let's set the FC
% in the transmit antenna and receive antenna
rdr = radarTransceiver;
rdr.Waveform = myWav;
rdr.TransmitAntenna.Sensor = array;
rdr.TransmitAntenna.OperatingFrequency = Fc;
rdr.ReceiveAntenna.Sensor = array;
rdr.Receiver.SampleRate = Fs;
rdr.ReceiveAntenna.OperatingFrequency = Fc;
radar.Sensors = rdr;
myResponse = phased.RangeDopplerResponse(...
'RangeMethod','Matched Filter', ...
'PropagationSpeed',c, 'DopplerOutput','Speed',...
'SampleRate', Fs,'OperatingFrequency',Fc,...
'DopplerFFTLengthSource','Property', ...
'DopplerFFTLength',1024, 'PRFSource','Property', 'PRF', prf);
tstep = 1/prf;
m = 0;
N = 15;
lastNFrames = zeros(800, 64, N);
while advance(scenario)
m = m+1;
iqsig = receive(scenario);
PH = iqsig{1};
for ii = N:-1:1
if ii == 1
lastNFrames(:, :, ii) = PH;
else
lastNFrames(:, :, ii) = lastNFrames(:, :, ii-1);
end
end
% We need to make sure the last dimension (2nd dimension) of the matrix
% we're passing into the plotResponse function is subsequent pulses; to
% this end, let's do some "beamforming" in the straight forward
% direction (just sum all the channels) and then let's get rid of the
% middle dimension using squeeze so it's a 2D matrix with the first
% dimension being fast time and second dimension being slow time
if m >= N
beamformedLastN = squeeze(sum(lastNFrames, 2));
plotResponse(myResponse,beamformedLastN,getMatchedFilter(myWav))
drawnow
end
end

カテゴリ

Help Center および File ExchangeTransmitters and Receivers についてさらに検索

製品


リリース

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by