Main Content

phased.DopplerEstimator

Doppler estimation

Description

The phased.DopplerEstimator System object™ estimates Doppler frequencies of targets. Input to the estimator consists of detection locations output from a detector, and a range-Doppler response data cube. When detections cluster, the system object computes Doppler frequencies using the cluster information. Clustering associates multiple detections into one extended detection.

To estimate Doppler frequencies of targets:

  1. Create the phased.DopplerEstimator object and set its properties.

  2. Call the object with arguments, as if it were a function.

To learn more about how System objects work, see What Are System Objects?

Creation

Description

dopplerEstimator = phased.DopplerEstimator creates a Doppler estimator System object, dopplerEstimator .

dopplerEstimator = phased.DopplerEstimator(Name=Value) sets properties using one or more optional name-value arguments. For example, NumEstimates=4 sets the maximum number of estimates to 4.

example

Properties

expand all

Unless otherwise indicated, properties are nontunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.

If a property is tunable, you can change its value at any time.

For more information on changing property values, see System Design in MATLAB Using System Objects.

Source of the number of requested Doppler estimates, specified as one of these options.

  • "Auto" — The number of estimates equals the number of columns in the detidx input argument. If you provide the cluster IDs, the number of estimates equals the number of unique cluster IDs.

  • "Property" — The phased.DopplerEstimator system object obtains the number of reported estimates from the value of the NumEstimates property.

The maximum number of estimates to report, specified as a positive integer. When the number of requested estimates is greater than the number of columns in the detidx input argument, the system object fills the remainder with NaN.

Dependencies

To enable this property, set the NumEstimatesSource property value to "Property".

Data Types: single | double

Option to accept cluster IDs as an input argument when calling the system object with arguments (as if it were a function), specified as false ( logical 0) or true (logical 1). Setting this property to true ( logical 1) enables the clusterid input argument.

Data Types: logical

Option to enable the output of Doppler variance estimates, specified as false (logical 0) or true ( logical 1). When calling the system object with arguments (as if it were a function), the system object returns the Doppler variances estimates in the dopvar.

Data Types: logical

Number of pulses in the Doppler processed data cube, specified as a positive integer.

Dependencies

To enable this property, set the VarianceOutputPort property value to true (logical 1).

Data Types: single | double

Source of noise power values, specified as one of these options.

  • "Property" — The value of the NoisePower property represents the noise power at the detection locations.

  • "Input port" — You can specify noise power by using the noisepower input argument when calling the system object with arguments (as if it were a function).

The object uses the noise power to compute Doppler estimation variance and SNR.

Constant noise power value over the range-Doppler data cube, specified as a positive scalar. Noise power units are linear. The phased.DopplerEstimator system object applies the same noise power value to all detections.

Dependencies

To enable this property, set the VarianceOutputPort property value to true (logical 1) and set the NoisePowerSource value to "Property".

Data Types: single | double

Usage

Description

dopest = dopplerEstimator(estimator,resp,dopgrid,detidx) estimates Doppler frequencies of detections derived from the range-Doppler response data, resp. This syntax computes Doppler estimates for each detection position reported in detidx. The dopgrid argument sets the units for the Doppler dimension of the response data cube.

[dopest,dopvar] = dopplerEstimator(estimator,resp,dopgrid,detidx,noisepower) additionally specifies the noise power. This syntax applies when you set the VarianceOutputPort property value to true and the NoisePowerSource property to "Input port".

[dopest,dopvar] = dopplerEstimator(estimator,resp,dopgrid,detidx,clusterids) also specifies the clusterids for the detections. This syntax applies when you set the ClusterInputPort property value to true.

[dopest,___] = dopplerEstimator(estimator,resp,dopgrid,detidx,___) combines optional input and output arguments when their enabling properties are set. You must list the optional inputs and outputs in the same order as the order of the enabling properties.

Input Arguments

expand all

