Main Content

Simulate Radar Ghosts due to Multipath Return

This example shows how to simulate ghost target detections and tracks due to multipath reflections, where signal energy is reflected off another target before returning to the radar. You’ll simulate ghosts with both a statistical radar model and a more detailed transceiver model that generates IQ signals.

Motivation

Many highway scenarios involve not only other cars, but also barriers and guardrails. Consider the simple highway created using the Driving Scenario Designer app. For more information on how to model barriers in a drivingScenario see the Sensor Fusion Using Synthetic Radar and Vision Data example. Use the function helperSimpleHighwayScenarioDSD exported from the Driving Scenario Designer to get our highway scenario and a handle to the ego vehicle.

% Set random seed for reproducible results
rndState = rng('default');

% Create scenario using helper
[scenario, egoVehicle] = helperSimpleHighwayScenarioDSD();

To model the detections generated by a forward-looking automotive radar, use the radarDataGenerator. Use a 77 GHz center frequency, which is typical of automotive radar. We'll generate detections up to 100 meters in range, and choose a PRF that allows us to unambiguously measure closing rates up to 67 m/s.

% Automotive radar system parameters
fc = 77e9;                      % Center frequency (Hz) 
rangeMax = 100;                 % Maximum range (m)
rangeRes = 2.5;                 % Range resolution (m)
vMax = 67;                      % Maximum closing rate of cars (m/s)

c = physconst('LightSpeed');    % Speed of light (m/s)
bw = rangeres2bw(rangeRes,c);   % Signal bandwidth (Hz)

lambda = freq2wavelen(fc,c);    % Wavelength (m)
prf = speed2dop(2*vMax,lambda); % Maximum Doppler shift (Hz)
Ramb = c/(2*prf);               % Maximum unambiguous range (m) 

% Create a forward-looking automotive radar
rdr = radarDataGenerator(1, 'No scanning', ...
    'MountingLocation', [3.4 0 0.2], ...
    'AzimuthResolution', 4, ...
    'RangeResolution', rangeRes, ...
    'CenterFrequency', fc, ...
    'Bandwidth', bw, ...
    'HasRangeRate', true, ...
    'RangeRateResolution', 10, ...
    'ReferenceRange', 100, ...
    'FieldOfView', [70 5], ...
    'RangeLimits', [0 rangeMax], ...
    'RangeRateLimits', [-100 100], ...
    'HasRangeAmbiguities', true, ...
    'MaxUnambiguousRange', Ramb, ...
    'HasRangeRateAmbiguities', true, ...
    'MaxUnambiguousRadialSpeed', vMax/2, ...
    'TargetReportFormat', 'Detections', ...
    'HasOcclusion', false, ...
    'Profiles',actorProfiles(scenario));

% Show all detections for illustrative purposes
rdr.DetectionProbability = 1;

% Create bird's eye plot and detection plotter function
[~,detPlotterFcn] = helperSetupBEP(egoVehicle,rdr);

% Generate raw detections
time = scenario.SimulationTime;
tposes = targetPoses(egoVehicle);
[dets,~,config] = rdr(tposes,time);

% Plot detections
detPlotterFcn(dets,config);
title('Free Space (no multipath)')

Figure contains an axes. The axes with title Free Space (no multipath) contains 4 objects of type line, patch. These objects represent Road, Radar FoV, Radar detections.

The preceding figure shows the locations of the detections along the target vehicle as well as along the side of the barrier. However, detections are not always so well-behaved. One phenomenon that can pose considerable challenges to radar engineers is multipath. Multipath is when the signal not only propagates directly to the intended target and back to the radar, but includes additional reflections off objects in the environment.

Multipath Reflections

When a radar signal propagates to a target of interest it can arrive through various paths. In addition to the direct path from the radar to the target and then back to the radar, there are other possible propagation paths. The number of paths is unbounded, but with each reflection, the signal energy will decrease. Commonly, a propagation model considering three-bounce paths is used to model this phenomenon.

