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