Contenuto principale

Passive Bistatic Radar Localization Using OFDM Communication Signals

Since R2025a

This example demonstrates a passive bistatic radar system that utilizes a cellular tower as a separate signal source for three-dimensional target localization.

Introduction

A passive bistatic radar system comprises a separate signal source with a known position, such as a cellular tower, and a passive radar. To accurately localize a target in three-dimensional space, the system requires:

  1. Bistatic Range Measurement: This measurement, Rtx+Rrx-Rbase, positions the target on an ellipsoid with the transmitter and radar serving as its foci. The range sum Rtx+Rrx represents twice the semi-major axis of this ellipsoid. Because the baseline range Rbase—the distance between the transmitter and radar—is known, the range sum can be derived from the bistatic range measurement.

  2. Angle of Arrival (AOA) Measurements: The azimuth and elevation angles of the target's signal observed at the passive radar.

  3. Anchor Positions: The known locations of both the transmitter and the passive radar.

The bistatic range measurement can be obtained through the Time Difference of Arrival (TDOA) between the direct signal and the target-reflected signal. Typically, two receivers are needed at the passive radar to estimate the TDOA. One receiver, known as the reference receiver, is dedicated to capturing the direct signal and often uses a directional antenna pointed directly at the transmitter. The other receiver, called the surveillance receiver, is tasked with collecting the target-reflected signal. The TDOA is determined by performing cross-correlation between the reflected signal received by the surveillance receiver and the direct signal received by the reference receiver.

The AOA measurements, comprising azimuth and elevation angles, indicate the target's direction in three-dimensional space. To estimate the direction of the target's signal, the passive radar employs a two-dimensional array.

The target's position can be estimated by intersecting the target's direction with the ellipsoid defined by the bistatic range measurement. This intersection yields the target's three-dimensional location estimate.

passiveRadarGeometry.png

Passive Bistatic Radar System Configuration

Initialize the physical constants required for the simulation.

clear
rng('default')

% RF parameters
fc = 26e9;                                      % Carrier frequency (Hz)
c = physconst('LightSpeed');                    % Speed of propagation (m/s)
bw = 150e6;                                     % Bandwidth (Hz)
fs = bw;                                        % Sample rate (Hz)
lambda = freq2wavelen(fc);                      % Wavelength (m)

Use a short dipole antenna at the transmitter source to transmit signal.

% Configure transmitter
Pt = 10;                                        % Peak power (W) 
Gtx = 40;                                       % Tx antenna gain (dB)
transmitter = phased.Transmitter('Gain',Gtx,'PeakPower',Pt);
element = phased.ShortDipoleAntennaElement(AxisDirection = 'Z');
radiator = phased.Radiator('Sensor',element,'OperatingFrequency',fc,'Polarization','Combined');

Utilize a two-dimensional array at the surveillance receiver to capture the target-reflected signal.

% Configure a uniform rectangular array for surveillance receiver
sizeArray = [6 6]; 
rxarray = phased.URA('Element',element,'Size',sizeArray,'ElementSpacing',[lambda/2,lambda/2]);
numEleRx = getNumElements(rxarray);

% Configure surveillance receiver
Grx = 40;                                       % Rx antenna gain (dB) 
NF = 2.9;                                       % Noise figure (dB) 
collector = phased.Collector('Sensor',rxarray,'OperatingFrequency',fc,'Polarization','Combined');
receiver = phased.Receiver('AddInputNoise',true,'Gain',Grx, ...
         'NoiseFigure',NF,'SampleRate',fs);

Utilize a directional antenna at the reference receiver to capture the direct signal. This antenna can be designed with the Antenna Toolbox or configured using a polarized antenna element from the Phased Array System Toolbox. In the example code below, a helical antenna is used for the reference receiver if the Antenna Toolbox is licensed. Otherwise, a crossed-dipole antenna is employed.

% Flag to indicate if Antenna Toolbox is licensed
useAntennaToolbox  = false;

