Relative motion between a signal source and a receiver produces
shifts in the frequency of the received waveform. Measuring this *Doppler* shift
provides an estimate of the relative radial velocity of a moving target.

For a narrowband signal propagating at the speed of light, the one-way Doppler shift in hertz is:

$$\Delta f=\pm \frac{v}{\lambda}$$

where *v* is the relative radial speed of the
target with respect to the transmitter. For a target approaching the
receiver, the Doppler shift is positive. For a target receding from
the transmitter, the Doppler shift is negative.

You can use `speed2dop`

to
convert the relative radial speed to the Doppler shift in hertz. You
can use `dop2speed`

to determine
the radial speed of a target relative to a receiver based on the observed
Doppler shift.

Assume a target approaches a stationary receiver with a radial speed of 23.0 m/s. The target reflects a narrowband electromagnetic wave with a frequency of 1 GHz. Estimate the one-way Doppler shift.

```
freq = 1e9;
v = 23.0;
lambda = physconst('LightSpeed')/freq;
dopplershift = speed2dop(v,lambda)
```

dopplershift = 76.7197

The one-way Doppler shift is approximately 76.72 Hz. Because the target approaches the receiver, the Doppler shift is positive.

Assume you observe a Doppler shift of 400.0 Hz for a waveform with a frequency of 9 GHz. Determine the radial velocity of the target.

```
freq = 9e9;
df = 400.0;
lambda = physconst('LightSpeed')/freq;
speed = dop2speed(df,lambda)
```

speed = 13.3241

The target speed is approximately 13.32 m/s.

A common technique for estimating the radial velocity of a moving target is pulse-Doppler processing. In pulse-Doppler processing, you take the discrete Fourier transform (DFT) of the slow-time data from a range bin containing a target. If the pulse repetition frequency is sufficiently high with respect to the speed of the target, the target is located in the same range bin for a number of pulses. Accordingly, the slow-time data corresponding to that range bin contain information about the Doppler shift induced by the moving target, which you can use to estimate the target’s radial velocity.

The slow-time data are sampled at the pulse repetition frequency (PRF) and therefore the DFT of the slow-time data for a given range bin yields an estimate of the Doppler spectrum from [-PRF/2, PRF/2] Hz. Because the slow-time data are complex-valued, the DFT magnitudes are not necessarily an even function of the Doppler frequency. This removes the ambiguity between a Doppler shift corresponding to an approaching (positive Doppler shift), or receding (negative Doppler shift) target. The resolution in the Doppler domain is PRF/N where N is the number of slow-time samples. You can pad the spectral estimate of the slow-time data with zeros to interpolate the DFT frequency grid and improve peak detection, but this does not improve the Doppler resolution.

The typical workflow in pulse-Doppler processing involves:

Detecting a target in the range dimension (fast-time samples). This gives the range bin to analyze in the slow-time dimension.

Computing the DFT of the slow-time samples corresponding to the specified range bin. Identify significant peaks in the magnitude spectrum and convert the corresponding Doppler frequencies to speeds.

This example illustrate pulse-Doppler processing using Phased Array System Toolbox™. Assume that you have a stationary monostatic radar located at the global origin, *(0,0,0)*. The radar consists of a single isotropic antenna element. There is a target with a nonfluctuating radar cross section (RCS) of 1 square meter initially located at *(1000,1000,0)* m and moving at a constant velocity of *(-100,-100,0)* m/s. The antenna operates at a frequency of 1 GHz and illuminates the target with 10 rectangular pulses at a PRF of 10 kHz.

**Note:** This example runs only in R2016b or later. If you are using an earlier release, replace each call to the function with the equivalent `step`

syntax. For example, replace `myObject(x)`

with `step(myObject,x)`

.

Define the System objects needed for this example and set their properties. Seed the random number generator for the `phased.ReceiverPreamp`

System object™ to produce repeatable results.

waveform = phased.RectangularWaveform('SampleRate',5e6,... 'PulseWidth',6e-7,'OutputFormat','Pulses',... 'NumPulses',1,'PRF',1e4); target = phased.RadarTarget('Model','Nonfluctuating',... 'MeanRCS',1,'OperatingFrequency',1e9); targetpos = phased.Platform('InitialPosition',[1000; 1000; 0],... 'Velocity',[-100; -100; 0]); antenna = phased.IsotropicAntennaElement(... 'FrequencyRange',[5e8 5e9]); transmitter = phased.Transmitter('PeakPower',5e3,'Gain',20,... 'InUseOutputPort',true); transpos = phased.Platform('InitialPosition',[0;0;0],... 'Velocity',[0;0;0]); radiator = phased.Radiator('OperatingFrequency',1e9,'Sensor',antenna); collector = phased.Collector('OperatingFrequency',1e9,'Sensor',antenna); channel = phased.FreeSpace('SampleRate',waveform.SampleRate,... 'OperatingFrequency',1e9,'TwoWayPropagation',false); receiver = phased.ReceiverPreamp('Gain',0,'LossFactor',0,... 'SampleRate',5e6,'NoiseFigure',5,... 'EnableInputPort',true,'SeedSource','Property','Seed',1e3);