To understand the three-bounce model, first consider the simpler one-bounce and two-bounce paths, as shown in the following figures.

One-Bounce Path

The one-bounce path propagates from the radar (1) to the target (2) and then is reflected from the target (2) back to the radar. This is often referred to as the direct or line-of-sight path.

Two-Bounce Paths

There exist two unique propagation paths that consist of two bounces.

The first two-bounce path propagates from the radar (1) to a reflecting surface (3), then to the target (2) before returning to the radar (1). Because the signal received at the radar arrives from the last bounce from the true target, it will generate ghost detections along the same direction as the true target. Because the path length for this propagation is longer, it will appear at a farther range than the true target detections.

The second two-bounce path propagates from the radar (1) to the target (2), then to the reflecting surface (3) before returning to the radar (1). In this case, the ghost detections will appear on the other side of the reflecting surface since that is the direction that the radar will receive the reflected signal.

Notice that the path length for both of the two-bounce paths is the same. As a result, the measured range and range rate for these paths will be the same as well.

Three-Bounce Path

The three-bounce path reflects off the barrier twice. This path never propagates directly to the target or directly back to the radar. The three-bounce ghost detections will appear on the other side of the reflecting surface since that is the direction that the radar will receive the reflected signal. Additionally, it has the longest propagation path length of the three-bounce paths and will therefore have the longest measured range of the three paths. This path corresponds to a mirror reflection of the true target on the other side of the barrier.

Model Ghost Target Detections

Set the HasGhosts property on the radarDataGenerator to model the detections generated from these three-bounce paths.

% Enable ghost target model
release(rdr);
rdr.HasGhosts = true;

% Generate raw detections
time = scenario.SimulationTime;
tposes = targetPoses(egoVehicle);
[dets,~,config] = rdr(tposes,time);

% Plot detections
detPlotterFcn(dets,config);
title('Simple Multipath Environment');

Figure contains an axes. The axes with title Simple Multipath Environment contains 7 objects of type line, patch. These objects represent Road, Radar FoV, Radar detections, 1^{st} 2-bounce ghosts, 2^{nd} 2-bounce ghosts, 3-bounce ghosts.

The previous figure reproduces the analysis of the three propagation paths. The first 2-bounce ghosts lie in the direction of the target with a slightly larger range. The second 2-bounce lie in the direction of the mirrored image of the target generated by the reflection from the barrier and at the same range as the first 2-bounce. And the 3-bounce detections follow the outline of the imaged ghost of the target vehicle.

Ghost Tracks

Because the range and velocities of the ghost target detections are like the range and velocity of the true targets, they will have kinematics that are consistent for a tracker that is configured to track the true target detections. This consistency between the kinematics of real and ghost targets results in tracks being generated for the ghost target on the other side of the barrier.

Set the TargetReportFormat property on the radarDataGenerator to 'Tracks' to model the tracks generated by a radar in the presence of multipath.

% Output tracks instead of detections
release(rdr);
rdr.TargetReportFormat = 'Tracks';
rdr.ConfirmationThreshold = [2 3];
rdr.DeletionThreshold = [5 5];
FilterInitializationFcn = 'initcvekf'; % constant-velocity EKF

% Create a new bird's eye plot to plot the tracks
[bep,trkPlotterFcn] = helperSetupBEP(egoVehicle,rdr);

% Run simulation
restart(scenario);
scenario.StopTime = 7.5;
while advance(scenario)
    time = scenario.SimulationTime;
    tposes = targetPoses(egoVehicle);

    % Generate tracks
    [trks,~,config] = rdr(tposes,time);

    % Filter out tracks corresponding to static objects (e.g. barrier)
    dyntrks = helperKeepDynamicObjects(trks, egoVehicle, rdr);

    % Visualize dynamic tracks
    helperPlotScenario(bep,egoVehicle);
    trkPlotterFcn(dyntrks,config);
end
title('Simple Multipath Environment');