if useAntennaToolbox 
    % Configure a helical antenna
    antenna_ref = design(helix, fc); %#ok<UNRCH>
    antenna_ref.Tilt = 90;
    antenna_ref.TiltAxis = [0, 1, 0];
else
    % Configure a crossed-dipole antenna
    antenna_ref = phased.CrossedDipoleAntennaElement;
end

% Configure a conformal array for the reference receiver
element_ref = phased.ConformalArray;
element_ref.Element = antenna_ref;

% Confgure reference receiver
collector_ref = phased.Collector('Sensor',element_ref,'OperatingFrequency',fc,'Polarization','Combined');
receiver_ref = clone(receiver);

Platform Configuration

Specify the positions and velocities in transmitter, passive radar, and target platforms.

% Transmitter platform
txpos = [300; 50; -10];                         % Transmitter position (m)
txvel = [0; 0; 0];                              % Transmitter velocity (m/s)
txplatform = phased.Platform('InitialPosition',txpos,'Velocity',txvel,...
    'OrientationAxesOutputPort',true,'OrientationAxes',azelaxes(0,0)); 

% Passive radar platform
rxpos = [-150; 70; 20];                         % Radar positions (m)
rxvel = zeros(3,1);                             % Radar velocities (m/s)
radarplatform = phased.Platform('InitialPosition',rxpos,'Velocity',rxvel,...
    'OrientationAxesOutputPort',true,'OrientationAxes',azelaxes(0,0));

% Target platform
tgtpos = [80; 40; 110];                         % Target position (m)
tgtvel = [100; 240; 10];                        % Target velocity (m/s)
tgtplatform = phased.Platform('InitialPosition',tgtpos,'Velocity',tgtvel,...
    'OrientationAxesOutputPort',true,'OrientationAxes',azelaxes(0,0)); 

Specify the clutter positions and velocities in clutter platform.

% Clutter platform
clutterpos = [42 -11; 33 -21; 2 -5];           % Clutter position (m)
cluttervel = [0.1 -0.2; -0.5 0.3; -0.1 0.15];  % Clutter velocity (m/s)
clutterplatform = phased.Platform('InitialPosition',clutterpos,'Velocity',cluttervel,...
    'OrientationAxesOutputPort',true,'OrientationAxes',azelaxes(0,0));

% Include clutter in surveillance channels
includeClutter = true;

Visualize the bistatic scenario.

helperCreateBistaticScenario(txpos,rxpos,tgtpos,clutterpos,includeClutter);

Figure contains an axes object. The axes object with xlabel X (m), ylabel Y (m) contains 5 objects of type line. One or more of the lines displays its values using only markers These objects represent Transmitter , Radar Receiver , Target 1, Scatterer 1, Scatterer 2.

Obtain target and clutter bistatic range, AOA, and bistatic Doppler ground truth.

[tgtTruth,clutterTruth] = helperBistaticGroundTruth(...
    lambda,txpos,txvel,rxpos,rxvel,tgtpos,tgtvel,clutterpos,cluttervel,includeClutter)
tgtTruth = struct with fields:
      BistaticRange: 48.1537
                AOA: [2×1 double]
    BistaticDoppler: 2.2013e+03

clutterTruth = struct with fields:
      BistaticRange: [3.7550 35.6075]
                AOA: [2×2 double]
    BistaticDoppler: [-11.2474 19.0566]

Channel Configuration

Configure a bistatic channel that comprises both a direct-path channel and a target/clutter-path channel. The direct-path channel refers to the one-way free space channel from the transmitter to the passive radar receiver. In contrast, the target/clutter-path channel involves the transmitter as part of its path.

% One-way free-space propagation channel from the transmitter to passive radar receiver
basechannel = phased.FreeSpace(PropagationSpeed=c,OperatingFrequency=fc, ...
    SampleRate=fs,TwoWayPropagation=false);

% One-way free-space propagation channel from the transmitter to the target
txchannel = clone(basechannel);

% One-way free-space propagation channel from the target to passive radar receiver
rxchannel = clone(basechannel);