Doppler estimator, specified as a phased.DopplerEstimator System object.

Doppler-processed response data cube, specified as a complex-valued P-by-1 column vector, a complex-valued M-by-P matrix, or a complex-valued M-by-N-by-P array. M represents the number of fast-time or range samples. N is the number of spatial elements, such as sensor elements or beams. P is the number of Doppler bins.

The size of the first dimension of the input matrix can vary to simulate a changing signal length. A size change can occur, for example, in the case of a pulse waveform with variable pulse repetition frequency.

Data Types: single | double
Complex Number Support: Yes

Doppler grid values along the Doppler dimension of the resp argument, specified as a real-valued P-by-1 column vector. dopgrid defines the Doppler values corresponding to the Doppler dimension of the resp argument. Doppler values must be monotonically increasing and equally spaced. You can specify the grid values to be velocity or frequency. Units are in hertz or meters/sec.

Example: [-0.3,-0.2,-0.1,0,0.1,0.2,0.3]

Data Types: single | double

Detection indices, specified as a real-valued Nd-by-Q matrix. Q is the number of detections and Nd is the number of dimensions of the response data cube, resp. Each column of detidx contains the Nd indices of the detection in the response data cube.

To generate detection indices, you can use the phased.CFARDetector or phased.CFARDetector2D objects.

Data Types: single | double

Noise power at detection locations, specified as a positive scalar or real-valued 1-by-Q row vector of positive values. Q is the number of detections specified in detidx.

Dependencies

To enable this input argument, set the NoisePowerSource property value to Input port.

Data Types: single | double

Cluster IDs, specified as a real-valued 1-by-Q row vector where Q is the number of detections specified in detidx. Each element of clusterids corresponds to a column in detidx. Detections with the same cluster ID belong to the same cluster.

Dependencies

To enable this input argument, set the ClusterInputPort property value to true.

Data Types: single | double

Output Arguments

expand all

Doppler estimates, returned as a real-valued K-by-1 column vector.

  • When ClusterInputPort is false, the system object estimates Doppler for each detection location in the detidx argument. Then K equals the column dimension, Q, of detidx.

  • When ClusterInputPort is true, the system object estimates Doppler for each cluster ID in the clusterids argument. Then K equals the number of unique cluster IDs, Q.

Data Types: single | double

Doppler estimation variance, returned as a positive, real-valued K-by-1 column vector. K is the dimension of dopest. Each element of dopvar corresponds to an element of dopest. The object computes the estimator variance by using the Ziv-Zakai bound.

Data Types: single | double

Object Functions

To use an object function, specify the System object as the first input argument. For example, to release system resources of a System object named obj, use this syntax:

release(obj)

expand all

stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Examples

collapse all

To estimate the range and speed of three targets, create a range-Doppler map using the phased.RangeDopplerResponse System object™. Then use the phased.RangeEstimator and phased.DopplerEstimator System objects to estimate range and speed. The transmitter and receiver are collocated isotropic antenna elements forming a monostatic radar system.

The transmitted signal is a linear FM waveform with a pulse repetition interval (PRI) of 7.0 μs and a duty cycle of 2%. The operating frequency is 77 GHz and the sample rate is 150 MHz.

fs = 150e6;
c = physconst("LightSpeed");
fc = 77.0e9;
pri = 7e-6;
prf = 1/pri;

Set up the scenario parameters. The transmitter and receiver are stationary and located at the origin. The targets are 500, 530, and 750 meters from the radar along the x-axis. The targets move along the x-axis at speeds of –60, 20, and 40 m/s. All three targets have a nonfluctuating radar cross-section (RCS) of 10 dB. Create the target and radar platforms.