This loop transmits ten successive rectangular pulses toward the target, reflects the pulses off the target, collects the reflected pulses at the receiver, and updates the target position with the specified constant velocity.

NumPulses = 10; sig = waveform(); % get waveform transpos = transpos.InitialPosition; % get transmitter position rxsig = zeros(length(sig),NumPulses); % transmit and receive ten pulses for n = 1:NumPulses % update target position [tgtpos,tgtvel] = targetpos(1/waveform.PRF); [tgtrng,tgtang] = rangeangle(tgtpos,transpos); tpos(n) = tgtrng; [txsig,txstatus] = transmitter(sig); % transmit waveform txsig = radiator(txsig,tgtang); % radiate waveform toward target txsig = channel(txsig,transpos,tgtpos,[0;0;0],tgtvel); % propagate waveform to target txsig = target(txsig); % reflect the signal % propagate waveform from the target to the transmiter txsig = channel(txsig,tgtpos,transpos,tgtvel,[0;0;0]); txsig = collector(txsig,tgtang); % collect signal rxsig(:,n) = receiver(txsig,~txstatus); % receive the signal end

The matrix `rxsig`

contains the echo data in a 500-by-10 matrix where the row dimension contains the fast-time samples and the column dimension contains the slow-time samples. In other words, each row in the matrix contains the slow-time samples from a specific range bin.

Construct a linearly-spaced grid corresponding to the range bins from the fast-time samples. The range bins extend from 0 meters to the maximum unambiguous range.

prf = waveform.PRF; fs = waveform.SampleRate; fasttime = unigrid(0,1/fs,1/prf,'[)'); rangebins = (physconst('LightSpeed')*fasttime)/2;

Next, detect the range bins which contain targets. In this simple scenario, no matched filtering or time-varying gain compensation is utilized.

In this example, set the false-alarm probability to $$1{0}^{-9}$$. Use noncoherent integration of the ten rectangular pulses and determine the corresponding threshold for detection in white Gaussian noise. Because this scenario contains only one target, take the largest peak above the threshold. Display the estimated target range.

probfa = 1e-9; NoiseBandwidth = 5e6/2; npower = noisepow(NoiseBandwidth,... receiver.NoiseFigure,receiver.ReferenceTemperature); thresh = npwgnthresh(probfa,NumPulses,'noncoherent'); thresh = sqrt(npower*db2pow(thresh)); [pks,range_detect] = findpeaks(pulsint(rxsig,'noncoherent'),... 'MinPeakHeight',thresh,'SortStr','descend'); range_estimate = rangebins(range_detect(1));

Extract the slow-time samples corresponding to the range bin containing the detected target. Compute the power spectral density estimate of the slow-time samples using `periodogram`

function and find the peak frequency. Convert the peak Doppler frequency to speed using the `dop2speed`

function. A positive Doppler shift indicates that the target is approaching the transmitter. A negative Doppler shift indicates that the target is moving away from the transmitter.

ts = rxsig(range_detect(1),:).'; [Pxx,F] = periodogram(ts,[],256,prf,'centered'); plot(F,10*log10(Pxx)) grid xlabel('Frequency (kHz)') ylabel('Power (dB)') title('Periodogram Spectrum Estimate')

[Y,I] = max(Pxx); lambda = physconst('LightSpeed')/1e9; tgtspeed = dop2speed(F(I)/2,lambda); fprintf('Estimated range of the target is %4.2f meters.\n',... range_estimate)

Estimated range of the target is 1439.00 meters.

`fprintf('Estimated target speed is %3.1f m/sec.\n',tgtspeed)`

Estimated target speed is 140.5 m/sec.

if F(I)>0 fprintf('The target is approaching the radar.\n') else fprintf('The target is moving away from the radar.\n') end

The target is approaching the radar.

The true radial speed of the target is detected within the Doppler resolution and the range of the target is detected within the range resolution of the radar.