% Create a target
smat = 2*eye(2);
target = phased.RadarTarget('PropagationSpeed',c, ...
    'OperatingFrequency',fc,'EnablePolarization',true,...
        'Mode','Bistatic','ScatteringMatrix',smat);

% Create clutters
if includeClutter
    smat_clutter = 5*eye(2);
    numClutter = size(clutterpos,2);
    clutter = cell(1,numClutter);
    for clutterIdx = 1:numClutter
        clutter{clutterIdx} = phased.RadarTarget('PropagationSpeed',c, ...
            'OperatingFrequency',fc,'EnablePolarization',true,...
            'Mode','Bistatic','ScatteringMatrix',smat_clutter);
    end
end

Overview of Signal Processing Chain

The signal processing flow for bistatic radar is outlined below:

  1. Direct-Path Interference and Clutter Cancellation: The surveillance receiver captures not only the target-reflected signal but also direct-path interference and clutter-reflected signals. These unwanted signals typically exhibit low Doppler shifts and can be removed in the Doppler domain using the reference signal.

  2. Bistatic Range Estimation: After canceling interference and clutter, the remaining signal primarily consists of the target-reflected signal. The bistatic range of the target can be estimated by calculating the TDOA between the direct signal and the signal reflected from the target. This estimation can be accomplished by cross-correlating the interference-mitigated signal with the reference signal.

  3. AOA Estimation: on the detected bistatic range bin, array signals are obtained from each element in the two-dimensional surveillance array. These signals are used to estimate the azimuth and elevation angles of the target.

  4. Bistatic Position Estimation: With the bistatic range, azimuth, and elevation angles of the target, a bistatic position estimation algorithm can be employed to determine the target's position.

passiveRadarSignalProcessing.png

Please note that this example differs from the "Cooperative Bistatic Radar I/Q Simulation and Processing (Radar Toolbox)" example. The cooperative example demonstrates a collaborative bistatic radar workflow using matched filtering, whereas this example employs a TDOA-based workflow. Additionally, this example focuses on bistatic radar using Orthogonal Frequency-Division Multiplexing (OFDM) communication waveforms, while the cooperative example centers on workflows using collaborative radar waveforms.

Waveform Generation

The cellular tower uses OFDM waveform for signal transmission. Obtain OFDM waveform parameters below.

% Configure OFDM waveform
N = 1024;                                        % Number of subbands (OFDM data carriers)
freqSpacing = bw/N;                              % Frequency spacing (Hz)
tdata = 1/freqSpacing;                           % OFDM data symbol duration (s)
maxDelay = 1.01e-6;                              % Maximum delay (s)
Ncp = ceil(fs*maxDelay);                         % Length of the CP in subcarriers
tcp = Ncp/fs;                                    % Adjusted duration of the CP (s)
tsym = tdata + tcp;                              % OFDM symbol duration (s)
numSample = N + Ncp;                             % Number of subcarriers in one OFDM symbol

The pulse parameters, specifically the pulse repetition interval and the number of pulses, significantly influence the maximum unambiguous Doppler and the resolution in the Doppler domain. These parameters also affect the effectiveness of Doppler-domain interference mitigation. By adjusting the pulse repetition interval and the number of pulses, you can observe their impact on bistatic localization results.

% Pulse paramters
pri = 1.5*tsym;                                  % Pulse repetition interval (s)
numPulse = 128;                                  % Number of pulses

Generate OFDM waveform with modulated data.

% BPSK symbol on each data carrier
bpskSymbol = randi([0,1],[N numPulse])*2-1;

% Flag to indicate if Communications Toolbox is licensed
useCommunicationsToolbox  = false;

if useCommunicationsToolbox
    % OFDM modulated signal with cyclic prefix
    sigmodcp = ofdmmod(bpskSymbol,N,Ncp); %#ok<UNRCH>

    % Reshape OFDM modulated signal
    sig = reshape(sigmodcp,N+Ncp,numPulse);
