## Angle-Doppler Response

### Benefits of Visualizing Angle-Doppler Response

Visualizing a signal in the angle-Doppler domain can help you identify characteristics of the signal in direction and speed. You can distinguish among targets moving at various speeds in various directions. If a transmitter platform is stationary, returns from stationary targets map to zero in the Doppler domain while returns from moving targets exhibit a nonzero Doppler shift. If you visualize the array response in the angle-Doppler domain, a stationary target produces a response at a specified angle and zero Doppler.

You can use the `phased.AngleDopplerResponse` object to visualize the angle-Doppler response of input data. The `phased.AngleDopplerResponse` object uses a conventional narrowband (phase shift) beamformer and an FFT-based Doppler filter to compute the angle-Doppler response.

### Angle-Doppler Response of Stationary Array to Stationary Target

Display the angle-Doppler response of a stationary array to a stationary target. The array is a six-element uniform linear array (ULA) located at the global origin (0,0,0). The target is located at (5000,5000,0) meters and has a nonfluctuating radar cross section (RCS) of 1 square meter.

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)`.

Construct the objects needed to simulate the target response at the array.

```antenna = phased.IsotropicAntennaElement... ('FrequencyRange',[8e8 5e9],'BackBaffled',true); lambda = physconst('LightSpeed')/4e9; array = phased.ULA(6,'Element',antenna,'ElementSpacing',lambda/2); waveform = phased.RectangularWaveform('PulseWidth',2e-006,... 'PRF',5e3,'SampleRate',1e6,'NumPulses',1); radiator = phased.Radiator('Sensor',array,... 'PropagationSpeed',physconst('LightSpeed'),... 'OperatingFrequency',4e9); collector = phased.Collector('Sensor',array,... 'PropagationSpeed',physconst('LightSpeed'),... 'OperatingFrequency',4e9); txplatform = phased.Platform('InitialPosition',[0;0;0],... 'Velocity',[0;0;0]); target = phased.RadarTarget('MeanRCS',1,'Model','nonfluctuating'); targetplatform = phased.Platform('InitialPosition',[5e3; 5e3; 0],... 'Velocity',[0;0;0]); freespace = phased.FreeSpace('OperatingFrequency',4e9,... 'TwoWayPropagation',false,'SampleRate',1e6); receiver = phased.ReceiverPreamp('NoiseFigure',0,... 'EnableInputPort',true,'SampleRate',1e6,'Gain',40); transmitter = phased.Transmitter('PeakPower',1e4,... 'InUseOutputPort',true,'Gain',40);```

Propagate ten rectangular pulses to and from the target, and collect the responses at the array.

```PRF = 5e3; NumPulses = 10; wav = waveform(); tgtloc = targetplatform.InitialPosition; txloc = txplatform.InitialPosition; M = waveform.SampleRate*1/PRF; N = array.NumElements; rxsig = zeros(M,N,NumPulses); for n = 1:NumPulses % get angle to target [~,tgtang] = rangeangle(tgtloc,txloc); % transmit pulse [txsig,txstatus] = transmitter(wav); % radiate pulse txsig = radiator(txsig,tgtang); % propagate pulse to target txsig = freespace(txsig,txloc,tgtloc,[0;0;0],[0;0;0]); % reflect pulse off stationary target txsig = target(txsig); % propagate pulse to array txsig = freespace(txsig,tgtloc,txloc,[0;0;0],[0;0;0]); % collect pulse rxsig(:,:,n) = collector(txsig,tgtang); % receive pulse rxsig(:,:,n) = receiver(rxsig(:,:,n),~txstatus); end```

Find and plot the angle-Doppler response. Then, add the label `+Target` at the expected azimuth angle and Doppler frequency.

```tgtdoppler = 0; tgtLocation = global2localcoord(tgtloc,'rs',txloc); tgtazang = tgtLocation(1); tgtelang = tgtLocation(2); tgtrng = tgtLocation(3); tgtcell = val2ind(tgtrng,... physconst('LightSpeed')/(2*waveform.SampleRate)); snapshot = shiftdim(rxsig(tgtcell,:,:)); % Remove singleton dim response = phased.AngleDopplerResponse('SensorArray',array,... 'OperatingFrequency',4e9, ... 'PropagationSpeed',physconst('LightSpeed'),... 'PRF',PRF, 'ElevationAngle',tgtelang); plotResponse(response,snapshot); text(tgtazang,tgtdoppler,'+Target');```

As expected, the angle-Doppler response shows the greatest response at zero Doppler and 45° azimuth.

### Angle-Doppler Response to Stationary Target at Moving Array

This example illustrates the nonzero Doppler shift exhibited by a stationary target in the presence of array motion. In general, this nonzero shift complicates the detection of slow-moving targets because the motion-induced Doppler shift and spread of the clutter returns obscure the Doppler shifts of such targets.

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)`.