Numtgts = 3;
tgtpos = zeros(Numtgts);
tgtpos(1,:) = [500 530 750];
tgtvel = zeros(3,Numtgts);
tgtvel(1,:) = [-60 20 40];
tgtrcs = db2pow(10)*[1 1 1];
tgtmotion = phased.Platform(tgtpos,tgtvel);
target = phased.RadarTarget(PropagationSpeed=c,OperatingFrequency=fc, ...
    MeanRCS=tgtrcs);
radarpos = [0;0;0];
radarvel = [0;0;0];
radarmotion = phased.Platform(radarpos,radarvel);

Create the transmitter and receiver antennas.

txantenna = phased.IsotropicAntennaElement;
rxantenna = clone(txantenna);

Set up the transmitter-end signal processing. Create an upsweep linear FM signal with a bandwidth of one half the sample rate. Find the length of the PRI in samples and then estimate the rms bandwidth and range resolution.

bw = fs/2;
waveform = phased.LinearFMWaveform(SampleRate=fs, ...
    PRF=prf,OutputFormat="Pulses",NumPulses=1,SweepBandwidth=fs/2, ...
    DurationSpecification="Duty cycle",DutyCycle=0.02);
sig = waveform();
Nr = length(sig);
bwrms = bandwidth(waveform)/sqrt(12);
rngrms = c/bwrms;

Set up the transmitter and radiator System object properties. The peak output power is 10 W and the transmitter gain is 36 dB.

peakpower = 10;
txgain = 36.0;
transmitter = phased.Transmitter( ...
    PeakPower=peakpower, ...
    Gain=txgain, ...
    InUseOutputPort=true);
radiator = phased.Radiator( ...
    Sensor=txantenna,...
    PropagationSpeed=c,...
    OperatingFrequency=fc);

Set up the free-space channel in two-way propagation mode.

channel = phased.FreeSpace( ...
    SampleRate=fs, ...    
    PropagationSpeed=c, ...
    OperatingFrequency=fc, ...
    TwoWayPropagation=true);

Set up the receiver-end processing. Set the receiver gain and noise figure.

collector = phased.Collector( ...
    Sensor=rxantenna, ...
    PropagationSpeed=c, ...
    OperatingFrequency=fc);
rxgain = 42.0;
noisefig = 1;
receiver = phased.ReceiverPreamp( ...
    SampleRate=fs, ...
    Gain=rxgain, ...
    NoiseFigure=noisefig);

Loop over the pulses to create a data cube of 128 pulses. For each step of the loop, move the target and propagate the signal. Then put the received signal into the data cube. The data cube contains the received signal per pulse. Ordinarily, a data cube has three dimensions where the last dimension corresponds to antennas or beams. Because only one sensor is used, the cube has only two dimensions.

The processing steps are:

  1. Move the radar and targets.

  2. Transmit a waveform.

  3. Propagate the waveform signal to the target.

  4. Reflect the signal from the target.

  5. Propagate the waveform back to the radar. Two-way propagation enables you to combine the return propagation with the outbound propagation.

  6. Receive the signal at the radar.

  7. Load the signal into the data cube.

Np = 128;
dt = pri;
cube = zeros(Nr,Np);
for n = 1:Np
    [sensorpos,sensorvel] = radarmotion(dt);
    [tgtpos,tgtvel] = tgtmotion(dt);
    [tgtrng,tgtang] = rangeangle(tgtpos,sensorpos);
    sig = waveform();
    [txsig,txstatus] = transmitter(sig);
    txsig = radiator(txsig,tgtang);
    txsig = channel(txsig,sensorpos,tgtpos,sensorvel,tgtvel);    
    tgtsig = target(txsig);   
    rxcol = collector(tgtsig,tgtang);
    rxsig = receiver(rxcol);
    cube(:,n) = rxsig;
end

Display the data cube containing signals per pulse.

imagesc([0:(Np-1)]*pri*1e6,[0:(Nr-1)]/fs*1e6,abs(cube))
xlabel('Slow Time {\mu}s')
ylabel('Fast Time {\mu}s')
axis xy