else
    % OFDM symbols with BPSK modulation
    sigmod = ifft(ifftshift(bpskSymbol,1),[],1);

    % OFDM symbols with cyclic prefix
    sig = sigmod([end-Ncp+(1:Ncp),1:end],:);
end

% Power-normalized OFDM signal
sig = sig/max(abs(sig),[],'all');

Radar Data Cubes for Direct-Path Channel

Both the reference receiver and the surveillance receiver capture the direct-path signal from the direct-path channel. Construct the radar data cube containing only the direct-path signal for both the reference and surveillance receivers.

% Radar data cube obtained at reference receiver
Xref = complex(zeros([numSample,1,numPulse])); 

% Radar data cube obtained at surveillance receiver
X = complex(zeros([numSample,numEleRx,numPulse]));

% Transmitted signal
txsig = transmitter(sig);

for idxPulse = 1:numPulse
    % Update separate transmitter, radar and target positions
    [tx_pos,tx_vel,tx_ax] = txplatform(pri);
    [radar_pos,radar_vel,radar_ax] = radarplatform(pri);

    % Calculate the transmit angle as seen by the transmitter
    [~,txang_base] = rangeangle(radar_pos,tx_pos,tx_ax);

    % Radiate signal towards the radar receiver
    radtxsig_base = radiator(txsig(:,idxPulse),txang_base,tx_ax);

    % Collect signal at different radar receivers
    % Propagate the signal from the transmitter to each radar
    rxchansig_base = basechannel(radtxsig_base,tx_pos,radar_pos, ...
        tx_vel,radar_vel);

    % Calculate the receive angle
    [~,rxang_base] = rangeangle(tx_pos,radar_pos,radar_ax);

    % Collect signal at the reference receive antenna
    rxsig_ref = collector_ref(rxchansig_base,rxang_base,radar_ax);

    % Receive signal at the reference receiver
    Xref(:,:,idxPulse) = receiver_ref(rxsig_ref);

    % Collect direct-path interference signal at the surveillance
    % receive array
    rxsig_int = collector(rxchansig_base,rxang_base,radar_ax);

    % Receive direct-path interference signal at the surveillance receiver
    X(:,:,idxPulse) = receiver(rxsig_int);
end
reset(txplatform)
reset(radarplatform)

Radar Data Cube for Target/Clutter-Path Channel

The surveillance receiver also captures target-reflected and clutter-reflected signals. Update the radar data cube at the surveillance receiver to incorporate these target-reflected and clutter-reflected signals.

for idxPulse = 1:numPulse
    % Update transmitter, radar and target positions
    [tx_pos,tx_vel,tx_ax] = txplatform(pri);
    [radar_pos,radar_vel,radar_ax] = radarplatform(pri);
    [tgt_pos,tgt_vel,tgt_ax] = tgtplatform(pri);

    % Update clutter positions
    if includeClutter
        [clutter_pos,clutter_vel,clutter_ax] = clutterplatform(pri);
        tgt_pos(:,2:1+numClutter) = clutter_pos;
        tgt_vel(:,2:1+numClutter) = clutter_vel;
        tgt_ax(:,:,2:1+numClutter) = clutter_ax;
    end

    % Calculate the transmit angle for tx-to-target path
    [~,txang] = rangeangle(tgt_pos,tx_pos,tx_ax);

    % Radiate signal towards the target
    radtxsig = radiator(txsig(:,idxPulse),txang,tx_ax);

    % Propagate the signal from the transmitter to the target
    txchansig = txchannel(radtxsig,tx_pos,tgt_pos, ...
        tx_vel,tgt_vel);

    % Reflect the signal off the target
    [~,fwang] = rangeangle(tx_pos,tgt_pos,tgt_ax(:,:,1));
    [~,bckang] = rangeangle(radar_pos,tgt_pos,tgt_ax(:,:,1));
    tgtsig = target(txchansig,fwang,bckang,tgt_ax(:,:,1));

    % Reflect the signal off the clutter
    if includeClutter
        for clutterIdx = 1:numClutter
            [~,fwang] = rangeangle(tx_pos,tgt_pos(:,1+clutterIdx),tgt_ax(:,:,1+clutterIdx));
            [~,bckang] = rangeangle(radar_pos,tgt_pos(:,1+clutterIdx),tgt_ax(:,:,1+clutterIdx));
            tgtsig(1+clutterIdx) = clutter{clutterIdx}(txchansig(1+clutterIdx),fwang,bckang,tgt_ax(:,:,1+clutterIdx));
        end
    end

    % Propagate the signal from the target to each radar
    rxchansig = rxchannel(tgtsig,tgt_pos,radar_pos, ...
        tgt_vel,radar_vel);

    % Calculate the receive angle
    [~,rxang] = rangeangle(tgt_pos,radar_pos,radar_ax);

    % Collect signal at the receive antenna
    rxsig = collector(rxchansig,rxang,radar_ax);

    % Receive signal at the receiver
    X(:,:,idxPulse) = X(:,:,idxPulse) + receiver(rxsig);