Figure contains an axes. The axes with title Simple Multipath Environment contains 9 objects of type line, patch, text. These objects represent Road, Radar FoV, Radar tracks, Ghost tracks.

The preceding figure shows the confirmed track positions using square markers. The tracks corresponding to static objects (i.e barrier) are not plotted. Notice that there are multiple tracks associated with the lead car. The tracks that overlay the lead car correspond to the true detection and the first 2-bounce ghost. The tracks that lie off of the road on the other side of the guardrail correspond to the second 2-bounce and 3-bounce ghosts.

The track velocities are indicated by the length and direction of the vectors pointing away from the track position (these are small because they are relative to the ego vehicle). Ghost detections may fool a tracker because they have kinematics like the kinematics of the true targets. These ghost tracks can be problematic, as they add an additional processing load to the tracker and will possibly confuse control decisions using the target tracks.

Model IQ Signals

In the single- and multi-bounce simulations performed above, you used statistical radar models to generate detections and tracks. Now, use the radarTransceiver to generate time-domain IQ signals. While radarTransceiver has other construction options, the radarDataGenerator conveniently has an option to return a transceiver object that's been automatically configured so that its performance characteristics are as close as possible to that of the radarDataGenerator.

Because the transceiver will not be performing any detection or estimation, set the angle resolution of the radar equal to its FoV. Also set the detection probability to 0.9 so the transceiver uses a realistic transmit power and noise figure.

% Reset radarDataGenerator and get the transceiver
release(rdr);
rdr.AzimuthResolution = rdr.FieldOfView(1);
rdr.DetectionProbability = 0.9;
transceiver = radarTransceiver(rdr);

Use the NumRepetitions property to specify how many pulses to collect per call to the transceiver.

% Total number of pulses to collect
numPulses = 128;

% Number of pulses per collection
transceiver.NumRepetitions = numPulses;

The helper function helperIncludeSignatures will add signature information to the poses struct, which tells the transceiver the RCS of each target. helperGetPathsFromPoses will generate information on each propagation path in the environment, including those involving multiple bounces. The transceiver will use this to compute our multipath return.

restart(scenario); % restart the scenario

tgtPoses = targetPoses(egoVehicle); % Get target poses in ego vehicle's reference frame
tgtPoses = helperIncludeSignatures(tgtPoses,scenario);

% Get propagation path information
paths = helperGetPathsFromPoses( tgtPoses,scenario,rdr,lambda );

Now, collect a single coherent processing interval (CPI) of data, form the RDM, and plot. The transceiver simply takes the paths struct from above and the current simulation time as input, and returns IQ data formatted as range-by-pulse, commonly referred to as the phase history (PH).

time = scenario.SimulationTime; % Current simulation time
rx = transceiver(paths,time); % Get IQ data from transceiver for real and ghost targets

% Match filter the received signal
matchingcoeff = getMatchedFilter(transceiver.Waveform);
matchedfilter = phased.MatchedFilter('Coefficients',matchingcoeff);
matchingdelay = size(matchingcoeff,1)-1;
mfiltOut = matchedfilter(rx);
mfiltOut = buffer(mfiltOut(matchingdelay+1:end),size(mfiltOut,1));

Use a DC-centered range-Doppler map (RDM), and a range swath that extends up to our max range, with one sample per resolution cell.

df = prf / numPulses;                   % Doppler filter spacing
dopAx = (-prf/2:df:prf/2-df).';         % Doppler axis
rngAx = (rangeRes:rangeRes:rangeMax).'; % Range axis

% Select only the range gates up to our max range
PH = mfiltOut(1:numel(rngAx),:);

% Form  DC-centered RDM
RDM = fftshift(fft(PH,[],2),2);

% Plot RDM and close-up of target vehicle
helperPlotRDM( RDM,rngAx,dopAx,scenario.SimulationTime );

Figure contains 2 axes. Axes 1 with title RDM at T = 0.00 s contains an object of type image. Axes 2 with title Vehicle Return contains an object of type image.