The scenario in this example is identical to that of Angle-Doppler Response of Stationary Array to Stationary Target except that the ULA is moving at a constant velocity. For convenience, the MATLAB® code to set up the objects is repeated. Notice that the `InitialPosition` and `Velocity` properties of the `txplatform` System object™ have changed. The `InitialPosition` property value is set to simulate an airborne ULA. The motivation for selecting the particular value of the `Velocity` property is explained in Applicability of DPCA Pulse Canceller.

```antenna = phased.IsotropicAntennaElement... ('FrequencyRange',[8e8 5e9],'BackBaffled',true); lambda = physconst('LightSpeed')/4e9; array = phased.ULA(6,'Element',antenna,'ElementSpacing',lambda/2); waveform = phased.RectangularWaveform('PulseWidth',2e-006,... 'PRF',5e3,'SampleRate',1e6,'NumPulses',1); radiator = phased.Radiator('Sensor',array,... 'PropagationSpeed',physconst('LightSpeed'),... 'OperatingFrequency',4e9); collector = phased.Collector('Sensor',array,... 'PropagationSpeed',physconst('LightSpeed'),... 'OperatingFrequency',4e9); vy = (array.ElementSpacing*waveform.PRF)/2; txplatform = phased.Platform('InitialPosition',[0;0;3e3],... 'Velocity',[0;vy;0]); target = phased.RadarTarget('MeanRCS',1,'Model','nonfluctuating'); tgtvel = [0;0;0]; targetplatform = phased.Platform('InitialPosition',[5e3; 5e3; 0],... 'Velocity',tgtvel); freespace = phased.FreeSpace('OperatingFrequency',4e9,... 'TwoWayPropagation',false,'SampleRate',1e6); receiver = phased.ReceiverPreamp('NoiseFigure',0,... 'EnableInputPort',true,'SampleRate',1e6,'Gain',40); transmitter = phased.Transmitter('PeakPower',1e4,... 'InUseOutputPort',true,'Gain',40);```

Transmit ten rectangular pulses toward the target as the ULA is moving. Then, collect the received echoes.

```PRF = 5e3; NumPulses = 10; wav = waveform(); tgtloc = targetplatform.InitialPosition; M = waveform.SampleRate*1/PRF; N = array.NumElements; rxsig = zeros(M,N,NumPulses); fasttime = unigrid(0,1/waveform.SampleRate,1/PRF,'[)'); rangebins = (physconst('LightSpeed')*fasttime)/2; for n = 1:NumPulses % move transmitter [txloc,txvel] = txplatform(1/PRF); % get angle to target [~,tgtang] = rangeangle(tgtloc,txloc); % transmit pulse [txsig,txstatus] = transmitter(wav); % radiate pulse txsig = radiator(txsig,tgtang); % propagate pulse to target txsig = freespace(txsig,txloc,tgtloc,txvel,tgtvel); % reflect pulse off stationary target txsig = target(txsig); % propagate pulse to array txsig = freespace(txsig,tgtloc,txloc,tgtvel,txvel); % collect pulse rxsig(:,:,n) = collector(txsig,tgtang); % receive pulse rxsig(:,:,n) = receiver(rxsig(:,:,n),~txstatus); end```

Calculate the target angles and range with respect to the ULA. Then, calculate the Doppler shift induced by the motion of the phased array.

```sp = radialspeed(tgtloc,tgtvel,txloc,txvel); tgtdoppler = 2*speed2dop(sp,lambda); tgtLocation = global2localcoord(tgtloc,'rs',txloc); tgtazang = tgtLocation(1); tgtelang = tgtLocation(2); tgtrng = tgtLocation(3);```

The two-way Doppler shift is approximately 1626 Hz. The azimuth angle is 45° and is identical to the value obtained in the stationary ULA example.

Plot the angle-Doppler response.

```tgtcell = val2ind(tgtrng,... physconst('LightSpeed')/(2*waveform.SampleRate)); snapshot = shiftdim(rxsig(tgtcell,:,:)); % Remove singleton dim hadresp = phased.AngleDopplerResponse('SensorArray',array,... 'OperatingFrequency',4e9, ... 'PropagationSpeed',physconst('LightSpeed'),... 'PRF',PRF, 'ElevationAngle',tgtelang); plotResponse(hadresp,snapshot); text(tgtazang,tgtdoppler,'+Target');```

The angle-Doppler response shows the greatest response at 45° azimuth at the expected Doppler shift.