end

Clutter and Direct-path Interference Mitigation

Since direct-path interference and clutter-reflected signals exhibit low Doppler shifts, they can be mitigated in the Doppler domain. A widely recognized algorithm for addressing direct-path interference and clutter in bistatic radar is the Enhanced Cancellation Algorithm by Carrier (ECA-C). This algorithm operates by projecting the multi-pulse slow-time signal onto the orthogonal subspace of zero-Doppler.

% Convert time-domain signal in frequency domain
X_freq = fft(X,[],1);
X_freq_ref = fft(Xref,[],1);

% Interference mitigation in slow-time
Xmit_freq = zeros(numSample,numEleRx,numPulse);
for idxSubcarrier = 1:numSample
    % Reference signal over slow-time
    xref_slow = reshape(X_freq_ref(idxSubcarrier,1,:),[numPulse,1]);

    % Projection matrix
    projectMatrix = xref_slow/(xref_slow'*xref_slow)*xref_slow';

    for idxRx = 1:numEleRx
        % Signal in slow-time
        x_slow = reshape(X_freq(idxSubcarrier,idxRx,:),[numPulse,1]);

        % Cancel interference 
        Xmit_freq(idxSubcarrier,idxRx,:) = x_slow - projectMatrix*x_slow;
    end
end

% Convert signal back to time-domain
Xmit = ifft(Xmit_freq);

Compare the fast-time signal power before and after mitigation. As illustrated in the figure, the ECA-C algorithm effectively reduces clutter and interference signal power.

% Plot fast-time signal power
pulseIdxPlot = 1;
helperCompareFastTimePower(X,Xmit,pulseIdxPlot)

Figure contains an axes object. The axes object with title Fast-Time Signal Power, xlabel Samples, ylabel Power (dB) contains 2 objects of type line. These objects represent Before Mitigation, After Mitigation.

Bistatic Range Estimation

The bistatic range of the target is proportional to the TDOA between the target path and the direct path. The TDOA can be estimated using the phased.TDOAEstimator System object.

% TDOA estimator
numSig = 1;
tdoaestimator = phased.TDOAEstimator(NumEstimates=numSig,...
      SampleRate=fs,TDOAResponseOutputPort=true);

% Estimate bistatic range
for idxPulse = numPulse:-1:1
    % Bistatic data where last dimension has the reference channel and a
    % survelliance channel
    Xtdoa = zeros(numSample,numEleRx,2); 
    for rxEleIdx = 1:numEleRx
        % Obtain reference channel signal
        Xtdoa(:,rxEleIdx,1) = Xref(:,1,idxPulse);

        % Obtain survelliance channel signal
        Xtdoa(:,rxEleIdx,2) = Xmit(:,rxEleIdx,idxPulse);
    end

    % Estimate TDOA, get TDOA response and TDOA grid
    [tdoaest,tdoaresp,tdoagrid] = tdoaestimator(Xtdoa);
    tdoaResp(:,:,idxPulse) = tdoaresp;
end

% Convert TDOA to bistatic range
rngest = tdoaest*c;
rnggrid = tdoagrid*c;

% Estimated range indices
rngIndices = zeros(1,numSig);
for estIdx = 1:numSig
    [~,rngIdx] = min(abs(rngest(estIdx)-rnggrid));
    rngIndices(estIdx) = rngIdx;
end

% Plot bistatic range spectrum
helperPlotBistaticRangeSpectrum(tdoaResp,rnggrid,rngIndices,numSig,pulseIdxPlot)

Figure contains an axes object. The axes object with title Bistatic Range Spectrum, xlabel Bistatic Range (m), ylabel Power (dB) contains 2 objects of type line. One or more of the lines displays its values using only markers

% Bistatic range estimation RMSE
rangermse = rmse(rngest,tgtTruth.BistaticRange);
disp(['RMS bistatic range estimation error = ', num2str(rangermse), ' meters.'])
RMS bistatic range estimation error = 0.1869 meters.

Angle of Arrival Estimation

For the estimated bistatic range bin, determine the azimuth and elevation angles through 2D beam scanning. This can be accomplished using the phased.BeamscanEstimator2D System object.

% Estimate azimuth and elevation of the target
doaestimator = phased.BeamscanEstimator2D(SensorArray=rxarray,...
    OperatingFrequency=fc, ...
    DOAOutputPort=true,NumSignals=numSig,...
    AzimuthScanAngles=-90:1:90,ElevationScanAngles=-90:1:90);
rngIdx = rngIndices(1);
[~,aoaest] = doaestimator(tdoaResp(rngIdx,:,pulseIdxPlot));
figure
plotSpectrum(doaestimator)

Figure contains an axes object. The axes object with title 2-D Beamscan Spatial Spectrum, xlabel Azimuth Angle (degrees), ylabel Elevation Angle (degrees) contains an object of type surface.

% Angle estimation RMSE
angrmse = rmse(aoaest,tgtTruth.AOA);
disp(['RMS angle estimation error = ', num2str(angrmse), ' degrees.'])
RMS angle estimation error = 0.33839 degrees.

Bistatic Position Estimation

Using the bistatic range estimate along with the azimuth and elevation AOA estimates, the target's 3-D position can be determined with the bistaticposest function.

% Estimate bistatic position
rngmeasurement = 'BistaticRange';
tgtposest = bistaticposest(rngest,aoaest,[],[],txpos,rxpos,...
       RangeMeasurement=rngmeasurement);

% RMSE of target position estimate
rmsepos = rmse(tgtposest,tgtpos);
disp(['RMS positioning error = ', num2str(rmsepos), ' meters.'])
RMS positioning error = 1.6496 meters.
% View position estimate
helperPlotBistaticPositions(rngest,aoaest,tgtposest,txpos,rxpos,tgtpos,rngmeasurement)

Figure contains an axes object. The axes object with title Bistatic Position Estimation, xlabel x-axis (meters), ylabel y-axis (meters) contains 6 objects of type line. One or more of the lines displays its values using only markers These objects represent Transmitter Positions, Receiver Positions, Target Position, Target Position Estimate, Ellipse Curves, AOA Lines.

Conclusion

This example illustrates a passive bistatic radar 3-D localization workflow. It covers the simulation of a bistatic radar data cube, the cancellation of direct-path interference and clutter, the estimation of the target's bistatic range, azimuth, and elevation, and the localization of the target using bistatic position estimation.

References

[1] C. Schwark and D. Cristallini, "Advanced multipath clutter cancellation in OFDM-based passive radar systems," 2016 IEEE Radar Conference, Philadelphia, PA, USA, 2016, pp. 1-4.

[2] H. Kuschel, D. Cristallini and K. E. Olsen, "Tutorial: Passive radar tutorial," in IEEE Aerospace and Electronic Systems Magazine, vol. 34, no. 2, pp. 2-19, Feb. 2019.