The plot above shows the full RDM along with a close-up of the vehicle return. The strip of return at about 12 kHz Doppler is from the guardrails on the side of the road. The target vehicle is visible around 30 meters in range, and at a slightly negative Doppler since it is moving ahead faster than the ego vehicle. The other two strips of return come from multipath reflections between the guardrails and the target vehicle.

Below is a recording of about 60 frames of data at a higher resolution, and starting at about 3 seconds, along with the bird's-eye plot from earlier. This recording only shows single-bounce reflections from the guardrails. Multipath return from the target vehicle begins as it starts to change lanes and its distance to the guardrails decreases. We see the ghost target appear at a larger range and Doppler than the real target, then slowly they converge as the real vehicle stabilizes in the center of the road.

% Restore random state
rng(rndState);

Summary

In this example, you learned how ghost target detections arise from multiple reflections that can occur between the radar and a target. An automotive radar scenario was used to highlight a common case where ghost targets are generated by a guardrail in the field of view of the radar. As a result, there are 4 unique bounce paths which can produce these ghost detections. The kinematics of the ghost target detections are like the true target's detections, and as a result, these ghost targets can create ghost tracks which can add additional processing load to a tracker and may confuse control algorithms using these tracks. The radarTransceiver can be used to generate higher-fidelity IQ data that is appropriate as input to detection and tracking algorithms.

Supporting Functions

helperKeepDynamicObjects

function dyntrks = helperKeepDynamicObjects( trks,egoVehicle,rdr )
% Filter out tracks corresponding to static objects (e.g. guardrail)
%
% This is a helper function and may be removed or modified in a future
% release.

dyntrks = trks;
if ~isempty(trks)
    vel = cell2mat(arrayfun(@(t)t.State(2:2:end),trks(:)','UniformOutput',false));
    isStatic = (-vel(1,:) > egoVehicle.Velocity(1)-rdr.RangeRateResolution) & (-vel(1,:) < egoVehicle.Velocity(1)+rdr.RangeRateResolution);
    dyntrks = trks(~isStatic);
end
end

helperIncludeSignatures

function tgtPoses = helperIncludeSignatures( tgtPoses,scenario )
% Include signature information in the target poses struct for use by
% radarTransceiver
%
% This is a helper function and may be removed or modified in a future
% release.

prof = scenario.actorProfiles;
id0 = [prof.ActorID];
id = [tgtPoses.ActorID];

for ind = 1:numel(tgtPoses)    
    I = id0 == id(ind);
    tgtPoses(ind).Signatures = {rcsSignature("Azimuth",prof(I).RCSAzimuthAngles,"Elevation",...
        prof(I).RCSElevationAngles,"Pattern",prof(I).RCSPattern)};
end

end

helperPlotRDM

function helperPlotRDM( RDM,rngAx,dopAx,time )
% Plot the RDM and a close-up
%
% This is a helper function and may be removed or modified in a future
% release.

figure;
set(gcf,'Position',get(gcf,'Position')+[0 0 560 0]);

subplot(1,2,1);
imagesc(dopAx/1e3,rngAx,20*log10(abs(RDM)));
colorbar;
cx = caxis;
caxis([cx(2)-60 cx(2)]);
xlabel('Doppler (kHz)');
ylabel('Range (m)');
set(gca,'ydir','normal');
title(sprintf('RDM at T = %.2f s',time));

subplot(1,2,2);
rIdx = rngAx >= 22 & rngAx <= 38;
dIdx = dopAx >= -5e3 & dopAx <= 0;
imagesc(dopAx(dIdx)/1e3,rngAx(rIdx),20*log10(abs(RDM(rIdx,dIdx))));
colorbar;
cx = caxis;
caxis([cx(2)-60 cx(2)]);
xlabel('Doppler (kHz)');
ylabel('Range (m)');
set(gca,'ydir','normal');
title('Vehicle Return');

end

Related Topics