Figure contains an axes object. The axes object with xlabel Slow Time mu s, ylabel Fast Time mu s contains an object of type image.

Create and display the range-Doppler image for 128 Doppler bins. The image shows range vertically and speed horizontally. Use the linear FM waveform for match filtering. The image is here is the range-Doppler map.

ndop = 128;
rangedopresp = phased.RangeDopplerResponse(SampleRate=fs, ...
    PropagationSpeed=c,DopplerFFTLengthSource="Property", ...
    DopplerFFTLength=ndop,DopplerOutput="Speed", ...
    OperatingFrequency=fc);
matchingcoeff = getMatchedFilter(waveform);
[rngdopresp,rnggrid,dopgrid] = rangedopresp(cube,matchingcoeff);
imagesc(dopgrid,rnggrid,10*log10(abs(rngdopresp)))
xlabel("Closing Speed (m/s)")
ylabel("Range (m)")
axis xy

Figure contains an axes object. The axes object with xlabel Closing Speed (m/s), ylabel Range (m) contains an object of type image.

Because the targets lie along the positive x-axis, positive velocity in the global coordinate system corresponds to negative closing speed. Negative velocity in the global coordinate system corresponds to positive closing speed.

Estimate the noise power after matched filtering. Create a constant noise background image for simulation purposes.

mfgain = matchingcoeff'*matchingcoeff;
dopgain = Np;
noisebw = fs;
noisepower = noisepow(noisebw,receiver.NoiseFigure,receiver.ReferenceTemperature);
noisepowerprc = mfgain*dopgain*noisepower;
noise = noisepowerprc*ones(size(rngdopresp));

Create the range and Doppler estimator objects.

rangeestimator = phased.RangeEstimator(NumEstimatesSource="Auto", ...
    VarianceOutputPort=true,NoisePowerSource="Input port", ...
    RMSResolution=rngrms);
dopestimator = phased.DopplerEstimator(VarianceOutputPort=true, ...
    NoisePowerSource="Input port",NumPulses=Np);

Locate the target indices in the range-Doppler image. Instead of using a CFAR detector, for simplicity, use the known locations and speeds of the targets to obtain the corresponding index in the range-Doppler image.

detidx = NaN(2,Numtgts);
tgtrng = rangeangle(tgtpos,radarpos);
tgtspd = radialspeed(tgtpos,tgtvel,radarpos,radarvel);
tgtdop = 2*speed2dop(tgtspd,c/fc);
for m = 1:numel(tgtrng)
    [~,iMin] = min(abs(rnggrid-tgtrng(m)));
    detidx(1,m) = iMin;
    [~,iMin] = min(abs(dopgrid-tgtspd(m)));
    detidx(2,m) = iMin;
end

Find the noise power at the detection locations.

ind = sub2ind(size(noise),detidx(1,:),detidx(2,:));

Estimate the range and range variance at the detection locations. The estimated ranges agree with the postulated ranges.

[rngest,rngvar] = rangeestimator(rngdopresp,rnggrid,detidx,noise(ind))
rngest = 3×1

  499.7911
  529.8380
  750.0983

rngvar = 3×1
10-4 ×

    0.0273
    0.0276
    0.2094

Estimate the speed and speed variance at the detection locations. The estimated speeds agree with the predicted speeds.

[spdest,spdvar] = dopestimator(rngdopresp,dopgrid,detidx,noise(ind))
spdest = 3×1

   60.5241
  -19.6167
  -39.5838

spdvar = 3×1
10-5 ×

    0.0806
    0.0816
    0.6188

Algorithms

expand all

References

[1] Richards, M. Fundamentals of Radar Signal Processing. 2nd ed. McGraw-Hill Professional Engineering, 2014.

[2] Richards, M., J. Scheer, and W. Holm, Principles of Modern Radar: Basic Principles. SciTech Publishing, 2010.

Extended Capabilities

expand all

Version History

Introduced in R2017a