Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Fdocuments - in Phased Array Book

Download as pdf or txt
Download as pdf or txt
You are on page 1of 362

Phased Array System Toolbox™

User's Guide

R2014b
How to Contact MathWorks

Latest news: www.mathworks.com

Sales and services: www.mathworks.com/sales_and_services

User community: www.mathworks.com/matlabcentral

Technical support: www.mathworks.com/support/contact_us

Phone: 508-647-7000

The MathWorks, Inc.


3 Apple Hill Drive
Natick, MA 01760-2098
Phased Array System Toolbox™ User's Guide
© COPYRIGHT 2011–2014 by The MathWorks, Inc.
The software described in this document is furnished under a license agreement. The software may be used
or copied only under the terms of the license agreement. No part of this manual may be photocopied or
reproduced in any form without prior written consent from The MathWorks, Inc.
FEDERAL ACQUISITION: This provision applies to all acquisitions of the Program and Documentation
by, for, or through the federal government of the United States. By accepting delivery of the Program
or Documentation, the government hereby agrees that this software or documentation qualifies as
commercial computer software or commercial computer software documentation as such terms are used
or defined in FAR 12.212, DFARS Part 227.72, and DFARS 252.227-7014. Accordingly, the terms and
conditions of this Agreement and only those rights specified in this Agreement, shall pertain to and
govern the use, modification, reproduction, release, performance, display, and disclosure of the Program
and Documentation by the federal government (or other entity acquiring for or through the federal
government) and shall supersede any conflicting contractual terms or conditions. If this License fails
to meet the government's needs or is inconsistent in any respect with federal procurement law, the
government agrees to return the Program and Documentation, unused, to The MathWorks, Inc.
Trademarks
MATLAB and Simulink are registered trademarks of The MathWorks, Inc. See
www.mathworks.com/trademarks for a list of additional trademarks. Other product or brand
names may be trademarks or registered trademarks of their respective holders.
Patents
MathWorks products are protected by one or more U.S. patents. Please see
www.mathworks.com/patents for more information.

Revision History
April 2011 Online only Revised for Version 1.0 (R2011a)
September 2011 Online only Revised for Version 1.1 (R2011b)
March 2012 Online only Revised for Version 1.2 (R2012a)
September 2012 Online only Revised for Version 1.3 (R2012b)
March 2013 Online only Revised for Version 2.0 (R2013a)
September 2013 Online only Revised for Version 2.1 (R2013b)
March 2014 Online only Revised for Version 2.2 (R2014a)
October 2014 Online only Revised for Version 2.3 (R2014b)
Contents

Phased Arrays

Antenna and Microphone Elements


1
Isotropic Antenna Element . . . . . . . . . . . . . . . . . . . . . . . 1-2
Support for Isotropic Antenna Elements . . . . . . . . . . . . 1-2
Backbaffled Isotropic Antenna . . . . . . . . . . . . . . . . . . . 1-2
Element Response of Backbaffled Isotropic Antenna
Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-4

Cosine Antenna Element . . . . . . . . . . . . . . . . . . . . . . . . . 1-6


Support for Cosine Antenna Elements . . . . . . . . . . . . . 1-6
Concentration of Cosine Response . . . . . . . . . . . . . . . . . 1-6
Cosine Antenna Element Operating from 1 to 10 GHz . . 1-7

Custom Antenna Element . . . . . . . . . . . . . . . . . . . . . . . . . 1-9


Support for Custom Antenna Elements . . . . . . . . . . . . . 1-9
Antenna with Custom Radiation Pattern . . . . . . . . . . . 1-9

Omnidirectional Microphone . . . . . . . . . . . . . . . . . . . . . 1-11


Support for Omnidirectional Microphones . . . . . . . . . . 1-11
Backbaffled Omnidirectional Microphone . . . . . . . . . . 1-11

Custom Microphone Element . . . . . . . . . . . . . . . . . . . . . 1-14


Support for Custom Microphone Elements . . . . . . . . . 1-14

iii
Array Geometries and Analysis
2
Uniform Linear Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-2
Support for Uniform Linear Arrays . . . . . . . . . . . . . . . . 2-2
Positions of Elements in Array . . . . . . . . . . . . . . . . . . . 2-2
Identical Elements in Array . . . . . . . . . . . . . . . . . . . . . 2-3
Response of Array Elements . . . . . . . . . . . . . . . . . . . . . 2-4
Signal Delay Between Array Elements . . . . . . . . . . . . . 2-4
Steering Vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-5
Array Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-6
Reception of Plane Wave Across Array . . . . . . . . . . . . . 2-7

Microphone Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-9

Uniform Rectangular Array . . . . . . . . . . . . . . . . . . . . . . 2-11


Support for Uniform Rectangular Arrays . . . . . . . . . . 2-11
Uniform Rectangular Array with Isotropic Antenna
Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-11

Conformal Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-14


Support for Arrays with Custom Geometry . . . . . . . . . 2-14
Uniform Circular Array . . . . . . . . . . . . . . . . . . . . . . . . 2-14
Custom Antenna Array . . . . . . . . . . . . . . . . . . . . . . . . 2-16

Subarrays Within Arrays . . . . . . . . . . . . . . . . . . . . . . . . 2-19


Definition of Subarrays . . . . . . . . . . . . . . . . . . . . . . . . 2-19
Benefits of Using Subarrays . . . . . . . . . . . . . . . . . . . . 2-19
Support for Subarrays Within Arrays . . . . . . . . . . . . . 2-19
Rectangular Array Partitioned into Linear Subarrays . 2-20
Linear Subarray Replicated to Form Rectangular Array 2-23
Linear Subarray Replicated in a Custom Grid . . . . . . . 2-24

Signal Radiation and Collection


3
Signal Radiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-2
Support for Modeling Signal Radiation . . . . . . . . . . . . . 3-2
Radiate Signal with Uniform Linear Array . . . . . . . . . . 3-2

iv Contents
Signal Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-4
Support for Modeling Signal Collection . . . . . . . . . . . . . 3-4
Narrowband Collector for Uniform Linear Array . . . . . . 3-5
Narrowband Collector for a Single Antenna Element . . . 3-6
Wideband Signal Collection . . . . . . . . . . . . . . . . . . . . . . 3-7

Waveforms, Transmitter, and Receiver


4
Rectangular Pulse Waveforms . . . . . . . . . . . . . . . . . . . . . . . . . 4-2
Definition of Rectangular Pulse Waveform . . . . . . . . . . . . . . 4-2
How to Create Rectangular Pulse Waveforms . . . . . . . . . . . . 4-2
Rectangular Waveform Plot . . . . . . . . . . . . . . . . . . . . . . . . . 4-3
Pulses of Rectangular Waveform . . . . . . . . . . . . . . . . . . . . . . 4-4

Linear Frequency Modulated Pulse Waveforms . . . . . . . . . . 4-6


Benefits of Using Linear FM Pulse Waveform . . . . . . . . . . . . 4-6
Definition of Linear FM Pulse Waveform . . . . . . . . . . . . . . . 4-6
How to Create Linear FM Pulse Waveforms . . . . . . . . . . . . . 4-7
Configuration of Linear FM Pulse Waveform . . . . . . . . . . . . 4-8
Linear FM Pulse Waveform Plots . . . . . . . . . . . . . . . . . . . . . 4-8
Ambiguity Function of Linear FM Waveform . . . . . . . . . . . 4-10
Comparing Autocorrelation for Rectangular and Linear FM
Waveforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-11

Stepped FM Pulse Waveforms . . . . . . . . . . . . . . . . . . . . . . . . 4-13

FMCW Waveforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-15


Benefits of Using FMCW Waveform . . . . . . . . . . . . . . . . . . 4-15
How to Create FMCW Waveforms . . . . . . . . . . . . . . . . . . . . 4-15
Double Triangular Sweep . . . . . . . . . . . . . . . . . . . . . . . . . . 4-16

Phase-Coded Waveforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-17


When to Use Phase-Coded Waveforms . . . . . . . . . . . . . . . . 4-17
How to Create Phase-Coded Waveforms . . . . . . . . . . . . . . . 4-17
Basic Radar Using Phase-Coded Waveform . . . . . . . . . . . . . 4-18

Waveforms with Staggered PRFs . . . . . . . . . . . . . . . . . . . . . 4-21


When to Use Staggered PRFs . . . . . . . . . . . . . . . . . . . . . . . 4-21
Linear FM Waveform with Staggered PRF . . . . . . . . . . . . . 4-21

v
Transmitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-23
Transmitter Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-23
Phase Noise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-25

Receiver Preamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-29


Operation of Receiver Preamp . . . . . . . . . . . . . . . . . . . . . . . 4-29
Configuring Receiver Preamp . . . . . . . . . . . . . . . . . . . . . . . 4-29
Model Receiver Effects on Sinusoidal Input . . . . . . . . . . . . . 4-30
Model Coherent on Receive Behavior . . . . . . . . . . . . . . . . . 4-32

Radar Equation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-34


Radar Equation Theory . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-34
Link Budget Calculation Using the Radar Equation . . . . . . 4-35
Maximum Detectable Range for a Monostatic Radar . . . . . . 4-36
Output SNR at the Receiver in a Bistatic Radar . . . . . . . . . 4-37

Beamforming
5
Conventional Beamforming . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-2
Uses for Beamformers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-2
Support for Conventional Beamforming . . . . . . . . . . . . . . . . 5-2
Narrowband Phase Shift Beamformer with a ULA . . . . . . . . 5-2

Adaptive Beamforming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-7


Benefits of Adaptive Beamforming . . . . . . . . . . . . . . . . . . . . 5-7
Support for Adaptive Beamforming . . . . . . . . . . . . . . . . . . . . 5-7
LCMV Beamformer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-7

Wideband Beamforming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-11


Support for Wideband Beamforming . . . . . . . . . . . . . . . . . . 5-11
Time-Delay Beamforming . . . . . . . . . . . . . . . . . . . . . . . . . . 5-11
Visualization of Wideband Beamformer Performance . . . . . 5-13

vi Contents
Direction-of-Arrival (DOA) Estimation
6
Beamscan Direction-of-Arrival Estimation . . . . . . . . . . . . . . 6-2

Super-resolution DOA Estimation . . . . . . . . . . . . . . . . . . . . . . 6-4

Space-Time Adaptive Processing (STAP)


7
Angle-Doppler Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-2
Benefits of Visualizing Angle-Doppler Response . . . . . . . . . . 7-2
Angle-Doppler Response of a Stationary Target at a Stationary
Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-2
Angle-Doppler Response of a Stationary Target Return at a
Moving Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-4

Displaced Phase Center Antenna (DPCA) Pulse Canceller . . 7-8


When to Use the DPCA Pulse Canceller . . . . . . . . . . . . . . . . 7-8
Example: DPCA Pulse Canceller for Clutter Rejection . . . . . . 7-8

Adaptive Displaced Phase Center Antenna Pulse Canceller 7-13


When to Use the Adaptive DPCA Pulse Canceller . . . . . . . . 7-13
Example: Adaptive DPCA Pulse Canceller . . . . . . . . . . . . . 7-13

Sample Matrix Inversion (SMI) Beamformer . . . . . . . . . . . . 7-18


When to Use the SMI Beamformer . . . . . . . . . . . . . . . . . . . 7-18
Example: Sample Matrix Inversion (SMI) Beamformer . . . . 7-18

Detection
8
Neyman-Pearson Hypothesis Testing . . . . . . . . . . . . . . . . . . . 8-2
Purpose of Hypothesis Testing . . . . . . . . . . . . . . . . . . . . . . . 8-2
Support for Neyman-Pearson Hypothesis Testing . . . . . . . . . 8-2
Threshold for Real-Valued Signal in White Gaussian Noise . . 8-3

vii
Threshold for Two Pulses of Real-Valued Signal in White
Gaussian Noise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-4
Threshold for Complex-Valued Signals in Complex White
Gaussian Noise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-5

Receiver Operating Characteristic (ROC) Curves . . . . . . . . . 8-6

Matched Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-11


Reasons for Using Matched Filtering . . . . . . . . . . . . . . . . . 8-11
Support for Matched Filtering . . . . . . . . . . . . . . . . . . . . . . . 8-11
Matched Filtering of Linear FM Waveform . . . . . . . . . . . . . 8-11
Matched Filtering to Improve SNR for Target Detection . . . 8-13

Stretch Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-17


Reasons for Using Stretch Processing . . . . . . . . . . . . . . . . . 8-17
Support for Stretch Processing . . . . . . . . . . . . . . . . . . . . . . 8-17
Stretch Processing Procedure . . . . . . . . . . . . . . . . . . . . . . . 8-17

FMCW Range Estimation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-19

Range-Doppler Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-21


Benefits of Producing Range-Doppler Response . . . . . . . . . . 8-21
Support for Range-Doppler Processing . . . . . . . . . . . . . . . . 8-21
Range-Speed Response Pattern of Target . . . . . . . . . . . . . . 8-23

Constant False-Alarm Rate (CFAR) Detectors . . . . . . . . . . . 8-27


Reasons for Using CFAR Detectors . . . . . . . . . . . . . . . . . . . 8-27
Cell-Averaging CFAR Detector . . . . . . . . . . . . . . . . . . . . . . 8-28
Testing CFAR Detector Adaption to Noisy Input Data . . . . . 8-30
Extensions of Cell-Averaging CFAR Detector . . . . . . . . . . . 8-31
Detection Probability for CFAR Detector . . . . . . . . . . . . . . . 8-31

Environment and Target Models


9
Free Space Path Loss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-2
Support for Modeling Propagation in Free Space . . . . . . . . . . 9-2
Free Space Path Loss in Decibels . . . . . . . . . . . . . . . . . . . . . 9-2
Propagation of a Linear FM Pulse Waveform to and from a
Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-3

viii Contents
One-Way and Two-Way Propagation . . . . . . . . . . . . . . . . . . . 9-4
Propagation from Stationary Radar to Moving Target . . . . . . 9-5

Radar Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-9

Clutter Modeling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-13


Surface Clutter Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 9-13
Approaches for Clutter Simulation or Analysis . . . . . . . . . . 9-13
Considerations for Setting Up a Constant Gamma Clutter
Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-14
Related Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-15

Barrage Jammer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9-16


Support for Modeling Barrage Jammer . . . . . . . . . . . . . . . . 9-16
Model Real and Imaginary Parts of Barrage Jammer Output 9-16
Model Effect of Barrage Jammer on Target Echo . . . . . . . . . 9-17

Coordinate Systems and Motion Modeling


10
Rectangular Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-2
Definitions of Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . 10-2
Notation for Vectors and Points . . . . . . . . . . . . . . . . . . . . . 10-3
Orthogonal Basis and Euclidean Norm . . . . . . . . . . . . . . . . 10-3
Orientation of Coordinate Axes . . . . . . . . . . . . . . . . . . . . . . 10-4
Rotations and Rotation Matrices . . . . . . . . . . . . . . . . . . . . . 10-7

Spherical Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-14


Support for Spherical Coordinates . . . . . . . . . . . . . . . . . . . 10-14
Azimuth and Elevation Angles . . . . . . . . . . . . . . . . . . . . . 10-14
Phi and Theta Angles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-15
U and V Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-16
Conversion Between Rectangular and Spherical
Coordinates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-17
Broadside Angle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10-18

Global and Local Coordinate Systems . . . . . . . . . . . . . . . . 10-22


Global Coordinate System . . . . . . . . . . . . . . . . . . . . . . . . . 10-22
Local Coordinate System . . . . . . . . . . . . . . . . . . . . . . . . . . 10-23
Converting Between Global and Local Coordinate Systems 10-27

ix
Motion Modeling in Phased Array Systems . . . . . . . . . . . . 10-29
Support for Motion Modeling . . . . . . . . . . . . . . . . . . . . . . . 10-29
Platform Motion with Constant Velocity . . . . . . . . . . . . . . 10-30
Platform Motion with Nonconstant Velocity . . . . . . . . . . . 10-31
Track Range and Angle Changes Between Platforms . . . . . 10-32

Doppler Shift and Pulse-Doppler Processing . . . . . . . . . . . 10-34


Support for Pulse-Doppler Processing . . . . . . . . . . . . . . . . 10-34
Converting Speed to Doppler Shift . . . . . . . . . . . . . . . . . . 10-34
Converting Doppler Shift to Speed . . . . . . . . . . . . . . . . . . 10-35
Pulse-Doppler Processing of Slow-Time Data . . . . . . . . . . . 10-35

Using Polarization
11
Polarized Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-2
Introduction to Polarization . . . . . . . . . . . . . . . . . . . . . . . . 11-2
Linear and Circular Polarization . . . . . . . . . . . . . . . . . . . . . 11-4
Elliptic Polarization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-9
Linear and Circular Polarization Bases . . . . . . . . . . . . . . . 11-13
Sources of Polarized Fields . . . . . . . . . . . . . . . . . . . . . . . . 11-17
Scattering Cross-Section Matrix . . . . . . . . . . . . . . . . . . . . 11-24
Polarization Loss Due to Field and Receiver Mismatch . . . 11-27
Polarization Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11-29

Antenna and Array Definitions


12
Element and Array Radiation and Response Patterns . . . . 12-2
Element Response and Radiation Patterns . . . . . . . . . . . . . 12-2
Array Response and Radiation Patterns . . . . . . . . . . . . . . . 12-6

x Contents
Code Generation
13
Code Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-2
Code Generation Use and Benefits . . . . . . . . . . . . . . . . . . . 13-2
Limitations Specific to Phased Array System Toolbox . . . . . 13-3
General Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-6
Limitations for System Objects that Require Dynamic Memory
Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-11

Generate MEX Function to Estimate Directions of Arrival 13-12

Generate MEX Function Containing Persistent System


Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-15

Functions and System Objects Supported for C/C++ Code


Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13-18

Define New System Objects


14
Define Basic System Objects . . . . . . . . . . . . . . . . . . . . . . . . . 14-2

Change Number of Step Inputs or Outputs . . . . . . . . . . . . . 14-4

Validate Property and Input Values . . . . . . . . . . . . . . . . . . . 14-8

Initialize Properties and Setup One-Time Calculations . . 14-11

Set Property Values at Construction Time . . . . . . . . . . . . . 14-14

Reset Algorithm State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-16

Define Property Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . 14-18

Hide Inactive Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-22

Limit Property Values to Finite String Set . . . . . . . . . . . . 14-24

xi
Process Tuned Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-27

Release System Object Resources . . . . . . . . . . . . . . . . . . . . 14-29

Define Composite System Objects . . . . . . . . . . . . . . . . . . . . 14-31

Define Finite Source Objects . . . . . . . . . . . . . . . . . . . . . . . . 14-34

Save System Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-36

Load System Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-39

Clone System Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-42

Define System Object Information . . . . . . . . . . . . . . . . . . . 14-43

Methods Timing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-45


Setup Method Call Sequence . . . . . . . . . . . . . . . . . . . . . . . 14-45
Step Method Call Sequence . . . . . . . . . . . . . . . . . . . . . . . . 14-45
Reset Method Call Sequence . . . . . . . . . . . . . . . . . . . . . . . 14-46
Release Method Call Sequence . . . . . . . . . . . . . . . . . . . . . 14-47

System Object Input Arguments and ~ in Code Examples 14-48

What Are Mixin Classes? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14-49

Best Practices for Defining System Objects . . . . . . . . . . . . 14-50

xii Contents
Phased Arrays
1

Antenna and Microphone Elements

• “Isotropic Antenna Element” on page 1-2


• “Cosine Antenna Element” on page 1-6
• “Custom Antenna Element” on page 1-9
• “Omnidirectional Microphone” on page 1-11
• “Custom Microphone Element” on page 1-14
1 Antenna and Microphone Elements

Isotropic Antenna Element

In this section...
“Support for Isotropic Antenna Elements” on page 1-2
“Backbaffled Isotropic Antenna” on page 1-2
“Element Response of Backbaffled Isotropic Antenna Element” on page 1-4

Support for Isotropic Antenna Elements


An isotropic antenna element radiates equal power in all nonbaffled directions. To
construct an isotropic antenna, use phased.IsotropicAntennaElement. When you
use this object, you must specify these aspects of the antenna:

• Operating frequency range of the antenna


• Whether the response of the antenna is baffled at azimuth angles outside the interval
[–90,90]

You can find your isotropic antenna element’s voltage response at specific frequencies
and angles using the antenna element’s step method.

Backbaffled Isotropic Antenna


This example shows how to construct a backbaffled isotropic antenna element with a
uniform frequency response over azimuth angles from [–180,180] degrees and elevation
angles from [–90,90] degrees. The antenna operates between 300 megahertz (MHz) and 1
gigahertz (GHz). Plot the antenna response at 1 GHz.

ha = phased.IsotropicAntennaElement(...
'FrequencyRange',[3e8 1e9],'BackBaffled',false)
plotResponse(ha,1e9,'RespCut','3D','Format','Polar',...
'Unit','pow');

1-2
Isotropic Antenna Element

plotResponse is a method of phased.IsotropicAntennaElement. By default,


plotResponse plots the response of the antenna element in decibels (dB) at zero
degrees elevation.

figure;
plotResponse(ha,1e9);

Setting the BackBaffled property to true limits the response to azimuth angles in the
interval [–90,90].

1-3
1 Antenna and Microphone Elements

ha.BackBaffled=true;
figure;
plotResponse(ha,1e9,'RespCut','3D','Format','Polar',...
'Unit','pow');

Element Response of Backbaffled Isotropic Antenna Element


This example shows how to design a backbaffled isotropic antenna element and obtain
the response of that element.

Construct an isotropic antenna element to operate in the IEEE® X band between 8 and
12 GHz. Backbaffle the response of the antenna. Obtain your antenna element’s response
at 4 GHz intervals between 6 and 14 GHz and at azimuth angles between –100 and 100
in 50-degree increments.

ha = phased.IsotropicAntennaElement(...
'FrequencyRange',[8e9 12e9],'BackBaffled',true)
respfreqs = 6e9:4e9:14e9;
respazangles = -100:50:100;
anresp = step(ha,respfreqs,respazangles)

The antenna response in anresp is a matrix whose row dimension equals the number
of azimuth angles in respazangles and whose column dimension equals the number of
frequencies in respfreqs.

1-4
Isotropic Antenna Element

The response voltage in the first two and last two columns of anresp is zero because
those columns contain the antenna response at 6 and 14 GHz respectively. These
frequencies are not included in the antenna’s operating frequency range.

Similarly, the first and last rows of anresp contain all zeros because the BackBaffled
property is set to true. The first and last row contain the antenna’s response at azimuth
angles outside of [–90,90].

To obtain the antenna response at nonzero elevation angles, input the angles to step as
a 2-by-M matrix where each column is an angle in the form [azimuth;elevation].

release(ha)
respelangles = -90:45:90;
respangles = [respazangles; respelangles];
anresp = step(ha,respfreqs,respangles)

Note that anresp(1,2) and anresp(5,2) represent the antenna voltage response at
the aziumth-elevation pairs (–100,–90) and (100,90). Because the elevation angles are
equal to +/– 90 degrees, these responses are equal to one even though the BackBaffled
property is set to true. Thus, the resulting elevation cut degenerates into a point.

1-5
1 Antenna and Microphone Elements

Cosine Antenna Element


In this section...
“Support for Cosine Antenna Elements” on page 1-6
“Concentration of Cosine Response” on page 1-6
“Cosine Antenna Element Operating from 1 to 10 GHz” on page 1-7

Support for Cosine Antenna Elements


The phased.CosineAntennaElement object models an antenna element whose
response is cosine raised to a specified power in the azimuth and elevation directions.

The cosine response, or cosine pattern, is given by:

P( az, el) = cosm ( az) cosn ( el)

In this expression:

• az is the azimuth angle.


• el is the elevation angle.
• The exponents m and n are real numbers greater than or equal to 1.

The response is defined for azimuth and elevation angles between –90 and 90 degrees,
inclusive. There is no response at the back of a cosine antenna. The cosine response
pattern achieves a maximum value of 1 at 0 degrees azimuth and elevation. Raising the
response pattern to powers greater than one concentrates the response in azimuth or
elevation.

When you use the cosine antenna element, you specify the exponent of the cosine pattern
and the operating frequency range of the antenna.

Concentration of Cosine Response


This example shows how to visualize the effect of concentrating the response. The
example computes and plots the cosine response with powers equal to 1 and 2 for a single
angle between –90 and 90 degrees.

1-6
Cosine Antenna Element

theta = -90:.01:90;
Cos1 = cosd(theta);
Cos2 = Cos1.^2;
plot(theta,Cos1); hold on;
plot(theta,Cos2,'r');
legend('Exponent = 1','Exponent = 2','location','northeast');
xlabel('Degrees'); ylabel('Response');

Cosine Antenna Element Operating from 1 to 10 GHz


This example shows how to construct an antenna with a cosine squared response in both
azimuth and elevation and plot the antenna response. The operating frequency range of
the antenna is from 1 to 10 GHz.

hcos = phased.CosineAntennaElement(...
'FrequencyRange',[1e9 1e10],'CosinePower',[2 2])
plotResponse(hcos,5e9,'RespCut','3D','Format','Polar');

1-7
1 Antenna and Microphone Elements

1-8
Custom Antenna Element

Custom Antenna Element


In this section...
“Support for Custom Antenna Elements” on page 1-9
“Antenna with Custom Radiation Pattern” on page 1-9

Support for Custom Antenna Elements


The phased.CustomAntennaElement object enables you to model a custom antenna
element. When you use phased.CustomAntennaElement, you must specify these
aspects of the antenna:

• Operating frequency vector for the antenna element


• Frequency response of the element at the frequencies in the operating frequency
vector
• Azimuth angles and elevation angles where the custom response is evaluated
• Magnitude radiation pattern. This pattern shows the spatial response of the antenna
at the azimuth and elevation angles you specify.

Tip You can import a radiation pattern that uses u/v coordinates or φ/θ
angles, instead of azimuth/elevation angles. To use such a pattern with
phased.CustomAntennaElement, first convert your pattern to azimuth/elevation
form. Use uv2azelpat or phitheta2azelpat to do the conversion. For an example,
see Antenna Array Analysis with Custom Radiation Pattern.

For your custom antenna element, the antenna response (the output of step) depends
on the frequency response and radiation pattern. Specifically, the frequency and spatial
responses are interpolated separately using nearest-neighbor interpolation and then
multiplied together to produce the total response. To avoid interpolation errors, the
range of azimuth angles should include +/– 180 degrees and the range of elevation angles
should include +/– 90 degrees.

Antenna with Custom Radiation Pattern


This example shows how to construct a custom antenna element object. The radiation
pattern is constant over each azimuth angle and has a cosine pattern for the elevation
angles.

1-9
1 Antenna and Microphone Elements

Az = -180:90:180;
El = -90:45:90;
Elresp = cosd(El);
ha = phased.CustomAntennaElement('AzimuthAngles',Az,...
'ElevationAngles',El,...
'RadiationPattern',repmat(Elresp',1,numel(Az)));
ha.RadiationPattern

Use the step method to calculate the antenna response at the azimuth-elevation pairs
[-30 0; -45 0]; for a frequency of 500 MHz.

ANG = [-30 0; -45 0];


resp = step(ha,5e8,ANG)

The following illustrates the nearest-neighbor interpolation method used to find the
antenna voltage response.
G = interp2(degtorad(ha.AzimuthAngles),...
degtorad(ha.ElevationAngles),...
db2mag(ha.RadiationPattern),...
degtorad(ANG(1,:))', degtorad(ANG(2,:))','nearest',0);
H = interp1(ha.FrequencyVector,...
db2mag(ha.FrequencyResponse),5e8,'nearest',0);
antresp = H.*G

Compare the value of antresp to the output of the step method.

1-10
Omnidirectional Microphone

Omnidirectional Microphone

In this section...
“Support for Omnidirectional Microphones” on page 1-11
“Backbaffled Omnidirectional Microphone” on page 1-11

Support for Omnidirectional Microphones


An omnidirectional microphone has a response which is equal to one in all nonbaffled
directions. The phased.OmnidirectionalMicrophoneElement object enables you to
model an omnidirectional microphone. When you use this object, you must specify these
aspects of the microphone:

• Operating frequency range of the microphone


• Whether the response of the microphone is baffled at azimuth angles outside the
interval [–90,90]

Backbaffled Omnidirectional Microphone


Construct an omnidirectional microphone element using the human audible frequency
range of 20 to 20,000 Hz. Baffle the microphone response for azimuth angles outside of
+/– 90 degrees. Plot the microphone’s power response at 1000 Hz in polar form.

hmic = phased.OmnidirectionalMicrophoneElement(...
'BackBaffled',true,'FrequencyRange',[20 20e3]);
plotResponse(hmic,1e3,'RespCut','3D','Format','Polar',...
'Unit','pow');

1-11
1 Antenna and Microphone Elements

In many applications, you sometimes need to examine the microphone’s directionality,


or polar pattern. To do so, set the RespCut argument of plotResponse to one of the 2-
D options and set the Format argument to 'Polar'. The 2-D options for the cut of the
response are 'Az' (default), and 'El'.

% Using the default azimuth cut


figure;
plotResponse(hmic,1e3,'Format','Polar');

1-12
Omnidirectional Microphone

Use step to obtain the microphone’s magnitude response at the specified azimuth angles
and frequencies. The elevation angles are 0 degrees. Note the response is one at all
azimuth angles and frequencies as expected.
freq = 100:250:1e3;
ang = -90:30:90;
micresp = step(hmic,freq,ang)

1-13
1 Antenna and Microphone Elements

Custom Microphone Element

Support for Custom Microphone Elements


You can model a microphone with your custom response
using phased.CustomMicrophoneElement. When you use
phased.CustomMicrophoneElement, you must specify these aspects of the
microphone:

• Frequencies where you specify your response


• Frequency response corresponding to the specified frequencies
• Frequencies and angles at which the microphone’s polar pattern is measured.
• Magnitude response of the microphone.

Related Examples
• “Microphone Array” on page 2-9

1-14
2

Array Geometries and Analysis

• “Uniform Linear Array” on page 2-2


• “Microphone Array” on page 2-9
• “Uniform Rectangular Array” on page 2-11
• “Conformal Array” on page 2-14
• “Subarrays Within Arrays” on page 2-19
2 Array Geometries and Analysis

Uniform Linear Array

In this section...
“Support for Uniform Linear Arrays” on page 2-2
“Positions of Elements in Array” on page 2-2
“Identical Elements in Array” on page 2-3
“Response of Array Elements” on page 2-4
“Signal Delay Between Array Elements” on page 2-4
“Steering Vector” on page 2-5
“Array Response” on page 2-6
“Reception of Plane Wave Across Array” on page 2-7

Support for Uniform Linear Arrays


The uniform linear array (ULA) arranges identical sensor elements along a line in space
with uniform spacing. You can design a ULA with phased.ULA. When you use this
object, you must specify these aspects of the array:

• Sensor elements of the array


• Spacing between array elements
• Number of elements in the array

Positions of Elements in Array


Create and view a ULA with two isotropic antenna elements separated by 0.5 meters:

hula = phased.ULA('NumElements',2,'ElementSpacing',0.5);
viewArray(hula);

2-2
Uniform Linear Array

You can return the coordinates of the array sensor elements in the form [x;y;z] by
using the getElementPosition method. See “Rectangular Coordinates” on page
10-2 for toolbox conventions.

sensorpos = getElementPosition(hula);

sensorpos is a 3-by-2 matrix with each column representing the position of a sensor
element. Note that the y-axis is the array axis. The positive x-axis is the array look
direction (0 degrees broadside). The elements are symmetric with the respect to the
phase center of the array.

Identical Elements in Array


The default element for a ULA is the phased.IsotropicAntennaElement object. You
can specify an alternative element by changing the Element property.

2-3
2 Array Geometries and Analysis

Response of Array Elements


To obtain the responses of your array elements, use the array’s step method.

% Construct antenna for the array elements


hant = phased.IsotropicAntennaElement(...
'FrequencyRange',[3e8 1e9]);
hula = phased.ULA('NumElements',2,'ElementSpacing',0.5,...
'Element',hant);
% Obtain element responses at 1 GHz
freq = 1e9;
% for azimuth angles from -180:180
azangles = -180:180;
% elementresponses
elementresponses = step(hula,1e9,azangles);

elementresponses is a 2-by-361 matrix where each column contains the element


responses for the 361 azimuth angles. Because the elements of the ULA are isotropic
antennas, elementresponses is a matrix of ones.

Signal Delay Between Array Elements


To determine the signal delay in seconds between array elements, use
phased.ElementDelay. The incident waveform is assumed to satisfy the far-field
assumption.

The following example computes the delay between elements of a 4-element ULA for
a signal incident on the array from –90 degrees azimuth and zero degrees elevation.
The delays are computed with respect to the phase center of the array. By default,
phased.ElementDelay assumes that the incident waveform is an electromagnetic wave
propagating at the speed of light.
% Construct 4-element ULA using value-only syntax
hula = phased.ULA(4);
hdelay = phased.ElementDelay('SensorArray',hula);
tau = step(hdelay,[-90;0]);

tau is a 4-by-1 vector of delays with respect to the phase center of the array, which is
the origin of the local coordinate system [0;0;0]. See “Global and Local Coordinate
Systems” for a description of global and local coordinate systems. Negative delays
indicate that the signal arrives at an element before reaching the phase center of the
array. Because the waveform arrives from an azimuth angle of –90 degrees, the signal

2-4
Uniform Linear Array

impinges on the first and second elements of the ULA before it reaches the phase center
resulting in negative delays.

If the signal is incident on the array at 0 degrees broadside from a far-field source, the
signal illuminates all elements of the array simultaneously resulting in zero delay.
tau = step(hdelay,[0;0]);

If the incident signal is an acoustic pressure waveform propagating at the speed of sound,
you can calculate the element delays by specifying the PropagationSpeed property.
hdelay = phased.ElementDelay('SensorArray',hula,...
'PropagationSpeed',340);
tau = step(hdelay,[90;0]);

In the preceding code, the propagation speed is set to 340 m/s, which is the approximate
speed of sound at sea level.

Steering Vector
The steering vector represents the relative phase shifts for the incident far-field
waveform across the array elements. You can determine these phase shifts with the
phased.SteeringVector object.

For a single carrier frequency, the steering vector for a ULA consisting of N elements is:

Ê e- j 2p f t 1 ˆ
Á ˜
Á e- j 2p f t 2 ˜
Á ˜
Á e- j 2p f t 3 ˜
Á ˜
Á . ˜
Á . ˜
Á ˜
Á . ˜
ÁÁ - j 2p f t N ˜˜
Ëe ¯

where τn denotes the time delay relative to the array phase center at the n-th array
element.

Compute the steering vector for a 4-element ULA with an operating frequency of 1 GHz.
Assume that the waveform is incident on the array from 45 degrees azimuth and 10
degrees elevation.

2-5
2 Array Geometries and Analysis

hula = phased.ULA(4);
hsv = phased.SteeringVector('SensorArray',hula);
sv = step(hsv,1e9,[45; 10]);

You can obtain the steering vector with the following equivalent code.
hdelay = phased.ElementDelay('SensorArray',hula);
tau = step(hdelay,[45;10]);
exp(-1j*2*pi*1e9*tau)

Array Response
To obtain the array response, which is a weighted-combination of the steering vector
elements for each incident angle, use phased.ArrayResponse.

Construct a two-element ULA with elements spaced at 0.5 m. Obtain the array’s
magnitude response (absolute value of the complex-valued array response) for azimuth
angles -180:180 and plot the normalized magnitude response in decibels.
hula = phased.ULA('NumElements',2,'ElementSpacing',0.5);
azangles = -180:180;
har = phased.ArrayResponse('SensorArray',hula);
resp = abs(step(har,1e9,azangles));
plot(azangles,mag2db((resp/max(resp))));
grid on;
title('Azimuth Cut at Zero Degrees Elevation');
xlabel('Azimuth Angle (degrees)');

2-6
Uniform Linear Array

Visualize the array response using the plotResponse method. This example uses
options to create a 3-D plot of the response in u/v space; other plotting options are
available.

figure;
plotResponse(hula,1e9,physconst('LightSpeed'),...
'Format','UV','RespCut','3D')

Reception of Plane Wave Across Array


You can simulate the effects of phase shifts across your array using the
collectPlaneWave method.

The collectPlaneWave method modulates input signals by the element of the steering
vector corresponding to an array element. Stated differently, collectPlaneWave
accounts for phase shifts across elements in the array based on the angle of arrival.
However, collectPlaneWave does not account for the response of individual elements
in the array.

Simulate the reception of a 100-Hz sine wave modulated by a carrier frequency of 1 GHz
at a 4-element ULA. Assume the angle of arrival of the signal is [-90; 0].

hula = phased.ULA(4);
t = unigrid(0,0.001,0.01,'[)');
% signals must be column vectors

2-7
2 Array Geometries and Analysis

x = cos(2*pi*100*t)';
y = collectPlaneWave(hula,x,[-90;0],1e9,physconst('LightSpeed'));

The preceding code is equivalent to the following.


hsv = phased.SteeringVector('SensorArray',hula);
sv = step(hsv,1e9,[-90;0]);
y1 = x*sv.';

Related Examples
• “Microphone Array” on page 2-9

2-8
Microphone Array

Microphone Array
This example shows how to construct and visualize a four-element ULA with custom
cardioid microphone elements.

Create a microphone element with a cardioid response pattern. Use the default
FrequencyVector of [20 20e3]. Specify the polar pattern frequencies as [500 1000].

freq = [500 1000];


hmic = phased.CustomMicrophoneElement(...
'PolarPatternFrequencies',freq);
hmic.PolarPattern= mag2db([...
0.5+0.5*cosd(hmic.PolarPatternAngles);...
0.6+0.4*cosd(hmic.PolarPatternAngles)]);

Plot the polar pattern of the microphone at 0.5 kHz and 1 kHz.

plotResponse(hmic,freq,'Format','Polar');

Assign the custom microphone element as the Element property of a phased.ULA object.

ha = phased.ULA('NumElements',4,'ElementSpacing',0.5,...
'Element',hmic);

Plot the response of the array at 0.5 kHz and 1 kHz.

figure;
plotResponse(ha,freq,340,'Format','Polar')

2-9
2 Array Geometries and Analysis

2-10
Uniform Rectangular Array

Uniform Rectangular Array

In this section...
“Support for Uniform Rectangular Arrays” on page 2-11
“Uniform Rectangular Array with Isotropic Antenna Elements” on page 2-11

Support for Uniform Rectangular Arrays


You can implement a uniform rectangular array (URA) with phased.URA. Array
elements are distributed in the yz-plane with the array look direction along the positive
x-axis. When you use phased.URA, you must specify these aspects of the array:

• Sensor elements of the array


• Number of rows and the spacing between them
• Number of columns and the spacing between them
• Geometry of the planar lattice, which can be rectangular or triangular

Uniform Rectangular Array with Isotropic Antenna Elements


This example shows how to create a URA, get information about its element positions,
response, and delays, and simulate its reception of two sine waves.

Create and view a six-element URA with two elements along the y-axis and three
elements along the z-axis. Use a rectangular lattice, with the default spacing of 0.5
meters along both the row and column dimensions of the array. Each element is an
isotropic antenna element, which is the default. Return the positions of the array
elements.

hura = phased.URA([3 2]);


viewArray(hura);
pos = getElementPosition(hura);

2-11
2 Array Geometries and Analysis

The x-coordinate is zero for all elements in the array.

You can plot the array response using the plotResponse method.

% Plot the response in 3D


figure;
plotResponse(hura,1e9,physconst('LightSpeed'),'RespCut','3D')

Calculate the element delays for signals arriving from +/– 45 degrees azimuth and 0
degrees elevation.

hed = phased.ElementDelay('SensorArray',hura);
ang = [45 -45];
tau = step(hed,ang);

2-12
Uniform Rectangular Array

The first column of tau contains the element delays for the signal incident on the array
from +45 degrees azimuth and the second column contains the delays for the signal
arriving from –45 degrees. The delays are equal in magnitude but opposite in sign as
expected.

The following code simulates the reception of two sine waves arriving from far field
sources. One of the signals is a 100-Hz sine wave arriving from 20 degrees azimuth and
10 degrees elevation. The other signal is a 300-Hz sine wave arriving from –30 degrees
azimuth and 5 degrees elevation. Both signals have a one GHz carrier frequency.
t = linspace(0,1,1000);
x = cos(2*pi*100*t)';
y = cos(2*pi*300*t)';
angx = [20; 10];
angy = [-30;5];
recsig = collectPlaneWave(hura,[x y],[angx angy],1e9);

Each column of recsig represents the received signal at the corresponding element of
the URA, hura.

2-13
2 Array Geometries and Analysis

Conformal Array
In this section...
“Support for Arrays with Custom Geometry” on page 2-14
“Uniform Circular Array” on page 2-14
“Custom Antenna Array” on page 2-16

Support for Arrays with Custom Geometry


The phased.ConformalArray object lets you model a phased array with arbitrary
geometry. For example, you can use phased.ConformalArray to design:

• A planar array with a nonrectangular geometry, such as a circular array


• An array with nonuniform geometry, such as a linear array with variable spacing
• A nonplanar array

When you use phased.ConformalArray, you must specify these aspects of the array:

• Sensor element of the array


• Element positions
• Direction normal to each array element

To create a conformal array with default properties, use this command:

hcon = phased.ConformalArray

This default conformal array consists of a single phased.IsotropicAntennaElement


sensor element located at the origin of the local coordinate system. The direction normal
to the sensor element is 0 degrees azimuth and 0 degrees elevation.

Uniform Circular Array


This example shows how to construct a uniform circular array consisting of 60 elements.
Assume an operating frequency of 400 MHz. Specify the arc length between the elements
to be 0.5λ where λ is the wavelength of the operating frequency. The element normal
directions are equal to [ang; 0] where ang is the azimuth angle of the array element.

2-14
Conformal Array

% Angle spacing in degrees


theta = 360/60;
% Angle spacing in radians
thetarad = degtorad(theta);
% Arc length 0.5*wavelength of operating frequency
arclength = 0.5*(physconst('LightSpeed')/4e8);
radius = arclength/thetarad;
% Number of elements
N = 60;
% Element angles in degrees
ang = (0:N-1)*theta;
% Azimuth angles must be between [-180,180]
ang(32:end)=ang(32:end)-360;
hcirc = phased.ConformalArray;
hcirc.ElementPosition = [radius*cosd(ang);...
radius*sind(ang);...
zeros(1,N)];
hcirc.ElementNormal = [ang; zeros(1,N)];

viewArray(hcirc);
figure;
plotResponse(hcirc,1e9,physconst('LightSpeed'),'Format','Polar')

2-15
2 Array Geometries and Analysis

Custom Antenna Array


This example shows how to construct and visualize a custom-geometry array containing
antenna elements with a custom radiation pattern. The radiation pattern of each element
is constant over each azimuth angle and has a cosine pattern for the elevation angles.

Define the antenna element and plot its radiation pattern.


Az = -180:180;
El = -90:90;
Elresp = cosd(El);
hele = phased.CustomAntennaElement('AzimuthAngles',Az,...
'ElevationAngles',El,...
'RadiationPattern',repmat(Elresp',1,numel(Az)));
plotResponse(hele,3e8,'Format','Polar','RespCut','El')

2-16
Conformal Array

Define the locations and normal directions of the elements. In this case, the elements are
located at [1;0;0], [0;1;0], and [0;-1;0]. The element normal azimuth angles are 0,
120, and –120 degrees respectively. All normal elevation angles are 0 degrees.

xpos = [1 0 0];
ypos = [0 1 -1];
zpos = [0 0 0];
normal_az = [0 120 -120];
normal_el = [0 0 0];

Define a conformal array with those elements.

ha = phased.ConformalArray('Element',hele,...
'ElementPosition',[xpos; ypos; zpos],...
'ElementNormal',[normal_az; normal_el]);

Plot the positions and normal directions of the elements.

figure;
viewArray(ha,'ShowNormals',true)
view(0,90)

2-17
2 Array Geometries and Analysis

Plot the response of the conformal array.


figure;
plotResponse(ha,3e8,3e8,'Format','Polar','RespCut','3D')

2-18
Subarrays Within Arrays

Subarrays Within Arrays


In this section...
“Definition of Subarrays” on page 2-19
“Benefits of Using Subarrays” on page 2-19
“Support for Subarrays Within Arrays” on page 2-19
“Rectangular Array Partitioned into Linear Subarrays” on page 2-20
“Linear Subarray Replicated to Form Rectangular Array” on page 2-23
“Linear Subarray Replicated in a Custom Grid” on page 2-24

Definition of Subarrays
In Phased Array System Toolbox™ software, a subarray is an accessible subset of array
elements. When you use an array that contains subarrays, you can access measurements
from the subarrays but not from the individual elements. Similarly, you can perform
processing at the subarray level but not at the level of the individual elements. As a
result, the system has fewer degrees of freedom than if you controlled the system at the
level of the individual elements.

Benefits of Using Subarrays


Radar applications often use subarrays because operations, such as phase shifting and
analog-to-digital conversion, are too expensive to implement for each element. It is less
expensive to group the elements of an array through hardware, thus creating subarrays
within the array. Grouping elements through hardware limits access to measurements
and processing to the subarray level.

Support for Subarrays Within Arrays


To work with subarrays, you must define the array and the subarrays within it. You can
either define the array first or begin with the subarray. Choose one of these approaches:

• Define one subarray, and then build a larger array by arranging copies of the
subarray. The subarray can be a ULA, URA, or conformal array. The copies are
identical, except for their location and orientation. You can arrange the copies
spatially in a grid or a custom layout.

2-19
2 Array Geometries and Analysis

When you use this approach, you build the large array by creating a
phased.ReplicatedSubarray System object™. This object stores information
about the subarray and how the copies of it are arranged to form the larger array.
• Define an array, and then partition it into subarrays. The array can be a ULA, URA,
or conformal array. The subarrays do not need to be identical. A given array element
can be in more than one subarray, leading to overlapped subarrays.

When you use this approach, you partition your array by creating a
phased.PartitionedArray System object. This object stores information about the
array and its subarray structure.

After you create a phased.ReplicatedSubarray or phased.PartitionedArray


object, you can use it to perform beamforming, steering, or other operations. To do so,
specify your object as the value of the SensorArray or Sensor property in objects that
have such a property and that support subarrays. Objects that support subarrays in their
SensorArray or Sensor property include:

• phased.AngleDopplerResponse
• phased.ArrayGain
• phased.ArrayResponse
• phased.Collector
• phased.ConstantGammaClutter
• phased.MVDRBeamformer
• phased.PhaseShiftBeamformer
• phased.Radiator
• phased.STAPSMIBeamformer
• phased.SteeringVector
• phased.SubbandPhaseShiftBeamformer
• phased.WidebandCollector

Rectangular Array Partitioned into Linear Subarrays


This example shows how to set up a rectangular array containing linear subarrays. The
example also finds the phase centers of the subarrays.

2-20
Subarrays Within Arrays

Create a 2-by-3 rectangular array.

ha = phased.URA('Size',[2 3]);

Plot the positions of the array elements in the yz plane. (All the x coordinates are zero.)
Include labels that indicate the numbering of the elements. The numbering is important
for selecting which elements are in each subarray.

viewArray(ha,'ShowIndex','All')

Create and view an array consisting of three 2-element linear subarrays each
parallel to the z-axis. Use the numbers in the plot to help form the matrix for the
SubarraySelection property. Also, find the phase centers of the three subarrays.

subarray1 = [1 1 0 0 0 0; 0 0 1 1 0 0; 0 0 0 0 1 1];

2-21
2 Array Geometries and Analysis

hpa1 = phased.PartitionedArray('Array',ha,...
'SubarraySelection',subarray1);
subarraypos1 = getSubarrayPosition(hpa1);
figure;
viewArray(hpa1)

Create and view another array consisting of two 3-element linear subarrays parallel to
the y-axis. Find the phase centers of the two subarrays.

subarray2 = [0 1 0 1 0 1; 1 0 1 0 1 0];
hpa2 = phased.PartitionedArray('Array',ha,...
'SubarraySelection',subarray2);
subarraypos2 = getSubarrayPosition(hpa2);
figure;
viewArray(hpa2)

2-22
Subarrays Within Arrays

Linear Subarray Replicated to Form Rectangular Array


This example shows how to arrange copies of a linear subarray to form a rectangular
array.

Create a 4-element linear array parallel to the y-axis.

ha = phased.ULA('NumElements',4);

Create a rectangular array by arranging two copies of the linear array.

hrs = phased.ReplicatedSubarray('Subarray',ha,...
'GridSize',[2 1]);

Plot the positions of the array elements and the phase centers of the subarrays. The plot
is in the yz plane because all the x coordinates are zero.

viewArray(hrs);
hold on;

2-23
2 Array Geometries and Analysis

subarraypos = getSubarrayPosition(hrs);
sx = subarraypos(1,:);
sy = subarraypos(2,:);
sz = subarraypos(3,:);
scatter3(sx,sy,sz,'r*');
hold off

Linear Subarray Replicated in a Custom Grid


This example shows how to arrange copies of a linear subarray in a triangular layout.

Create a 4-element linear array.


hele = phased.CosineAntennaElement('CosinePower',1);
ha = phased.ULA('NumElements',4,'Element',hele);

Create a larger array by arranging three copies of the linear array. Define the phase
centers and normal directions of the three copies explicitly.
vertex_ang = [60 180 -60];
vertex = 2*[cosd(vertex_ang); sind(vertex_ang); zeros(1,3)];

2-24
Subarrays Within Arrays

subarray_pos = 1/2*[...
(vertex(:,1)+vertex(:,2)) ...
(vertex(:,2)+vertex(:,3)) ...
(vertex(:,3)+vertex(:,1))];
hrs = phased.ReplicatedSubarray('Subarray',ha,...
'Layout','Custom',...
'SubarrayPosition',subarray_pos,...
'SubarrayNormal',[120 0;-120 0;0 0].');

Plot the positions of the array elements and the phase centers of the subarrays. The plot
is in the xy plane because all the z coordinates are zero.
viewArray(hrs,'ShowSubarray',[]);
hold on;
scatter3(subarray_pos(1,:),subarray_pos(2,:),...
subarray_pos(3,:),'r*');
hold off

Related Examples
• Subarrays in Phased Array Antennas

2-25
2-26
3

Signal Radiation and Collection

• “Signal Radiation” on page 3-2


• “Signal Collection” on page 3-4
3 Signal Radiation and Collection

Signal Radiation
In this section...
“Support for Modeling Signal Radiation” on page 3-2
“Radiate Signal with Uniform Linear Array” on page 3-2

Support for Modeling Signal Radiation


You can use the phased.Radiator and phased.Collector objects to model
narrowband signal radiation and collection with an array. The array can be a single
microphone or antenna element, or an array of sensor elements.

To radiate a signal from a sensor array, use phased.Radiator. When you use this
object, you must specify these aspects of the radiator:

• Whether the output of all sensor elements is combined


• Operating frequency of the array
• Propagation speed of the wave
• Sensor (single element) or sensor array
• Whether to apply weights to signals radiated by different elements in the array. If you
want to apply weights, you specify them when you call the step method.

Radiate Signal with Uniform Linear Array


Construct a radiator using a two-element ULA with elements spaced 0.5 meters apart
(the default ULA). The operating frequency is 300 MHz, the propagation speed is the
speed of light, and the element outputs are combined to simulate the far field radiation
pattern.
hula = phased.ULA('NumElements',2,'ElementSpacing',0.5);
hrad = phased.Radiator('Sensor',hula,...
'OperatingFrequency',3e8,...
'PropagationSpeed',physconst('LightSpeed'),...
'CombineRadiatedSignals',true)
% create signal to radiate
x = [1 -1 1 -1]';
% model far field radiation at an angle of [45;0]
y = step(hrad,x,[45;0]);

3-2
Signal Radiation

The far field signal results from multiplying the signal by the array pattern. The array
pattern is the product of the array element pattern and the array factor. For a uniform
linear array, the array factor is the superposition of elements in the steering vector (see
phased.SteeringVector).

The following code produces an identical far field signal by explicitly using the array
factor.
hula = phased.ULA('NumElements',2,'ElementSpacing',0.5);
hsv = phased.SteeringVector('SensorArray',hula,...
'IncludeElementResponse',true);
sv = step(hsv,3e8,[45;0]);
y1 = x*sum(sv);
% compare y1 to y

3-3
3 Signal Radiation and Collection

Signal Collection
In this section...
“Support for Modeling Signal Collection” on page 3-4
“Narrowband Collector for Uniform Linear Array” on page 3-5
“Narrowband Collector for a Single Antenna Element” on page 3-6
“Wideband Signal Collection” on page 3-7

Support for Modeling Signal Collection


To model the collection of a signal with a sensor element or sensor array, you can use the
phased.Collector or phased.WideBandCollector. Both collector objects assume
that incident signals have propagated to the location of the array elements, but have not
been received by the array. In other words, the collector objects do not model the actual
reception by the array. See “Receiver Preamp” for signal effects related to the gain and
internal noise of the array’s receiver.

In many array processing applications, the ratio of the signal’s bandwidth to the
carrier frequency is small. Expressed as a percentage, this ratio does not exceed a few
percent. Examples include radar applications where a pulse waveform is modulated
by a carrier frequency in the microwave range. These are narrowband signals. For
narrowband signals, you can express the steering vector as a function of a single
frequency, the carrier frequency. For narrowband signals, the phased.Collector object
is appropriate.

In other applications, the narrowband assumption is not justified. In many acoustic


and sonar applications, the wave impinging on the array is a pressure wave that
is unmodulated. It is not possible to express the steering vector as a function
of a single frequency. In these cases, the subband approach implemented in
phased.WidebandCollector is appropriate. The wideband collector decomposes the
input into subbands and computes the steering vector for each subband.

When you use the narrowband collector, phased.Collector, you must specify these
aspects of the collector:

• Operating frequency of the array


• Propagation speed of the wave

3-4
Signal Collection

• Sensor (single element) or sensor array


• Type of incoming wave. Choices are 'Plane' and 'Unspecified'. If you select
'Plane', the input signals are multiple plane waves impinging on the entire array.
Each plane wave is received by all collecting elements. If you select 'Unspecified',
the input signal are individual waves impinging on individual sensors.
• Whether to apply weights to signals collected by different elements in the array. If
you want to apply weights, you specify them when you call the step method.

When you use the wideband collector, phased.WidebandCollector, you must specify
these aspects of the collector:

• Carrier frequency
• Whether the signal is demodulated to the baseband
• Operating frequency of the array
• Propagation speed of the wave
• Sampling rate
• Sensor (single element) or sensor array
• Type of incoming wave. Choices are 'Plane' and 'Unspecified'. If you select
'Plane', the input signals are multiple plane waves impinging on the entire array.
Each plane wave is received by all collecting elements. If you select 'Unspecified',
the input signal are individual waves impinging on individual sensors.
• Whether to apply weights to signals collected by different elements in the array. If
you want to apply weights, you specify them when you call the step method.

Narrowband Collector for Uniform Linear Array


This example shows how to construct a narrowband collector that models a plane wave
impinging on a two-element uniform linear array. The array has an element spacing of
0.5 m (default ULA). The operating frequency of the array is 300 MHz.

hula = phased.ULA('NumElements',2,'ElementSpacing',0.5);
hcol = phased.Collector('Sensor',hula,...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',3e8,'Wavefront','Plane')
% create signal to create
x =[1 -1 1 -1]';
% simulate reception from an angle of [45;0]
y = step(hcol,x,[45;0]);

3-5
3 Signal Radiation and Collection

In the preceding case, the collector object multiplies the input signal, x, by the
corresponding element of the steering vector for the two-element ULA. The following code
produces the response in an equivalent manner.

% default ULA
hula = phased.ULA('NumElements',2,'ElementSpacing',0.5);
% Construct steering vector
hsv = phased.SteeringVector('SensorArray',hula);
sv = step(hsv,3e8,[45;0]);
x =[1 -1 1 -1]';
y1 = x*sv.';
% compare y1 to y

Narrowband Collector for a Single Antenna Element


The Sensor property of phased.Collector can consist of a single
antenna element. In this example, create a custom antenna element using
phased.CustomAntennaElement. The antenna element has a cosine response over
elevation angles from [–90,90] degrees. Plot the polar pattern response of the antenna at
1 GHz using an elevation cut at zero degrees azimuth. Determine the antenna voltage
response at 0 degrees azimuth and 45 degrees elevation.

ha = phased.CustomAntennaElement;
ha.AzimuthAngles = -180:180;
ha.ElevationAngles = -90:90;
ha.RadiationPattern = mag2db(...
repmat(cosd(ha.ElevationAngles)',1,numel(ha.AzimuthAngles)));
plotResponse(ha,1e9,'Format','polar','RespCut','El');
resp = step(ha,1e9,[0; 45])

3-6
Signal Collection

The antenna voltage response at zero degrees azimuth and 45 degrees elevation is
cosd(45) as expected.

Assume a narrowband sinusoidal input incident on the antenna element from 0 degrees
azimuth and 45 degrees elevation. Determine the signal collected at the element.
hc = phased.Collector('Sensor',ha,'OperatingFrequency',1e9)
x =[1 -1 1 -1]';
y = step(hc,x,[0; 45]);
% equivalent to y1 = x*cosd(45);

Wideband Signal Collection


This example shows how to simulate the reception of a wideband acoustic signal by a
single omnidirectional microphone element.
x = randn(10,1);
hmic = phased.OmnidirectionalMicrophoneElement(...
'FrequencyRange',[20 20e3],'BackBaffled',true)
hwb = phased.WidebandCollector('Sensor',hmic,...
'PropagationSpeed',340,'SampleRate',50e3,...
'ModulatedInput',false)
y = step(hwb,x,[30;10]);

3-7
3-8
4

Waveforms, Transmitter, and Receiver

• “Rectangular Pulse Waveforms” on page 4-2


• “Linear Frequency Modulated Pulse Waveforms” on page 4-6
• “Stepped FM Pulse Waveforms” on page 4-13
• “FMCW Waveforms” on page 4-15
• “Phase-Coded Waveforms” on page 4-17
• “Waveforms with Staggered PRFs” on page 4-21
• “Transmitter” on page 4-23
• “Receiver Preamp” on page 4-29
• “Radar Equation” on page 4-34
4 Waveforms, Transmitter, and Receiver

Rectangular Pulse Waveforms

In this section...
“Definition of Rectangular Pulse Waveform” on page 4-2
“How to Create Rectangular Pulse Waveforms” on page 4-2
“Rectangular Waveform Plot” on page 4-3
“Pulses of Rectangular Waveform” on page 4-4

Definition of Rectangular Pulse Waveform


Define the following function of time:

1 0 ≤ t ≤ t
a( t) = 
0 otherwise

Assume that a radar transmits a signal of the form:

x(t) = a(t) sin(wc t)

where ωc denotes the carrier frequency. Note that a(t) represents an on-off rectangular
amplitude modulation of the carrier frequency. After demodulation, the complex envelope
of x(t) is the real-valued rectangular pulse a(t) of duration τ seconds.

How to Create Rectangular Pulse Waveforms


To create a rectangular pulse waveform, use phased.RectangularWaveform. You can
customize certain characteristics of the waveform, including:

• Sampling rate
• Pulse duration
• Pulse repetition frequency
• Number of samples or pulses in each vector that represents the waveform

4-2
Rectangular Pulse Waveforms

Rectangular Waveform Plot


This example shows how to create a rectangular pulse waveform variable using
phased.RectangularWaveform. The example also plots the pulse and finds the
bandwidth of the pulse.

Construct a rectangular pulse waveform with a duration of 50 μs, a sample rate of 1


MHz, and a pulse repetition frequency (PRF) of 10 kHz.

hrect = phased.RectangularWaveform('SampleRate',1e6,...
'PulseWidth',5e-5,'PRF',1e4);

Plot a single rectangular pulse by calling plot directly on the rectangular waveform
variable.

figure;
plot(hrect)

plot is a method of phased.RectangularWaveform. This plot method produces an


annotated graph of your pulse waveform.

Find the bandwidth of the rectangular pulse.

bw = bandwidth(hrect);

4-3
4 Waveforms, Transmitter, and Receiver

The bandwidth of a rectangular pulse in hertz is approximately the reciprocal of that


pulse’s duration. That is, bw is approximately 1/hrect.PulseWidth.

Pulses of Rectangular Waveform


This example shows how to create rectangular pulse waveform signals having different
durations. The example plots two pulses of each waveform.

Create a rectangular pulse with a duration of 100 μs and a PRF of 1 kHz. Set the number
of pulses in the output equal to two.

hrect = phased.RectangularWaveform('PulseWidth',100e-6,...
'PRF',1e3,'OutputFormat','Pulses','NumPulses',2);

Make a copy of your rectangular pulse and change the pulse width in your original
waveform to 10 μs.

hrect1 = clone(hrect);
hrect.PulseWidth = 10e-6;

hrect1 and hrect now specify different rectangular pulses because you changed the
pulse width of hrect.

Use the step method to return two pulses of your rectangular pulse waveforms.

y = step(hrect);
y1 = step(hrect1);

Plot the real part of the waveforms.

totaldur = 2*1/hrect.PRF;
totnumsamp = totaldur*hrect.SampleRate;
t = unigrid(0,1/hrect.SampleRate,totaldur,'[)');
subplot(2,1,1)
plot(t.*1000,real(y)); axis([0 totaldur*1e3 0 1.5]);
title('Two 10-\musec duration pulses (PRF = 1 kHz)');
set(gca,'XTick',0:0.2:totaldur*1e3)
subplot(2,1,2);
plot(t.*1000,real(y1)); axis([0 totaldur*1e3 0 1.5]);
xlabel('Milliseconds');
title('Two 100-\musec duration pulses (PRF = 1 kHz)');
set(gca,'XTick',0:0.2:totaldur*1e3)

4-4
Rectangular Pulse Waveforms

4-5
4 Waveforms, Transmitter, and Receiver

Linear Frequency Modulated Pulse Waveforms

In this section...
“Benefits of Using Linear FM Pulse Waveform” on page 4-6
“Definition of Linear FM Pulse Waveform” on page 4-6
“How to Create Linear FM Pulse Waveforms” on page 4-7
“Configuration of Linear FM Pulse Waveform” on page 4-8
“Linear FM Pulse Waveform Plots” on page 4-8
“Ambiguity Function of Linear FM Waveform” on page 4-10
“Comparing Autocorrelation for Rectangular and Linear FM Waveforms” on page
4-11

Benefits of Using Linear FM Pulse Waveform


Increasing the duration of a transmitted pulse increases its energy and improves target
detection capability. Conversely, reducing the duration of a pulse improves the range
resolution of the radar.

For a rectangular pulse, the duration of the transmitted pulse and the processed echo are
effectively the same. Therefore, the range resolution of the radar and the target detection
capability are coupled in an inverse relationship.

Pulse compression techniques enable you to decouple the duration of the pulse from its
energy by effectively creating different durations for the transmitted pulse and processed
echo. Using a linear frequency modulated pulse waveform is a popular choice for pulse
compression.

Definition of Linear FM Pulse Waveform


The complex envelope of a linear FM pulse waveform with increasing instantaneous
frequency is:

2
x% (t) = a(t) e jp ( b /t ) t

4-6
Linear Frequency Modulated Pulse Waveforms

where β is the bandwidth and τ is the pulse duration.

If you denote the phase by Θ(t), the instantaneous frequency is:

1 dΘ(t) b
= t
2p dt t

which is a linear function of t with slope equal to β/τ.

The complex envelope of a linear FM pulse waveform with decreasing instantaneous


frequency is:

x% (t) = a(t) e− jpb /t (t −2t t)


2

Pulse compression waveforms have a time-bandwidth product, βτ, greater than 1.

How to Create Linear FM Pulse Waveforms


To create a linear FM pulse waveform, use phased.LinearFMWaveform. You can
customize certain characteristics of the waveform, including:

• Sample rate
• Duration of a single pulse
• Pulse repetition frequency
• Sweep bandwidth
• Sweep direction (up or down), corresponding to increasing and decreasing
instantaneous frequency
• Envelope, which describes the amplitude modulation of the pulse waveform. The
envelope can be rectangular or Gaussian.

• The rectangular envelope is as follows, where τ is the pulse duration.

1 0 ≤ t ≤ t
a( t) = 
0 otherwise

4-7
4 Waveforms, Transmitter, and Receiver

• The Gaussian envelope is:

2 2
a( t) = e-t /t t≥0

• Number of samples or pulses in each vector that represents the waveform

Configuration of Linear FM Pulse Waveform


This example shows how to create a linear FM pulse waveform using
phased.LinearFMWaveform. The example illustrates specific property settings.

Create a linear FM pulse with a sample rate of 1 MHz, a pulse duration of 50 μs with an
increasing instantaneous frequency, and a sweep bandwidth of 100 kHz. The amplitude
modulation is rectangular.

hfm1 = phased.LinearFMWaveform('SampleRate',1e6,...
'PulseWidth',5e-5,'PRF',1e4,...
'SweepBandwidth',1e5,'SweepDirection','Up',...
'Envelope','Rectangular',...
'OutputFormat','Pulses','NumPulses',1);

Linear FM Pulse Waveform Plots


This example shows how to design a linear FM pulse waveform, plot the real part of the
waveform, and plot one pulse repetition interval.

Design a linear FM pulse waveform with a duration of 100 μs, a bandwidth of 200 kHz,
and a PRF of 1 kHz. Use the default values for the other properties. Compute the time-
bandwidth product and plot the real part of the pulse waveform.

hfm = phased.LinearFMWaveform('PulseWidth',100e-6,...
'SweepBandwidth',2e5,'PRF',1e3);
disp(hfm.PulseWidth*hfm.SweepBandwidth)
plot(hfm)

4-8
Linear Frequency Modulated Pulse Waveforms

Use the step method to obtain your pulse waveform signal. Plot the real and imaginary
parts of one pulse repetition interval.

y = step(hfm);
t = unigrid(0,1/hfm.SampleRate,1/hfm.PRF,'[)');
figure;
subplot(2,1,1)
plot(t,real(y))
axis tight;
title('Real Part');
subplot(2,1,2);
plot(t,imag(y)); xlabel('Seconds');
title('Imaginary Part');
axis tight;

4-9
4 Waveforms, Transmitter, and Receiver

Ambiguity Function of Linear FM Waveform


This example shows how to plot the ambiguity function of the linear FM pulse waveform.

Define and set up the linear FM waveform.

hlfm = phased.LinearFMWaveform('PulseWidth',100e-6,...
'SweepBandwidth',2e5,'PRF',1e3);

Generate samples of the waveform.

x = step(hlfm);

Create a 3-D surface plot of the ambiguity function for the waveform.

[afmag_lfm,delay_lfm,doppler_lfm] = ambgfun(x,...
hlfm.SampleRate,hlfm.PRF);
surf(delay_lfm*1e6,doppler_lfm/1e3,afmag_lfm,...
'LineStyle','none');
axis tight; grid on; view([140,35]); colorbar;
xlabel('Delay \tau (\mus)');
ylabel('Doppler f_d (kHz)');
title('Linear FM Pulse Waveform Ambiguity Function');

4-10
Linear Frequency Modulated Pulse Waveforms

The surface has a narrow ridge that is slightly tilted. The tilt indicates better resolution
in the zero delay cut. For a more detailed analysis of waveforms using the ambiguity
function, see “Waveform Analysis Using the Ambiguity Function”.

Comparing Autocorrelation for Rectangular and Linear FM Waveforms


This example shows how to compute and plot the ambiguity function magnitudes for
a rectangular and linear FM pulse waveform. The zero Doppler cut (magnitudes of
the autocorrelation sequences) illustrates pulse compression in the linear FM pulse
waveform.

Create a rectangular waveform and a linear FM pulse waveform having the same
duration and PRF. Generate samples of each waveform.

hrect = phased.RectangularWaveform('PRF',2e4);
hfm = phased.LinearFMWaveform('PRF',2e4);
xrect = step(hrect);
xfm = step(hfm);

Compute the ambiguity function magnitudes for each waveform.

[ambrect,delay] = ambgfun(xrect,hrect.SampleRate,hrect.PRF,...
'Cut','Doppler');
ambfm = ambgfun(xfm,hfm.SampleRate,hfm.PRF,...
'Cut','Doppler');

Plot the ambiguity function magnitudes.

subplot(211);

4-11
4 Waveforms, Transmitter, and Receiver

stem(delay,ambrect)
title('Autocorrelation of Rectangular Pulse');
axis([-5e-5 5e-5 0 1]); set(gca,'XTick',1e-5 * (-5:5))
subplot(212);
stem(delay,ambfm)
xlabel('Delay (seconds)');
title('Autocorrelation of Linear FM Pulse');
axis([-5e-5 5e-5 0 1]); set(gca,'XTick',1e-5 * (-5:5))

Related Examples
• “Waveform Analysis Using the Ambiguity Function”

4-12
Stepped FM Pulse Waveforms

Stepped FM Pulse Waveforms


A stepped frequency pulse waveform consists of a series of N narrowband pulses. The
frequency is increased from step to step by a fixed amount, Δf, in Hz.

Similar to linear FM pulse waveforms, stepped frequency waveforms are a popular pulse
compression technique. Using this approach enables you to increase the range resolution
of the radar without sacrificing target detection capability.

To create a stepped FM pulse waveform, use phased.SteppedFMWaveform.

The stepped frequency pulse waveform has the following modifiable properties:

• SampleRate — Sampling rate in Hz


• PulseWidth — Pulse duration in seconds
• PRF — Pulse repetition frequency in Hz
• FrequencyStep — Frequency step in Hz
• NumSteps — Number of frequency steps
• OutputFormat — Output format in pulses or samples
• NumSamples — Number of samples in the output when the OutputFormat property
is 'Samples'
• NumPulses — Number of pulses in the output when the OutputFormat property is
'Pulses'

Enter the following to construct a stepped FM pulse waveform with a pulse duration
(width) of 50 μs, a PRF of 10 kHz, and five steps of 20 kHz. The sampling rate is 1 MHz.
By default the OutputFormat property is equal to 'Pulses' and the number of pulses
in the output is equal to one. The example uses the bandwidth method to demonstrate
that the bandwidth of the stepped FM pulse waveform is the product of the frequency
step and the number of steps Obj.FrequencyStep*Obj.Numsteps.

hs = phased.SteppedFMWaveform('SampleRate',1e6,...
'PulseWidth',5e-5,'PRF',1e4,...
'FrequencyStep',2e4,'NumSteps',5);
bandwidth(hs)
% equal to hs.NumSteps*hs.FrequencyStep

Because the OutputFormat property is set to 'Pulses' and the NumPulses property is
set to 1, calling the step method returns one pulse repetition interval (PRI). The pulse

4-13
4 Waveforms, Transmitter, and Receiver

duration within that interval is equal to the PulseWidth property. The remainder of the
PRI consists of zeros.

The initial pulse has a frequency of zero, and is a DC pulse. With the NumPulses
property set to 1, each time you use step, the frequency of the narrowband pulse
increments by the value of the FrequencyStep property. If you call step more times
than the value of the NumSteps property, the process repeats, starting over with the DC
pulse.

Use step to return successively higher frequency pulses. Plot the pulses one by one in
the same figure window. Pause the loop to visualize the increment in frequency with each
successive call to step. Make an additional call to step to demonstrate that the process
starts over with the DC (rectangular) pulse.
t = unigrid(0,1/hs.SampleRate,1/hs.PRF,'[)');
for i = 1:hs.NumSteps
plot(t,real(step(hs)));
pause(0.5);
axis tight;
end
% calling step again starts over with a DC pulse
y = step(hs);

The next figure shows the plot in the final iteration of the loop.

4-14
FMCW Waveforms

FMCW Waveforms
In this section...
“Benefits of Using FMCW Waveform” on page 4-15
“How to Create FMCW Waveforms” on page 4-15
“Double Triangular Sweep” on page 4-16

Benefits of Using FMCW Waveform


Radar systems that use frequency-modulated, continuous-wave (FMCW) waveforms are
typically smaller and less expensive to manufacture than pulsed radar systems. FMCW
waveforms can estimate the target range effectively, whereas the simplest continuous-
wave waveforms cannot.

FMCW waveforms are common in automotive radar systems and ground-penetrating


radar systems.

How to Create FMCW Waveforms


To create an FMCW waveform, use phased.FMCWWaveform. You can customize certain
characteristics of the waveform, including:

• Sample rate.
• Period and bandwidth of the FM sweep. These quantities can cycle through multiple
values during your simulation.

Tip To find targets up to a given maximum range, r, you can typically use a sweep
period of approximately 5*range2time(r) or 6*range2time(r). To achieve a
range resolution of delta_r, use a bandwidth of at least range2bw(delta_r).
• Sweep shape. This shape can be sawtooth (up or down) or triangular.

Tip For moving targets, you can use a triangular sweep to resolve ambiguity between
range and Doppler.

phased.FMCWWaveform assumes that all frequency modulations are linear. For


triangular sweeps, the slope of the down sweep is the opposite of the slope of the up
sweep.

4-15
4 Waveforms, Transmitter, and Receiver

Double Triangular Sweep


This example shows how to sample an FMCW waveform with a double triangular sweep
in which the two sweeps use different slopes. The example also plots a spectrogram.

Create an FMCW waveform object in which the SweepTime and SweepBandwidth


properties are vectors of length two. For each period, the waveform alternates between
the pairs of corresponding sweep time and bandwidth values.
st = [1e-3 1.1e-3];
bw = [1e5 9e4];
h = phased.FMCWWaveform('SweepTime',st,...
'SweepBandwidth',bw,'SweepDirection','Triangle',...
'SweepInterval','Symmetric','SampleRate',2e5,...
'NumSweeps',4);

Compute samples from four sweeps (two periods). In a triangular sweep, each period
consists of an up sweep and down sweep.
x = step(h);

Plot a spectrogram.
[S,F,T] = spectrogram(x,32,16,32,h.SampleRate);
image(T,fftshift(F),fftshift(mag2db(abs(S))))
xlabel('Time'); ylabel('Frequency (Hz)');

4-16
Phase-Coded Waveforms

Phase-Coded Waveforms
In this section...
“When to Use Phase-Coded Waveforms” on page 4-17
“How to Create Phase-Coded Waveforms” on page 4-17
“Basic Radar Using Phase-Coded Waveform” on page 4-18

When to Use Phase-Coded Waveforms


Situations in which you might use a phase-coded waveform instead of another type of
waveform include:

• When a rectangular pulse cannot provide both of these characteristics:

• Short enough pulse for good range resolution


• Enough energy in the signal to detect the reflected echo at the receiver
• When two or more radar systems are close to each other and you want to reduce
interference among them.
• When digital processing suggests using a waveform with a discrete set of phases. For
example, a Barker-coded waveform is a bi-phase waveform.

Conversely, you might use another waveform instead of a phase-coded waveform in the
following situations:

• When you need to detect or track high-speed targets

Phase-coded waveforms tend to perform poorly when signals have Doppler shifts.
• When the hardware requirements for phase-coded waveforms are prohibitively
expensive

How to Create Phase-Coded Waveforms


To create a phase-coded waveform, use phased.PhaseCodedWaveform. You can
customize certain characteristics of the waveform, including:

• Type of phase code


• Number of chips
• Chip width

4-17
4 Waveforms, Transmitter, and Receiver

• Sample rate
• Pulse repetition frequency (PRF)
• Sequence index (Zadoff-Chu code only)

After you create a phased.PhaseCodedWaveform object, you can plot the waveform
using the plot method of this class. You can also generate samples of the waveform
using the step method.

For a full list of properties and methods, see the phased.PhaseCodedWaveform


reference page.

Basic Radar Using Phase-Coded Waveform


In the example in “End-to-End Radar System”, you can use a phase-coded waveform in
place of a rectangular waveform. To do so:

1 Replace the definition of hwav with the following definition.


hwav = phased.PhaseCodedWaveform('Code','Frank','NumChips',4,...
'ChipWidth',1e-6,'PRF',5e3,'OutputFormat','Pulses',...
'NumPulses',1);
2 Redefine the pulse width, tau, based on the properties of the new waveform.
tau = hwav.ChipWidth * hwav.NumChips;

For convenience, the complete code appears here. For a detailed explanation of the code,
see the original example, “End-to-End Radar System”.
hwav = phased.PhaseCodedWaveform('Code','Frank','NumChips',4,...
'ChipWidth',1e-6,'PRF',5e3,'OutputFormat','Pulses',...
'NumPulses',1);

hant = phased.IsotropicAntennaElement('FrequencyRange',...
[1e9 10e9]);

htgt = phased.RadarTarget('Model','Nonfluctuating',...
'MeanRCS',0.5,'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',4e9);

htxplat = phased.Platform('InitialPosition',[0;0;0],...
'Velocity',[0;0;0],'OrientationAxes',[1 0 0;0 1 0;0 0 1]);
htgtplat = phased.Platform('InitialPosition',[7000; 5000; 0],...
'Velocity',[-15;-10;0]);

4-18
Phase-Coded Waveforms

[tgtrng,tgtang] = rangeangle(htgtplat.InitialPosition,...
htxplat.InitialPosition);

Pd = 0.9;
Pfa = 1e-6;
numpulses = 10;
SNR = albersheim(Pd,Pfa,10);

maxrange = 1.5e4;
lambda = physconst('LightSpeed')/4e9;
tau = hwav.ChipWidth * hwav.NumChips;
Pt = radareqpow(lambda,maxrange,SNR,tau,'RCS',0.5,'Gain',20);

htx = phased.Transmitter('PeakPower',50e3,'Gain',20,...
'LossFactor',0,'InUseOutputPort',true,...
'CoherentOnTransmit',true);

hrad = phased.Radiator('Sensor',hant,...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',4e9);
hcol = phased.Collector('Sensor',hant,...
'PropagationSpeed',physconst('LightSpeed'),...
'Wavefront','Plane','OperatingFrequency',4e9);

hrec = phased.ReceiverPreamp('Gain',20,'NoiseFigure',2,...
'ReferenceTemperature',290,'SampleRate',1e6,...
'EnableInputPort',true,'SeedSource','Property','Seed',1e3);

hspace = phased.FreeSpace(...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',4e9,'TwoWayPropagation',false,...
'SampleRate',1e6);

% Time step between pulses


T = 1/hwav.PRF;
% Get antenna position
txpos = htxplat.InitialPosition;
% Allocate array for received echoes
rxsig = zeros(hwav.SampleRate*T,numpulses);

for n = 1:numpulses
% Update the target position
[tgtpos,tgtvel] = step(htgtplat,T);

4-19
4 Waveforms, Transmitter, and Receiver

% Get the range and angle to the target


[tgtrng,tgtang] = rangeangle(tgtpos,txpos);
% Generate the pulse
sig = step(hwav);
% Transmit the pulse. Output transmitter status
[sig,txstatus] = step(htx,sig);
% Radiate the pulse toward the target
sig = step(hrad,sig,tgtang);
% Propagate the pulse to the target in free space
sig = step(hspace,sig,txpos,tgtpos,[0;0;0],tgtvel);
% Reflect the pulse off the target
sig = step(htgt,sig);
% Propagate the echo to the antenna in free space
sig = step(hspace,sig,tgtpos,txpos,tgtvel,[0;0;0]);
% Collect the echo from the incident angle at the antenna
sig = step(hcol,sig,tgtang);
% Receive the echo at the antenna when not transmitting
rxsig(:,n) = step(hrec,sig,~txstatus);
end

rxsig = pulsint(rxsig,'noncoherent');
t = unigrid(0,1/hrec.SampleRate,T,'[)');
rangegates = (physconst('LightSpeed')*t)/2;
plot(rangegates,rxsig); hold on;
xlabel('Meters'); ylabel('Power');
ylim = get(gca,'YLim');
plot([tgtrng,tgtrng],[0 ylim(2)],'r');

4-20
Waveforms with Staggered PRFs

Waveforms with Staggered PRFs

In this section...
“When to Use Staggered PRFs” on page 4-21
“Linear FM Waveform with Staggered PRF” on page 4-21

When to Use Staggered PRFs


Using a nonconstant PRF has important applications in radar. This approach is called
PRF staggering, or PRI staggering.

Uses of staggered PRFs include:

• The removal of Doppler ambiguities, or blind speeds, where Doppler frequencies that
are multiples of the PRF are aliased to zero
• Mitigation of the effects of jamming

To implement a staggered PRF, configure your waveform object with a vector instead of a
scalar as the PRF property value.

Linear FM Waveform with Staggered PRF


Model a linear FM pulse waveform with two PRFs, 1 and 2 kHz. Use a linear FM pulse
with a sweep bandwidth of 200 kHz and a duration of 100 μs. The sample rate is 1 MHz.
Output 5 pulses.

prfs = [1e3 2e3];


hfm = phased.LinearFMWaveform('PRF',prfs,...
'SweepBandwidth',200e3,...
'PulseWidth',100e-6,'NumPulses',5);
wf = step(hfm);
T = length(wf)*(1/hfm.SampleRate);
t = unigrid(0,1/hfm.SampleRate,T,'[)');
plot(t.*1000,real(wf))
set(gca,'xtick',[0 1 1.5 2.5 3]);
xlabel('milliseconds');

4-21
4 Waveforms, Transmitter, and Receiver

4-22
Transmitter

Transmitter

In this section...
“Transmitter Object” on page 4-23
“Phase Noise” on page 4-25

Transmitter Object
The phased.Transmitter object enables you to model key components of the radar
equation including the peak transmit power, the transmit gain, and a system loss factor.
You can use phased.Transmitter together with radareqpow, radareqrng, and
radareqsnr, to relate the received echo power to your transmitter specifications.

While the preceding functionality is important in applications dependent on amplitude


such as signal detectability, Doppler processing depends on the phase of the complex
envelope. In order to accurately estimate the radial velocity of moving targets, it is
important that the radar operates in either a fully coherent or pseudo-coherent mode. In
the fully coherent, or coherent on transmit, mode, the phase of the transmitted pulses is
constant. Constant phase provides you with a reference to detect Doppler shifts.

A transmitter that applies a random phase to each pulse creates phase noise that can
obscure Doppler shifts. If the components of the radar do not enable you to maintain
constant phase, you can create a pseudo-coherent, or coherent on receive radar by
keeping a record of the random phase errors introduced by the transmitter. The
receiver can correct for these errors by modulation of the complex envelope. The
phased.Transmitter object enables you to model both coherent on transmit and
coherent on receive behavior.

The transmitter object has the following modifiable properties:

• PeakPower — Peak transmit power in watts


• Gain — Transmit gain in decibels
• LossFactor — Loss factor in decibels
• InUseOutputPort — Track transmitter's status. Setting this property to true
outputs a vector of 1s and 0s indicating when transmitter is on and off. In a
monostatic radar, the transmitter and receiver cannot operate simultaneously.

4-23
4 Waveforms, Transmitter, and Receiver

• CoherentOnTransmit — Preserve coherence among transmitter pulses. Setting this


property to true (the default) models the operation of a fully coherent transmitter
where the pulse-to-pulse phase is constant. Setting this property to false introduces
random phase noise from pulse to pulse and models the operation of a non-coherent
transmitter.
• PhaseNoiseOutputPort — Output the random pulse phases introduced by
non-coherent operation of the transmitter. This property only applies if the
CoherentOnTransmit property is false. By keeping a record of the random pulse
phases, you can create a pseudo-coherent, or coherent on receive radar.

Construct a transmitter with a peak transmit power of 1000 watts, a transmit gain of 20
decibels (dB), and a loss factor of 0 dB. Set the InUseOutPutPort property to true to
record the transmitter's status.

htx = phased.Transmitter('PeakPower',1e3,'Gain',20,...
'LossFactor',0,'InUseOutputPort',true)

Construct a pulse waveform for transmission. In this example, use a 100-microsecond


linear FM pulse with a bandwidth of 200 kHz. Use the default sweep direction and
sample rate. Set the PRF to 2 kHz.

hpuls = phased.LinearFMWaveform('PulseWidth',100e-6,'PRF',2e3,...
'SweepBandwidth',2e5,'OutputFormat','Pulses','NumPulses',1);

Obtain the pulse waveform using the step method of the waveform object. Transmit
the waveform using the step method of the transmitter object, hpuls. The output
is one pulse repetition interval because the NumPulses property of the waveform
object is equal to 1. The pulse waveform values are scaled based on the peak transmit
power and the ratio of the transmitter gain to loss factor. The scaling factor is
sqrt(htx.PeakPower*db2pow(htx.Gain-htx.LossFactor)).

wf = step(hpuls);
[txoutput,txstatus] = step(htx,wf);
t = unigrid(0,1/hpuls.SampleRate,1/hpuls.PRF,'[)');
subplot(211)
plot(t,real(txoutput));
axis tight; grid on; ylabel('Amplitude');
title('Transmitter Output (real part) - One PRI');
subplot(212)
plot(t,txstatus);
axis([0 t(end) 0 1.5]); xlabel('Seconds'); grid on;
ylabel('Off-On Status');

4-24
Transmitter

set(gca,'ytick',[0 1]);
title('Transmitter Status');

Phase Noise
To model a coherent on receive radar, you can set the CoherentOnTransmit property to
false and the PhaseNoiseOutputPort property to true. You can output the random
phase added to each sample with step.

To illustrate this process, the following example uses a rectangular pulse waveform
with five pulses. A random phase is added to each sample of the waveform. Compute the
phase of the output waveform and compare the phase to the phase noise returned by the
step method.

For convenience, set the gain of the transmitter to 0 dB, the peak power to 1 W, and seed
the random number generator to ensure reproducible results.

hrect = phased.RectangularWaveform('NumPulses',5);
htx = phased.Transmitter('CoherentOnTransmit',false,...
'PhaseNoiseOutputPort',true,'Gain',0,'PeakPower',1,...
'SeedSource','Property','Seed',1000);
wf = step(hrect);
[txtoutput,phnoise] = step(htx,wf);
phdeg = radtodeg(phnoise);
phdeg(phdeg>180)= phdeg(phdeg>180)-360;
plot(wf); title('Input Waveform');
axis([0 length(wf) 0 1.5]); ylabel('Amplitude');
grid on;

4-25
4 Waveforms, Transmitter, and Receiver

figure;
subplot(2,1,1)
plot(radtodeg(atan2(imag(txtoutput),real(txtoutput))))
title('Phase of the Output'); ylabel('Degrees');
axis([0 length(wf) -180 180]); grid on;
subplot(2,1,2)
plot(phdeg); title('Phase Noise'); ylabel('Degrees');
axis([0 length(wf) -180 180]); grid on;

4-26
Transmitter

The first figure shows the waveform. The phase of each pulse at the input to the
transmitter is zero. In the second figure, the top plot shows the phase of the transmitter
output waveform. The bottom plot shows the phase added to each sample. Focus on the
first 100 samples. The pulse waveform is equal to 1 for samples 1–50 and 0 for samples
51–100. The added random phase is a constant –124.7 degrees for samples 1–100, but
this affects the output only when the pulse waveform is nonzero. In the output waveform,
you see that the output waveform has a phase of –124.7 degrees for samples 1–50 and

4-27
4 Waveforms, Transmitter, and Receiver

0 for 51–100. Examining the transmitter output and phase noise for samples where the
input waveform is nonzero, you see that the phase output of step and the phase of the
transmitter output agree.

4-28
Receiver Preamp

Receiver Preamp
In this section...
“Operation of Receiver Preamp” on page 4-29
“Configuring Receiver Preamp” on page 4-29
“Model Receiver Effects on Sinusoidal Input” on page 4-30
“Model Coherent on Receive Behavior” on page 4-32

Operation of Receiver Preamp


The phased.ReceiverPreamp object enables you to model the effects of gain
and component-based noise on the signal-to-noise ratio (SNR) of received signals.
phased.ReceiverPreamp operates on baseband signals. The object is not intended to
model system effects at RF or intermediate frequency (IF) stages.

Configuring Receiver Preamp


The phased.ReceiverPreamp object has the following modifiable properties:

• EnableInputPort — A logical property that enables you to specify when the receiver
is on or off. Input the actual status of the receiver as a vector to step. This property
is useful when modeling a monostatic radar system. In a monostatic radar, it is
important to ensure the transmitter and receiver are not operating simultaneously.
See phased.Transmitter and “Transmitter” on page 4-23.
• Gain — Gain in dB
• LossFactor — Loss factor in dB.
• NoiseFigure — Receiver noise figure in dB
• ReferenceTemperature — Reference temperature of the receiver in kelvin
• EnableInputPort — Add input to specify when the receiver is active
• PhaseNoiseInputPort — Add input to specify phase noise for coherent on receive
receiver
• SeedSource — Enables you to specify the seed of the random number generator

The noise figure is a dimensionless quantity that indicates how much a receiver deviates
from an ideal receiver in terms of internal noise. An ideal receiver only produces the

4-29
4 Waveforms, Transmitter, and Receiver

expected thermal noise power for a given noise bandwidth and temperature. A noise
figure of 1 indicates that the noise power of a receiver equals the noise power of an ideal
receiver. Because an actual receiver cannot exhibit a noise power value less than an ideal
receiver, the noise figure is always greater than or equal to one. In decibels, the noise
figure must be nonnegative.

To model the effect of the receiver preamp on the signal, phased.ReceiverPreamp


computes the effective system noise temperature by taking the product of the reference
temperature and the noise figure converted to a power measurement with db2pow. See
systemp for details.

phased.ReceiverPreamp computes the noise power as the product of the Boltzmann


constant, the effective system noise temperature, and the noise bandwidth.

The additive noise for the receiver is modeled as a zero-mean complex white Gaussian
noise vector with variance equal to the noise power. The real and imaginary parts of the
noise vector each have variance equal to 1/2 the noise power.

The signal is scaled by the ratio of the receiver gain to the loss factor expressed as a
power ratio. If you express the gain and loss factor as powers by G and L respectively and
the noise power as σ2, the output is equal to :

G s
y[ n] = x[ n ] + w[ n ]
L 2

where x[n] is the complex-valued input signal and w[n] is a zero-mean complex white
Gaussian noise sequence.

Model Receiver Effects on Sinusoidal Input


Specify a phased.ReceiverPreamp System object with a gain of 20 dB, a noise figure of
5 dB, and a reference temperature of 290 degrees kelvin.

hr = phased.ReceiverPreamp('Gain',20,...
'NoiseFigure',5,'ReferenceTemperature',290,...
'SampleRate',1e6,'SeedSource','Property','Seed',1e3);

Assume a 100-Hz sine wave input with an amplitude of 1 microvolt. Because the Phased
Array System Toolbox assumes that all modeling is done at baseband, use a complex
exponential as the input to the phased.ReceiverPreamp.step method.

4-30
Receiver Preamp

t = unigrid(0,0.001,0.1,'[)');
x = 1e-6*exp(1j*2*pi*100*t).';
y = step(hr,x);

The output of the phased.ReceiverPreamp.step method is complex-valued as


expected.

Now show how the same output can produced from a multiplicative gain and additive
noise. First assume that the noise bandwidth equals the sample rate of the receiver
preamp (1 MHz). Then, the noise power is equal to:
NoiseBandwidth = hr.SampleRate;
noisepow = physconst('Boltzmann')*...
systemp(hr.NoiseFigure,hr.ReferenceTemperature)*NoiseBandwidth;

The noise power is the variance of the additive white noise. To determine the correct
amplitude scaling of the input signal, note that the gain is 20 dB. Because the loss
factor in this case is 0 dB, the scaling factor for the input signal is found by solving the
following equation for the multiplicative gain G from the gain in dB:

G = 10^(hr.Gain/20)

G =

10

The gain is 10. By scaling the input signal by a factor of ten and adding complex white
Gaussian noise with the appropriate variance, you produce an output equivalent to the
preceding call to phased.ReceiverPreamp.step (use the same seed for the random
number generation).
rng(1e3);
y1 = G*x + sqrt(noisepow/2)*(randn(size(x))+1j*randn(size(x)));

Compare a few values of y to y1.


disp(y1(1:10) - y(1:10))

0
0

4-31
4 Waveforms, Transmitter, and Receiver

0
0
0
0
0
0
0
0

Model Coherent on Receive Behavior


To model a coherent on receive monostatic radar use the EnableInputPort and
PhaseNoiseInputPort properties. In a monostatic radar, the transmitter and receiver
cannot operate simultaneously. Therefore, it is important to keep track of when the
transmitter is active so that you can disable the receiver at those times. You can input a
record of when the transmitter is active by setting the EnableInputPort to true and
providing this record to the step method.

In a coherent on receive radar, the receiver corrects for the phase noise introduced at
the transmitter by using the record of those phase errors. You can input a record of the
transmitter phase errors to step when you set the PhaseNoiseInputPort property to
true.

To illustrate this, construct a rectangular pulse waveform with five pulses. The PRF is
10 kHz and the pulse width is 50 μs. The PRI is exactly two times the pulse width so the
transmitter alternates between active and inactive time intervals of the same duration.
For convenience, set the gains on both the transmitter and receiver to 0 dB and the peak
power on the transmitter to 1 watt.

Use the PhaseNoiseOutputPort and InUseOutputPort properties on the transmitter


to record the phase noise and the status of the transmitter.

Enable the EnableInputPort and PhaseNoiseInputPort properties on the receiver


preamp to determine when the receiver is active and to correct for the phase noise
introduced at the transmitter.

Delay the output of the transmitter using delayseq to simulate the waveform arriving
at the receiver preamp when the transmitter is inactive and the receiver is active.
hrect = phased.RectangularWaveform('NumPulses',5);
htx = phased.Transmitter('CoherentOnTransmit',false,...

4-32
Receiver Preamp

'PhaseNoiseOutputPort',true,'Gain',0,'PeakPower',1,...
'SeedSource','Property','Seed',1000,'InUseOutputPort',true);
wf = step(hrect);
[txtoutput,txstatus,phnoise] = step(htx,wf);
txtoutput = delayseq(txtoutput,hrect.PulseWidth,...
hrect.SampleRate);
hrc = phased.ReceiverPreamp('Gain',0,...
'PhaseNoiseInputPort',true,'EnableInputPort',true);
y = step(hrc,txtoutput,~txstatus,phnoise);
subplot(2,1,1)
plot(real(txtoutput));
title('Delayed Transmitter Output with Phase Noise');
ylabel('Amplitude');
subplot(2,1,2)
plot(real(y));
xlabel('Samples'); ylabel('Amplitude');
title('Received Signal with Phase Correction');

4-33
4 Waveforms, Transmitter, and Receiver

Radar Equation
In this section...
“Radar Equation Theory” on page 4-34
“Link Budget Calculation Using the Radar Equation” on page 4-35
“Maximum Detectable Range for a Monostatic Radar” on page 4-36
“Output SNR at the Receiver in a Bistatic Radar” on page 4-37

Radar Equation Theory


The point target radar range equation estimates the power at the input to the receiver
for a target of a given radar cross section at a specified range. In this equation, the signal
model is assumed to be deterministic. The equation for the power at the input to the
receiver is:

PtGt Grl 2s
Pr =
( 4p ) 3 Rt2 Rr2 L

where the terms in the equation are:

• Pr — Received power in watts.


• Pt — Peak transmit power in watts.
• Gt — Transmitter gain in decibels.
• Gr — Receiver gain in decibels.
• λ — Radar operating frequency wavelength in meters.
• σ — Target's nonfluctuating radar cross section in square meters.
• L — General loss factor in decibels that accounts for both system and propagation
loss.
• Rt — Range from the transmitter to the target.
• Rr — Range from the receiver to the target. If the radar is monostatic, the transmitter
and receiver ranges are identical.

The equation for the power at the input to the receiver represents the signal term in the
signal-to-noise (SNR) ratio. To model the noise term, assume the thermal noise in the
receiver has a white noise power spectral density (PSD) given by:

4-34
Radar Equation

P( f ) = kT

where k is the Boltzmann constant and T is the effective noise temperature. The receiver
acts as a filter to shape the white noise PSD. Assume that the magnitude squared
receiver frequency response approximates a rectangular filter with bandwidth equal
to the reciprocal of the pulse duration, 1/τ. The total noise power at the output of the
receiver is:

kTFn
N=
t

where Fn is the receiver noise figure.

The product of the effective noise temperature and the receiver noise factor is referred to
as the system temperature and is denoted by Ts, so that Ts = TFn .

Using the equation for the received signal power and the output noise power, the receiver
output SNR is:

Pr Ptt Gt Grl 2s
=
N (4p ) 3 kTs Rt2 Rr2 L

Solving for the required peak transmit power:

P (4p ) 3 kTs Rt2 Rr2 L


Pt = r
Nt Gt Grl 2s

The preceding equations are implemented in the Phased Array System Toolbox by
the functions: radareqpow, radareqrng, and radareqsnr. These functions and
the equations on which they are based are valuable tools in radar system design and
analysis.

Link Budget Calculation Using the Radar Equation


This example shows how to compute the required peak transmit power using the radar
equation. You implement a noncoherent detector with a monostatic radar operating at
5 GHz. Based on the noncoherent integration of ten one-microsecond pulses, you want

4-35
4 Waveforms, Transmitter, and Receiver

to achieve a detection probability of 0.9 with a maximum false-alarm probability of 10–


6
for a target with a nonfluctuating radar cross section (RCS) of 1 m2 at 30 km. The
transmitter gain is 30 dB. Determine the required SNR at the receiver and use the radar
equation to calculate the required peak transmit power.

Use Albersheim's equation to determine the required SNR for the specified detection and
false-alarm probabilities.

Pd = 0.9;
Pfa = 1e-6;
NumPulses = 10;
SNR = albersheim(Pd,Pfa,10)

The required SNR is approximately 5 dB. Use the function radareqpow to determine the
required peak transmit power in watts.

tgtrng = 30e3; % target range in meters


lambda = 3e8/5e9; % wavelength of the operating frequency
RCS = 1; % target RCS
pulsedur = 1e-6; %pulse duration
G = 30; % transmitter and receiver gain (monostatic radar)
Pt = radareqpow(lambda,tgtrng,SNR,pulsedur,'rcs',RCS,'gain',G)

The required peak power is approximately 5.6 kW.

Maximum Detectable Range for a Monostatic Radar


Assume that the minimum detectable SNR at the receiver of a monostatic radar
operating at 1 GHz is 13 dB. Use the radar equation to determine the maximum
detectable range for a target with a nonfluctuating RCS of 0.5 m2 if the radar has a peak
transmit power of 1 MW. Assume the transmitter gain is 40 dB and the radar transmits
a pulse that is 0.5 μs in duration.

tau = 0.5e-6; % pulse duration


G = 40; % transmitter and receiver gain (monostatic radar)
RCS = 0.5; % target RCS
Pt = 1e6; %peak transmit power in watts
lambda = 3e8/1e9;
SNR = 13; % required SNR in dB
maxrng = radareqrng(lambda,SNR,Pt,tau,'rcs',RCS,'gain',G)

The maximum detectable range is approximately 345 km.

4-36
Radar Equation

Output SNR at the Receiver in a Bistatic Radar


Estimate the output SNR for a target with an RCS of 1 m2. The radar is bistatic. The
target is located 50 km from the transmitter and 75 km from the receiver. The radar
operating frequency is 10 GHz. The transmitter has a peak transmit power of 1 MW with
a gain of 40 dB. The pulse width is 1 μs. The receiver gain is 20 dB.
lambda = physconst('LightSpeed')/10e9;
tau = 1e-6;
Pt = 1e6;
TxRvRng =[50e3 75e3];
Gain = [40 20];
snr = radareqsnr(lambda,TxRvRng,Pt,tau,'Gain',Gain);

The estimated SNR is approximately 9 dB.

4-37
4-38
5

Beamforming

• “Conventional Beamforming” on page 5-2


• “Adaptive Beamforming” on page 5-7
• “Wideband Beamforming” on page 5-11
5 Beamforming

Conventional Beamforming
In this section...
“Uses for Beamformers” on page 5-2
“Support for Conventional Beamforming” on page 5-2
“Narrowband Phase Shift Beamformer with a ULA” on page 5-2

Uses for Beamformers


You can use a beamformer to spatially filter the arriving signals. Accentuating or
attenuating signals that arrive from specific directions helps you distinguish between
signals of interest and interfering signals from other directions.

Support for Conventional Beamforming


You can implement a narrowband phase shift beamformer using
phased.PhaseShiftBeamformer. When you use this object, you must specify these
aspects of the situation you are simulating:

• Sensor array
• Signal propagation speed
• System operating frequency
• Beamforming direction

For wideband beamformers, see “Wideband Beamforming” on page 5-11.

Narrowband Phase Shift Beamformer with a ULA


Construct a ULA with 10 elements. Assume the carrier frequency is 1 GHz and set the
array element spacing to be one-half the carrier frequency wavelength.
fc = 1e9;
lambda = physconst('LightSpeed')/fc;
hula = phased.ULA('NumElements',10,'ElementSpacing',lambda/2);

The ULA sensors are isotropic antenna elements (see


phased.IsotropicAntennaElement). Set the frequency range of the antenna
elements to position the carrier frequency in the middle of the operating range.

5-2
Conventional Beamforming

hula.Element.FrequencyRange = [8e8 1.2e9];

Simulate a test signal. For this example, use a simple rectangular pulse.

t = linspace(0,0.3,300)';
testsig = zeros(size(t));
testsig(201:205)= 1;

Assume the rectangular pulse is incident on the ULA from an angle of 30 degrees
azimuth and 0 degrees elevation. Use the collectPlaneWave method of the ULA object
to simulate reception of the pulse waveform from the specified angle.

angle_of_arrival = [30;0];
x = collectPlaneWave(hula,testsig,angle_of_arrival,fc);

x is a matrix with ten columns. Each column represents the received signal at one of the
array elements.

Corrupt the columns of x with complex-valued Gaussian noise. Reset the default random
number stream for reproducible results. Plot the magnitudes of the received pulses at the
first four elements of the ULA.

rng default
npower = 0.5;
x = x + sqrt(npower/2)*(randn(size(x))+1i*randn(size(x)));
subplot(221)
plot(t,abs(x(:,1))); title('Element 1 (magnitude)');
axis tight; ylabel('Magnitude');
subplot(222)
plot(t,abs(x(:,2))); title('Element 2 (magnitude)');
axis tight; ylabel('Magnitude');
subplot(223)
plot(t,abs(x(:,3))); title('Element 3 (magnitude)');
axis tight; xlabel('Seconds'); ylabel('Magnitude');
subplot(224)
plot(t,abs(x(:,4))); title('Element 4 (magnitude)');
axis tight; xlabel('Seconds'); ylabel('Magnitude');

5-3
5 Beamforming

Construct your phase-shift beamformer. Set the WeightsOutputPort property to true


to output the spatial filter weights.

hbf = phased.PhaseShiftBeamformer('SensorArray',hula,...
'OperatingFrequency',1e9,'Direction',angle_of_arrival,...
'WeightsOutputPort',true);

Apply the step method for the phase shift beamformer. The step method computes and
applies the correct weights for the specified angle. The phase-shifted outputs from the
ten array elements are then summed.

[y,w] = step(hbf,x);

Plot the magnitude of the output waveform along with the original waveform for
comparison.

figure;
subplot(211)
plot(t,abs(testsig)); axis tight;
title('Original Signal'); ylabel('Magnitude');
subplot(212)
plot(t,abs(y)); axis tight;
title('Received Signal with Beamforming');
ylabel('Magnitude'); xlabel('Seconds');

5-4
Conventional Beamforming

To examine the effect of the beamforming weights on the array response, plot the array
normalized power response both with—and without—the beamforming weights.
azang = -180:30:180;
figure;
subplot(211)
plotResponse(hula,fc,physconst('LightSpeed'));
set(gca,'xtick',azang);
title('Array Response without Beamforming Weights');
subplot(212)
plotResponse(hula,fc,physconst('LightSpeed'),'weights',w);
set(gca,'xtick',azang);
title('Array Response with Beamforming Weights');

5-5
5 Beamforming

Related Examples
• “Conventional and Adaptive Beamformers”

5-6
Adaptive Beamforming

Adaptive Beamforming
In this section...
“Benefits of Adaptive Beamforming” on page 5-7
“Support for Adaptive Beamforming” on page 5-7
“LCMV Beamformer” on page 5-7

Benefits of Adaptive Beamforming


“Narrowband Phase Shift Beamformer with a ULA” on page 5-2 uses weights chosen
independent of any data received by the array. The weights in the narrowband phase
shift beamformer steer the array response in a specified direction. However, they do not
account for any interference scenarios. As a result, these conventional beamformers are
susceptible to interference signals. Such interference signals can be a particular problem
if they occur at sidelobes of the array response.

By contrast, adaptive, or statistically optimum, beamformers can account for interference


signals. An adaptive beamformer algorithm chooses the weights based on the statistics of
the received data. For example, an adaptive beamformer can improve the SNR by using
the received data to place nulls in the array response. These nulls are placed at angles
corresponding to the interference signals.

Support for Adaptive Beamforming


Phased Array System Toolbox software provides these adaptive beamformers:

• Linearly constrained minimum variance (LCMV) beamformers


• Minimum variance distortionless response (MVDR) beamformers
• Frost beamformers

LCMV Beamformer
This example uses code from the “Narrowband Phase Shift Beamformer with a ULA” on
page 5-2 example. Execute the code from that example before you run this example.

Use phased.BarrageJammer as the interference source. Specify the barrage jammer


to have an effective radiated power of 10 W. The interference signal from the barrage

5-7
5 Beamforming

jammer is incident on the ULA at an angle of 120 degrees azimuth and 0 degrees
elevation.

hjammer = phased.BarrageJammer('ERP',10,'SamplesPerFrame',300);
jamsig = step(hjammer);
jammer_angle = [120;0];
jamsig = collectPlaneWave(hula,jamsig,jammer_angle,fc);

Add some low-level complex white Gaussian noise to simulate noise contributions not
directly associated with the jamming signal. Seed the random number generator for
reproducible results.

noisePwr = 0.00001; % noise power, 50dB SNR


rng(2008);
noise = sqrt(noisePwr/2)*...
(randn(size(jamsig))+1j*randn(size(jamsig)));
jamsig = jamsig+noise;
rxsig = x+jamsig;
[yout,w] = step(hbf,rxsig);

Implement the LCMV beamformer. Use the target-free data,jamsig, as training data.
Output the beamformer weights.

hstv = phased.SteeringVector('SensorArray',hula,...
'PropagationSpeed',physconst('LightSpeed'));
hLCMV = phased.LCMVBeamformer('DesiredResponse',1,...
'TrainingInputPort',true,'WeightsOutputPort',true);
hLCMV.Constraint = step(hstv,fc,angle_of_arrival);
hLCMV.DesiredResponse = 1;
[yLCMV,wLCMV] = step(hLCMV,rxsig,jamsig);
subplot(211)
plot(t,abs(yout)); axis tight;
title('Conventional Beamformer');
ylabel('Magnitude');
subplot(212);
plot(t,abs(yLCMV)); axis tight;
title('LCMV (Adaptive) Beamformer');
xlabel('Seconds'); ylabel('Magnitude');

5-8
Adaptive Beamforming

The adaptive beamformer significantly improves the SNR of the rectangular pulse at 0.2
s.

Plot the array normalized power response for the conventional and LCMV beamformers.

figure;
subplot(211)
plotResponse(hula,fc,physconst('LightSpeed'),'weights',w);
title('Array Response with Conventional Beamforming Weights');
subplot(212)
plotResponse(hula,fc,physconst('LightSpeed'),'weights',wLCMV);
title('Array Response with LCMV Beamforming Weights');

5-9
5 Beamforming

The LCMV beamforming weights place a null in the array response at the arrival angle
of the interference signal.

See Also
phased.FrostBeamformer | phased.LCMVBeamformer | phased.MVDRBeamformer

Related Examples
• “Conventional and Adaptive Beamformers”

5-10
Wideband Beamforming

Wideband Beamforming
In this section...
“Support for Wideband Beamforming” on page 5-11
“Time-Delay Beamforming” on page 5-11
“Visualization of Wideband Beamformer Performance” on page 5-13

Support for Wideband Beamforming


Beamforming achieved by multiplying the sensor input by a complex exponential with
the appropriate phase shift only applies for narrowband signals. In the case of wideband,
or broadband, signals, the steering vector is not a function of a single frequency.

Phased Array System Toolbox software provides conventional and adaptive wideband
beamformers. They include:

• phased.FrostBeamformer
• phased.SubbandPhaseShiftBeamformer
• phased.TimeDelayBeamformer
• phased.TimeDelayLCMVBeamformer

Time-Delay Beamforming
This example shows how to perform wideband conventional time-delay beamforming
with a microphone array.

Create an acoustic (pressure wave) chirp signal. The chirp signal has a bandwidth of 1
kHz and propagates at a speed of 340 m/s at sea level.

c = 340; % speed of sound at sea level


t = linspace(0,1,5e4)';
sig = chirp(t,0,1,1e3);

Collect the acoustic chirp with a ten-element ULA. Use omnidirectional microphone
elements spaced less than one-half the wavelength of the 50 kHz sampling frequency.
The chirp is incident on the ULA with an angle of 45 degrees azimuth and 0 degrees
elevation.

5-11
5 Beamforming

hmic = phased.OmnidirectionalMicrophoneElement(...
'FrequencyRange',[20 20e3]);
hula = phased.ULA('Element',hmic,'NumElements',10,...
'ElementSpacing',0.01);
hcol = phased.WidebandCollector('Sensor',hula,'SampleRate',5e4,...
'PropagationSpeed',c,'ModulatedInput',false);
sigang = [60; 0];
rsig = step(hcol,sig,sigang);
rsig = rsig+0.3*randn(size(rsig));

Apply a wideband conventional time-delay beamformer to improve the SNR of the


received signal.

htbf = phased.TimeDelayBeamformer('SensorArray',hula,...
'SampleRate',5e4,'PropagationSpeed',c,'Direction',sigang);
y = step(htbf,rsig);
subplot(2,1,1);
plot(t(1:5e3),real(rsig(1:5e3,5)));
title('Signal (real part) at the 5th element of the ULA');
subplot(2,1,2);
plot(t(1:5e3),real(y(1:5e3)));
title('Signal (real part) with time-delay beamforming');
xlabel('Seconds');

See “Acoustic Beamforming Using a Microphone Array” for an example of using


wideband beamforming to extract speech signals in noise.

5-12
Wideband Beamforming

Visualization of Wideband Beamformer Performance


This example shows how to plot the response of an antenna element and an array, to
help validate the performance of a beamformer. The array must maintain an acceptable
array pattern throughout the bandwidth.

Create a uniform linear array of cosine antenna elements.

c = 340;
freq = [1e3 2.75e3];
fc = 2e3;
numels = 11;
h = phased.CosineAntennaElement('FrequencyRange',freq);
ha = phased.ULA('NumElements',numels,...
'ElementSpacing',0.5*c/fc,'Element',h);

Plot the response pattern of the antenna element over a series of frequencies.

plotFreq = linspace(min(freq),max(freq),15);
figure;
plotResponse(h,plotFreq,'OverlayFreq',false);

The plot shows that the element pattern is constant over the entire bandwidth.

5-13
5 Beamforming

Plot the response pattern of the 11-element array over the same series of frequencies.

figure;
plotResponse(ha,plotFreq,c,'OverlayFreq',false);

Apply a subband phase shift beamformer to the array. The direction of interest is 30
degrees azimuth and 0 degrees elevation.

direction = [30;0];
numbands = 8;
hbf = phased.SubbandPhaseShiftBeamformer('SensorArray',ha,...
'Direction',direction,...
'OperatingFrequency',fc,'PropagationSpeed',c,...
'SampleRate',1e3,...
'WeightsOutputPort',true,'SubbandsOutputPort',true,...
'NumSubbands',numbands);
rx = ones(numbands,numels);
[y,w,centerFreq] = step(hbf,rx);

Plot the response pattern of the array again, using the weights and center frequencies
from the beamformer.

figure;
plotResponse(ha,centerFreq',c,'Weights',w,'OverlayFreq',false);

5-14
Wideband Beamforming

The plot shows the beamformed pattern at the center frequency of each subband.

Plot the response pattern at selected frequencies using a two-dimensional format.

centerFreq = fftshift(centerFreq);
w = fftshift(w,2);
idx = [1 5 8];
figure;
plotResponse(ha,centerFreq(idx)',c,'Weights',w(:,idx));
legend('Location','South')

5-15
5 Beamforming

This plot shows that the main beam direction remains constant, but the beam width
decreases with frequency.

5-16
6

Direction-of-Arrival (DOA) Estimation

• “Beamscan Direction-of-Arrival Estimation” on page 6-2


• “Super-resolution DOA Estimation” on page 6-4
6 Direction-of-Arrival (DOA) Estimation

Beamscan Direction-of-Arrival Estimation


This example shows how to use the nonparametric beamscan technique to estimate the
direction of arrival (DOA) of signals. The beamscan algorithm estimates the DOAs by
scanning the array beam over a region of interest. The algorithm computes the output
power for each beam scan angle and identifies the maxima as the DOA estimates.

Construct a ULA consisting of ten elements. Assume the carrier frequency of the
incoming narrowband sources is 1 GHz.

fc = 1e9;
lambda = physconst('LightSpeed')/fc;
hula = phased.ULA('NumElements',10,'ElementSpacing',lambda/2);
hula.Element.FrequencyRange = [8e8 1.2e9];

Assume that there is a wavefield incident on the ULA consisting of two linear FM pulses.
The DOAs of the two sources are 30 degrees azimuth and 60 degrees azimuth. Both
sources have elevation angles of zero degrees.

hwav = phased.LinearFMWaveform('SweepBandwidth',1e5,...
'PulseWidth',5e-6,'OutputFormat','Pulses','NumPulses',1);
sig1 = step(hwav);
sig2 = sig1;
ang1 = [30; 0];
ang2 = [60;0];
arraysig = collectPlaneWave(hula,[sig1 sig2],[ang1 ang2],fc);
rng default
npower = 0.01;
noise = sqrt(npower/2)*...
(randn(size(arraysig))+1i*randn(size(arraysig)));
rxsig = arraysig+noise;

Implement a beamscan DOA estimator. Output the DOA estimates, and plot the spatial
spectrum.

hbeam = phased.BeamscanEstimator('SensorArray',hula,...
'OperatingFrequency',fc,'ScanAngles',-90:90,...
'DOAOutputPort',true,'NumSignals',2);
[y,sigang] = step(hbeam,rxsig);
plotSpectrum(hbeam);

6-2
Beamscan Direction-of-Arrival Estimation

Related Examples
• “Super-resolution DOA Estimation” on page 6-4
• Direction of Arrival Estimation with Beamscan and MVDR

6-3
6 Direction-of-Arrival (DOA) Estimation

Super-resolution DOA Estimation


This example shows how to estimate angles of arrival from two separate signal sources
when both angles fall within the main lobe of the array response. In this example, a
beamscan DOA estimator cannot resolve the two sources. However, a super-resolution
DOA estimator that uses the root MUSIC algorithm can do so.

Plot the array response of the ULA used in the “Beamscan Direction-of-Arrival
Estimation” on page 6-2 example. Zoom in on the main lobe.
fc = 1e9;
lambda = physconst('LightSpeed')/fc;
hula = phased.ULA('NumElements',10,'ElementSpacing',lambda/2);
hula.Element.FrequencyRange = [8e8 1.2e9];
plotResponse(hula,fc,physconst('LightSpeed'));
axis([-25 25 -30 0]);

Receive two signal sources with DOAs separated by ten degrees.


ang1 = [30; 0];
ang2 = [40; 0];
Nsnapshots = 1000;
rng default
npower = 0.01;
rxsig = sensorsig(getElementPosition(hula)/lambda,...
Nsnapshots,[ang1 ang2],npower);

Estimate the directions of arrival using the beamscan estimator. Because both DOAs fall
inside the main lobe of the array response, the beamscan DOA estimator cannot resolve
them as separate sources.

6-4
Super-resolution DOA Estimation

hbeam = phased.BeamscanEstimator('SensorArray',hula,...
'OperatingFrequency',fc,'ScanAngles',-90:90,...
'DOAOutputPort',true,'NumSignals',2);
[~,sigang] = step(hbeam,rxsig);
figure;
plotSpectrum(hbeam);

Use a super-resolution DOA estimator, phased.RootMUSICEstimator to estimate the


two directions. This estimator offers better resolution than the nonparametric beamscan
estimator.

hroot = phased.RootMUSICEstimator('SensorArray',hula,...
'OperatingFrequency',fc,'NumSignalsSource','Property',...
'NumSignals',2,'ForwardBackwardAveraging',true);
doa_est = step(hroot,rxsig)

doa_est =

40.0091 30.0048

This estimator correctly identifies the two distinct directions of arrival.

See Also
phased.RootMUSICEstimator

Related Examples
• “Beamscan Direction-of-Arrival Estimation” on page 6-2

6-5
6 Direction-of-Arrival (DOA) Estimation

• High Resolution Direction of Arrival Estimation

6-6
7

Space-Time Adaptive Processing


(STAP)

• “Angle-Doppler Response” on page 7-2


• “Displaced Phase Center Antenna (DPCA) Pulse Canceller” on page 7-8
• “Adaptive Displaced Phase Center Antenna Pulse Canceller” on page 7-13
• “Sample Matrix Inversion (SMI) Beamformer” on page 7-18
7 Space-Time Adaptive Processing (STAP)

Angle-Doppler Response
In this section...
“Benefits of Visualizing Angle-Doppler Response” on page 7-2
“Angle-Doppler Response of a Stationary Target at a Stationary Array” on page 7-2
“Angle-Doppler Response of a Stationary Target Return at a Moving Array” on page
7-4

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 a Stationary Target at a Stationary Array


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] and has a nonfluctuating radar
cross section (RCS) of 1 square meter. Both the array and target are stationary.

The array operates at 4 GHz with elements spaced at one-half the operating wavelength.
The array transmits a rectangular pulse 2 microseconds in duration with a pulse
repetition frequency (PRF) of 5 kHz.

Construct the objects needed to simulate the target response at the array.
hant = phased.IsotropicAntennaElement...
('FrequencyRange',[8e8 5e9],'BackBaffled',true);
lambda = physconst('LightSpeed')/4e9;
hula = phased.ULA(6,'Element',hant,'ElementSpacing',lambda/2);
hwav = phased.RectangularWaveform('PulseWidth',2e-006,...
'PRF',5e3,'SampleRate',1e6,'NumPulses',1);

7-2
Angle-Doppler Response

hrad = phased.Radiator('Sensor',hula,...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',4e9);
hcol = phased.Collector('Sensor',hula,...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',4e9);
htxplat = phased.Platform('InitialPosition',[0;0;0],...
'Velocity',[0;0;0]);
htgt = phased.RadarTarget('MeanRCS',1,'Model','nonfluctuating');
htgtplat = phased.Platform('InitialPosition',[5e3; 5e3; 0],...
'Velocity',[0;0;0]);
hspace = phased.FreeSpace('OperatingFrequency',4e9,...
'TwoWayPropagation',false,'SampleRate',1e6);
hrx = phased.ReceiverPreamp('NoiseFigure',0,...
'EnableInputPort',true,'SampleRate',1e6,'Gain',40);
htx = 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 = step(hwav);
tgtloc = htgtplat.InitialPosition;
txloc = htxplat.InitialPosition;
M = hwav.SampleRate*1/PRF;
N = hula.NumElements;
rxsig = zeros(M,N,NumPulses);

for n = 1:NumPulses
% get angle to target
[~,tgtang] = rangeangle(tgtloc,txloc);
% transmit pulse
[txsig,txstatus] = step(htx,wav);
% radiate pulse
txsig = step(hrad,txsig,tgtang);
% propagate pulse to target
txsig = step(hspace,txsig,txloc,tgtloc,[0;0;0],[0;0;0]);
% reflect pulse off stationary target
txsig = step(htgt,txsig);
% propagate pulse to array
txsig = step(hspace,txsig,tgtloc,txloc,[0;0;0],[0;0;0]);
% collect pulse
rxsig(:,:,n) = step(hcol,txsig,tgtang);

7-3
7 Space-Time Adaptive Processing (STAP)

% receive pulse
rxsig(:,:,n) = step(hrx,rxsig(:,:,n),~txstatus);
end

Determine and plot the angle-Doppler response. Place the string +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*hwav.SampleRate));
snapshot = shiftdim(rxsig(tgtcell,:,:)); % Remove singleton dim
hadresp = phased.AngleDopplerResponse('SensorArray',hula,...
'OperatingFrequency',4e9, ...
'PropagationSpeed',physconst('LightSpeed'),...
'PRF',PRF, 'ElevationAngle',tgtelang);
plotResponse(hadresp,snapshot);
text(tgtazang,tgtdoppler,'+Target');

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

Angle-Doppler Response of a Stationary Target Return at a 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

7-4
Angle-Doppler Response

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 a


Stationary Target at a Stationary Array” on page 7-2, 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
htxplat 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” on page 7-8.
hant = phased.IsotropicAntennaElement...
('FrequencyRange',[8e8 5e9],'BackBaffled',true);
lambda = physconst('LightSpeed')/4e9;
hula = phased.ULA(6,'Element',hant,'ElementSpacing',lambda/2);
hwav = phased.RectangularWaveform('PulseWidth',2e-006,...
'PRF',5e3,'SampleRate',1e6,'NumPulses',1);
hrad = phased.Radiator('Sensor',hula,...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',4e9);
hcol = phased.Collector('Sensor',hula,...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',4e9);
vy = (hula.ElementSpacing*hwav.PRF)/2;
htxplat = phased.Platform('InitialPosition',[0;0;3e3],...
'Velocity',[0;vy;0]);
htgt = phased.RadarTarget('MeanRCS',1,'Model','nonfluctuating');
tgtvel = [0;0;0];
htgtplat = phased.Platform('InitialPosition',[5e3; 5e3; 0],...
'Velocity',tgtvel);
hspace = phased.FreeSpace('OperatingFrequency',4e9,...
'TwoWayPropagation',false,'SampleRate',1e6);
hrx = phased.ReceiverPreamp('NoiseFigure',0,...
'EnableInputPort',true,'SampleRate',1e6,'Gain',40);
htx = 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 = step(hwav);
tgtloc = htgtplat.InitialPosition;

7-5
7 Space-Time Adaptive Processing (STAP)

M = hwav.SampleRate*1/PRF;
N = hula.NumElements;
rxsig = zeros(M,N,NumPulses);
fasttime = unigrid(0,1/hwav.SampleRate,1/PRF,'[)');
rangebins = (physconst('LightSpeed')*fasttime)/2;

for n = 1:NumPulses
% move transmitter
[txloc,txvel] = step(htxplat,1/PRF);
% get angle to target
[~,tgtang] = rangeangle(tgtloc,txloc);
% transmit pulse
[txsig,txstatus] = step(htx,wav);
% radiate pulse
txsig = step(hrad,txsig,tgtang);
% propagate pulse to target
txsig = step(hspace,txsig,txloc,tgtloc,txvel,tgtvel);
% reflect pulse off stationary target
txsig = step(htgt,txsig);
% propagate pulse to array
txsig = step(hspace,txsig,tgtloc,txloc,tgtvel,txvel);
% collect pulse
rxsig(:,:,n) = step(hcol,txsig,tgtang);
% receive pulse
rxsig(:,:,n) = step(hrx,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 degrees
and is identical to the stationary ULA example.

Plot the angle-Doppler response.


tgtcell = val2ind(tgtrng,...
physconst('LightSpeed')/(2*hwav.SampleRate));
snapshot = shiftdim(rxsig(tgtcell,:,:)); % Remove singleton dim

7-6
Angle-Doppler Response

hadresp = phased.AngleDopplerResponse('SensorArray',hula,...
'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 degrees azimuth and the
expected Doppler shift.

7-7
7 Space-Time Adaptive Processing (STAP)

Displaced Phase Center Antenna (DPCA) Pulse Canceller


In this section...
“When to Use the DPCA Pulse Canceller” on page 7-8
“Example: DPCA Pulse Canceller for Clutter Rejection” on page 7-8

When to Use the DPCA Pulse Canceller


In a moving target indication (MTI) radar, clutter returns can make it more difficult
to detect and track the targets of interest. A rudimentary way to mitigate the effects
of clutter returns in such a system is to implement a displaced phase center antenna
(DPCA) pulse canceller on the slow-time data.

You can implement a DPCA pulse canceller with phased.DPCACanceller. This


implementation assumes that the entire array is used on transmit. On receive, the array
is divided into two subarrays. The phase centers of the subarrays are separated by twice
the distance the platform moves in one pulse repetition interval.

Applicability of DPCA Pulse Canceller

The DPCA pulse canceller is applicable when both these conditions are true:

• Clutter is stationary across pulses.


• The motion satisfies

vT = d / 2

where:

• v indicates the speed of the platform


• T represents the pulse repetition interval
• d indicates the inter-element spacing of the array

Example: DPCA Pulse Canceller for Clutter Rejection


This example implements a DPCA pulse canceller for clutter rejection. Assume you have
an airborne radar platform modeled by a six-element ULA operating at 4 GHz. The array
elements are spaced at one-half the wavelength of the 4 GHz carrier frequency. The

7-8
Displaced Phase Center Antenna (DPCA) Pulse Canceller

radar emits ten rectangular pulses two microseconds in duration with a PRF of 5 kHz.
The platform moves along the array axis with a speed equal to one-half the product of
the element spacing and the PRF. As a result, the condition in Equation 7-1 applies. The
target has a nonfluctuating RCS of 1 square meter and moves with a constant velocity
vector of [15;15;0]. The following MATLAB code constructs the required System
objects to simulate the signal received by the ULA.
PRF = 5e3;
fc = 4e9; fs = 1e6;
c = physconst('LightSpeed');
hant = phased.IsotropicAntennaElement...
('FrequencyRange',[8e8 5e9],'BackBaffled',true);
lambda = c/fc;
hula = phased.ULA(6,'Element',hant,'ElementSpacing',lambda/2);
hwav = phased.RectangularWaveform('PulseWidth',2e-6,...
'PRF',PRF,'SampleRate',fs,'NumPulses',1);
hrad = phased.Radiator('Sensor',hula,...
'PropagationSpeed',c,...
'OperatingFrequency',fc);
hcol = phased.Collector('Sensor',hula,...
'PropagationSpeed',c,...
'OperatingFrequency',fc);
vy = (hula.ElementSpacing * PRF)/2;
htxplat = phased.Platform('InitialPosition',[0;0;3e3],...
'Velocity',[0;vy;0]);
hclutter = phased.ConstantGammaClutter('Sensor',hula,...
'PropagationSpeed',hrad.PropagationSpeed,...
'OperatingFrequency',hrad.OperatingFrequency,...
'SampleRate',fs,...
'TransmitSignalInputPort',true,...
'PRF',PRF,...
'Gamma',surfacegamma('woods',hrad.OperatingFrequency),...
'EarthModel','Flat',...
'BroadsideDepressionAngle',0,...
'MaximumRange',hrad.PropagationSpeed/(2*PRF),...
'PlatformHeight',htxplat.InitialPosition(3),...
'PlatformSpeed',norm(htxplat.Velocity),...
'PlatformDirection',[90;0]);
htgt = phased.RadarTarget('MeanRCS',1,...
'Model','Nonfluctuating','OperatingFrequency',fc);
htgtplat = phased.Platform('InitialPosition',[5e3; 5e3; 0],...
'Velocity',[15;15;0]);
hspace = phased.FreeSpace('OperatingFrequency',fc,...
'TwoWayPropagation',false,'SampleRate',fs);
hrx = phased.ReceiverPreamp('NoiseFigure',0,...
'EnableInputPort',true,'SampleRate',fs,'Gain',40);
htx = phased.Transmitter('PeakPower',1e4,...
'InUseOutputPort',true,'Gain',40);

Propagate the ten rectangular pulses to and from the target, and collect the responses at
the array. Also, compute clutter echoes using the constant gamma model with a gamma
value corresponding to wooded terrain.

7-9
7 Space-Time Adaptive Processing (STAP)

NumPulses = 10;
wav = step(hwav);
M = fs/PRF;
N = hula.NumElements;
rxsig = zeros(M,N,NumPulses);
csig = zeros(M,N,NumPulses);
fasttime = unigrid(0,1/fs,1/PRF,'[)');
rangebins = (c * fasttime)/2;
hclutter.SeedSource = 'Property';
hclutter.Seed = 5;

for n = 1:NumPulses
[txloc,txvel] = step(htxplat,1/PRF); % move transmitter
[tgtloc,tgtvel] = step(htgtplat,1/PRF); % move target
[~,tgtang] = rangeangle(tgtloc,txloc); % get angle to target
[txsig1,txstatus] = step(htx,wav); % transmit pulse
csig(:,:,n) = step(hclutter,txsig1(abs(txsig1)>0)); % collect clutter
txsig = step(hrad,txsig1,tgtang); % radiate pulse
txsig = step(hspace,txsig,txloc,tgtloc,...
txvel,tgtvel); % propagate to target
txsig = step(htgt,txsig); % reflect off target
txsig = step(hspace,txsig,tgtloc,txloc,...
tgtvel,txvel); % propagate to array
rxsig(:,:,n) = step(hcol,txsig,tgtang); % collect pulse
rxsig(:,:,n) = step(hrx,rxsig(:,:,n) + csig(:,:,n),...
~txstatus); % receive pulse plus clutter return
end

Determine the target's range, range gate, and two-way Doppler shift.
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);
tgtcell = val2ind(tgtrng,c/(2 * fs));

Use noncoherent pulse integration to visualize the signal received by the ULA for the
first of the ten pulses. Mark the target's range gate with a vertical dashed line.
firstpulse = pulsint(rxsig(:,:,1),'noncoherent');
figure;
plot([tgtrng tgtrng],[0 0.1],'-.',rangebins,firstpulse);
title('Noncoherent Integration of 1st Pulse at the ULA');
xlabel('Range (m)'); ylabel('Magnitude');

7-10
Displaced Phase Center Antenna (DPCA) Pulse Canceller

The large-magnitude clutter returns obscure the presence of the target. Apply the DPCA
pulse canceller to reject the clutter.
hstap = phased.DPCACanceller('SensorArray',hula,'PRF',PRF,...
'PropagationSpeed',c,...
'OperatingFrequency',fc,...
'Direction',[0;0],'Doppler',tgtdoppler,...
'WeightsOutputPort',true);
[y,w] = step(hstap,rxsig,tgtcell);

Plot the result of applying the DPCA pulse canceller. Mark the target range gate with a
vertical dashed line.
figure;
plot([tgtrng,tgtrng],[0 3.5e-5],'-.',rangebins,abs(y));
title('DPCA Canceller Output');
xlabel('Range (m)'), ylabel('Magnitude');

7-11
7 Space-Time Adaptive Processing (STAP)

The DPCA pulse canceller has significantly rejected the clutter. As a result, the target is
visible at the expected range gate.

7-12
Adaptive Displaced Phase Center Antenna Pulse Canceller

Adaptive Displaced Phase Center Antenna Pulse Canceller


In this section...
“When to Use the Adaptive DPCA Pulse Canceller” on page 7-13
“Example: Adaptive DPCA Pulse Canceller” on page 7-13

When to Use the Adaptive DPCA Pulse Canceller


Consider an airborne radar system that needs to suppress clutter returns and possibly
jammer interference. Under any of the following conditions, you might choose an
adaptive DPCA (ADPCA) pulse canceller for suppressing these effects.

• Jamming and other interference effects are substantial. The DPCA pulse canceller
is susceptible to interference because the DPCA pulse canceller does not use the
received data.
• The sample matrix inversion (SMI) algorithm is inapplicable because of
computational expense or a rapidly changing environment.

The phased.ADPCAPulseCanceller object implements an ADPCA pulse canceller.


This pulse canceller uses the data received from two consecutive pulses to estimate the
space-time interference covariance matrix. In particular, the object lets you specify:

• The number of training cells. The algorithm uses training cells to estimate the
interference. In general, a larger number of training cells leads to a better estimate of
interference.
• The number of guard cells close to the target cells. The algorithm recognizes guard
cells to prevent target returns from contaminating the estimate of the interference.

Example: Adaptive DPCA Pulse Canceller


This example implements an adaptive DPCA pulse canceller for clutter and interference
rejection. The scenario is identical to the one in “Example: DPCA Pulse Canceller for
Clutter Rejection” on page 7-8 except that a stationary broadband barrage jammer is
added at [3.5e3; 1e3; 0]. The jammer has an effective radiated power of 1 kw.

To repeat the scenario for convenience, the airborne radar platform is a six-element
ULA operating at 4 GHz. The array elements are spaced at one-half the wavelength of
the 4 GHz carrier frequency. The radar emits ten rectangular pulses two μs in duration
with a PRF of 5 kHz. The platform is moving along the array axis with a speed equal

7-13
7 Space-Time Adaptive Processing (STAP)

to one-half the product of the element spacing and the PRF. As a result, the condition
in Equation 7-1 applies. The target has a nonfluctuating RCS of 1 square meter and is
moving with a constant velocity vector of [15;15;0].

The following commands construct the required System objects to simulate the scenario.
PRF = 5e3;
fc = 4e9; fs = 1e6;
c = physconst('LightSpeed');
hant = phased.IsotropicAntennaElement...
('FrequencyRange',[8e8 5e9],'BackBaffled',true);
lambda = c/fc;
hula = phased.ULA(6,'Element',hant,'ElementSpacing',lambda/2);
hwav = phased.RectangularWaveform('PulseWidth', 2e-6,...
'PRF',PRF,'SampleRate',fs,'NumPulses',1);
hrad = phased.Radiator('Sensor',hula,...
'PropagationSpeed',c,...
'OperatingFrequency',fc);
hcol = phased.Collector('Sensor',hula,...
'PropagationSpeed',c,...
'OperatingFrequency',fc);
vy = (hula.ElementSpacing * PRF)/2;
htxplat = phased.Platform('InitialPosition',[0;0;3e3],...
'Velocity',[0;vy;0]);
hclutter = phased.ConstantGammaClutter('Sensor',hula,...
'PropagationSpeed',hrad.PropagationSpeed,...
'OperatingFrequency',hrad.OperatingFrequency,...
'SampleRate',fs,...
'TransmitSignalInputPort',true,...
'PRF',PRF,...
'Gamma',surfacegamma('woods',hrad.OperatingFrequency),...
'EarthModel','Flat',...
'BroadsideDepressionAngle',0,...
'MaximumRange',hrad.PropagationSpeed/(2*PRF),...
'PlatformHeight',htxplat.InitialPosition(3),...
'PlatformSpeed',norm(htxplat.Velocity),...
'PlatformDirection',[90;0]);
htgt = phased.RadarTarget('MeanRCS',1,...
'Model','Nonfluctuating','OperatingFrequency',fc);
htgtplat = phased.Platform('InitialPosition',[5e3; 5e3; 0],...
'Velocity',[15;15;0]);
hjammer = phased.BarrageJammer('ERP',1e3,'SamplesPerFrame',200);
hjammerplat = phased.Platform(...
'InitialPosition',[3.5e3; 1e3; 0],'Velocity',[0;0;0]);
hspace = phased.FreeSpace('OperatingFrequency',fc,...
'TwoWayPropagation',false,'SampleRate',fs);
hrx = phased.ReceiverPreamp('NoiseFigure',0,...
'EnableInputPort',true,'SampleRate',fs,'Gain',40);
htx = phased.Transmitter('PeakPower',1e4,...
'InUseOutputPort',true,'Gain',40);

Propagate the ten rectangular pulses to and from the target and collect the responses at
the array. Compute clutter echoes using the constant gamma model with a gamma value

7-14
Adaptive Displaced Phase Center Antenna Pulse Canceller

corresponding to wooded terrain. Also, propagate the jamming signal from the jammer
location to the airborne ULA.
NumPulses = 10;
wav = step(hwav);
M = fs/PRF;
N = hula.NumElements;
rxsig = zeros(M,N,NumPulses);
csig = zeros(M,N,NumPulses);
jsig = zeros(M,N,NumPulses);
fasttime = unigrid(0,1/fs,1/PRF,'[)');
rangebins = (c * fasttime)/2;
hclutter.SeedSource = 'Property';
hclutter.Seed = 40543;
hjammer.SeedSource = 'Property';
hjammer.Seed = 96703;
hrx.SeedSource = 'Property';
hrx.Seed = 56113;
jamloc = hjammerplat.InitialPosition;

for n = 1:NumPulses
[txloc,txvel] = step(htxplat,1/PRF); % move transmitter
[tgtloc,tgtvel] = step(htgtplat,1/PRF); % move target
[~,tgtang] = rangeangle(tgtloc,txloc); % get angle to target
[txsig,txstatus] = step(htx,wav); % transmit pulse
csig(:,:,n) = step(hclutter,txsig(abs(txsig)>0)); % collect clutter

txsig = step(hrad,txsig,tgtang); % radiate pulse


txsig = step(hspace,txsig,txloc,tgtloc,...
txvel,tgtvel); % propagate pulse to target
txsig = step(htgt,txsig); % reflect off target
txsig = step(hspace,txsig,tgtloc,txloc,...
tgtvel,txvel); % propagate to array
rxsig(:,:,n) = step(hcol,txsig,tgtang); % collect pulse

jamsig = step(hjammer); % generate jammer signal


[~,jamang] = rangeangle(jamloc,txloc); % angle from jammer to transmitter
jamsig = step(hspace,jamsig,jamloc,txloc,...
[0;0;0],txvel); % propagate jammer signal
jsig(:,:,n) = step(hcol,jamsig,jamang); % collect jammer signal

rxsig(:,:,n) = step(hrx,...
rxsig(:,:,n) + csig(:,:,n) + jsig(:,:,n),...
~txstatus); % receive pulse plus clutter return plus jammer signal
end

Determine the target's range, range gate, and two-way Doppler shift.
sp = radialspeed(tgtloc, htgtplat.Velocity, ...
txloc, htxplat.Velocity);
tgtdoppler = 2*speed2dop(sp,lambda);
tgtLocation = global2localcoord(tgtloc,'rs',txloc);
tgtazang = tgtLocation(1);
tgtelang = tgtLocation(2);
tgtrng = tgtLocation(3);

7-15
7 Space-Time Adaptive Processing (STAP)

tgtcell = val2ind(tgtrng,c/(2 * fs));

Process the array responses using the nonadaptive DPCA pulse canceller. To do so,
construct the DPCA object, and apply it to the received signals.
hstap = phased.DPCACanceller('SensorArray',hula,'PRF',PRF,...
'PropagationSpeed',c,...
'OperatingFrequency',fc,...
'Direction',[0;0],'Doppler',tgtdoppler,...
'WeightsOutputPort',true);
[y,w] = step(hstap,rxsig,tgtcell);

Plot the DPCA result with the target range marked by a vertical dashed line. Notice how
the presence of the interference signal has obscured the target.
figure;
plot([tgtrng,tgtrng],[0 7e-2],'-.',rangebins,abs(y));
axis tight;
xlabel('Range (m)'), ylabel('Magnitude');
title('DPCA Canceller Output with Jamming')

Apply the adaptive DPCA pulse canceller. Use 100 training cells and 4 guard cells, two
on each side of the target range gate.
hstap = phased.ADPCACanceller('SensorArray',hula,'PRF',PRF,...
'PropagationSpeed',c,...
'OperatingFrequency',fc,...
'Direction',[0;0],'Doppler',tgtdoppler,...
'WeightsOutputPort',true,'NumGuardCells',4,...
'NumTrainingCells',100);
[y_adpca,w_adpca] = step(hstap,rxsig,tgtcell);

Plot the result with the target range marked by a vertical dashed line. Notice how the
adaptive DPCA pulse canceller enables you to detect the target in the presence of the
jamming signal.

7-16
Adaptive Displaced Phase Center Antenna Pulse Canceller

figure;
plot([tgtrng,tgtrng],[0 4e-7],'-.',rangebins,abs(y_adpca));
axis tight;
title('ADPCA Canceller Output with Jamming');
xlabel('Range (m)'), ylabel('Magnitude');

Examine the angle-Doppler response. Notice the presence of the clutter ridge in the
angle-Doppler plane and the null at the jammer’s broadside angle for all Doppler
frequencies.
hadresp = phased.AngleDopplerResponse('SensorArray',hula,...
'OperatingFrequency',fc,...
'PropagationSpeed',c,...
'PRF',PRF,'ElevationAngle',tgtelang);
figure;
plotResponse(hadresp,w_adpca);
title('Angle-Doppler Response with ADPCA Pulse Cancellation');
text(az2broadside(jamang(1),jamang(2)) + 10,...
0,'\leftarrow Interference Null')

7-17
7 Space-Time Adaptive Processing (STAP)

Sample Matrix Inversion (SMI) Beamformer


In this section...
“When to Use the SMI Beamformer” on page 7-18
“Example: Sample Matrix Inversion (SMI) Beamformer” on page 7-18

When to Use the SMI Beamformer


In situations where an airborne radar system needs to suppress clutter returns and
jammer interference, the system needs a more sophisticated algorithm than a DPCA
pulse canceller can provide. One option is the sample matrix inversion (SMI) algorithm.
SMI is the optimum STAP algorithm and is often used as a baseline for comparison with
other algorithms.

The SMI algorithm is computationally expensive and assumes a stationary environment


across many pulses. If you need to suppress clutter returns and jammer interference with
less computation, or in a rapidly changing environment, consider using an ADPCA pulse
canceller instead.

The phased.STAPSMIBeamformer object implements the SMI algorithm. In particular,


the object lets you specify:

• The number of training cells. The algorithm uses training cells to estimate the
interference. In general, a larger number of training cells leads to a better estimate of
interference.
• The number of guard cells close to the target cells. The algorithm recognizes guard
cells to prevent target returns from contaminating the estimate of the interference.

Example: Sample Matrix Inversion (SMI) Beamformer


This scenario is identical to the one presented in “Example: Adaptive DPCA Pulse
Canceller” on page 7-13. You can run the code for both examples to compare the ADPCA
pulse canceller with the SMI beamformer. The example details and code are repeated for
convenience.

To repeat the scenario for convenience, the airborne radar platform is a six-element ULA
operating at 4 GHz. The array elements are spaced at one-half the wavelength of the 4

7-18
Sample Matrix Inversion (SMI) Beamformer

GHz carrier frequency. The radar emits ten rectangular pulses two μs in duration with
a PRF of 5 kHz. The platform is moving along the array axis with a speed equal to one-
half the product of the element spacing and the PRF. The target has a nonfluctuating
RCS of 1 square meter and is moving with a constant velocity vector of [15;15;0]. A
stationary broadband barrage jammer is located at [3.5e3; 1e3; 0]. The jammer has
an effective radiated power of 1 kw.

The following commands construct the required System objects to simulate the scenario.
PRF = 5e3;
fc = 4e9; fs = 1e6;
c = physconst('LightSpeed');
hant = phased.IsotropicAntennaElement...
('FrequencyRange',[8e8 5e9],'BackBaffled',true);
lambda = c/fc;
hula = phased.ULA(6,'Element',hant,'ElementSpacing',lambda/2);
hwav = phased.RectangularWaveform('PulseWidth', 2e-6,...
'PRF',PRF,'SampleRate',fs,'NumPulses',1);
hrad = phased.Radiator('Sensor',hula,...
'PropagationSpeed',c,...
'OperatingFrequency',fc);
hcol = phased.Collector('Sensor',hula,...
'PropagationSpeed',c,...
'OperatingFrequency',fc);
vy = (hula.ElementSpacing * PRF)/2;
htxplat = phased.Platform('InitialPosition',[0;0;3e3],...
'Velocity',[0;vy;0]);
hclutter = phased.ConstantGammaClutter('Sensor',hula,...
'PropagationSpeed',hrad.PropagationSpeed,...
'OperatingFrequency',hrad.OperatingFrequency,...
'SampleRate',fs,...
'TransmitSignalInputPort',true,...
'PRF',PRF,...
'Gamma',surfacegamma('woods',hrad.OperatingFrequency),...
'EarthModel','Flat',...
'BroadsideDepressionAngle',0,...
'MaximumRange',hrad.PropagationSpeed/(2*PRF),...
'PlatformHeight',htxplat.InitialPosition(3),...
'PlatformSpeed',norm(htxplat.Velocity),...
'PlatformDirection',[90;0]);
htgt = phased.RadarTarget('MeanRCS',1,...
'Model','Nonfluctuating','OperatingFrequency',fc);
htgtplat = phased.Platform('InitialPosition',[5e3; 5e3; 0],...
'Velocity',[15;15;0]);
hjammer = phased.BarrageJammer('ERP',1e3,'SamplesPerFrame',200);
hjammerplat = phased.Platform(...
'InitialPosition',[3.5e3; 1e3; 0],'Velocity',[0;0;0]);
hspace = phased.FreeSpace('OperatingFrequency',fc,...
'TwoWayPropagation',false,'SampleRate',fs);
hrx = phased.ReceiverPreamp('NoiseFigure',0,...
'EnableInputPort',true,'SampleRate',fs,'Gain',40);
htx = phased.Transmitter('PeakPower',1e4,...
'InUseOutputPort',true,'Gain',40);

7-19
7 Space-Time Adaptive Processing (STAP)

Propagate the ten rectangular pulses to and from the target and collect the responses at
the array. Compute clutter echoes using the constant gamma model with a gamma value
corresponding to wooded terrain. Also, propagate the jamming signal from the jammer
location to the airborne ULA.
NumPulses = 10;
wav = step(hwav);
M = fs/PRF;
N = hula.NumElements;
rxsig = zeros(M,N,NumPulses);
csig = zeros(M,N,NumPulses);
jsig = zeros(M,N,NumPulses);
fasttime = unigrid(0,1/fs,1/PRF,'[)');
rangebins = (c * fasttime)/2;
hclutter.SeedSource = 'Property';
hclutter.Seed = 40543;
hjammer.SeedSource = 'Property';
hjammer.Seed = 96703;
hrx.SeedSource = 'Property';
hrx.Seed = 56113;
jamloc = hjammerplat.InitialPosition;

for n = 1:NumPulses
[txloc,txvel] = step(htxplat,1/PRF); % move transmitter
[tgtloc,tgtvel] = step(htgtplat,1/PRF); % move target
[~,tgtang] = rangeangle(tgtloc,txloc); % get angle to target
[txsig,txstatus] = step(htx,wav); % transmit pulse
csig(:,:,n) = step(hclutter,txsig(abs(txsig)>0)); % collect clutter

txsig = step(hrad,txsig,tgtang); % radiate pulse


txsig = step(hspace,txsig,txloc,tgtloc,...
txvel,tgtvel); % propagate pulse to target
txsig = step(htgt,txsig); % reflect off target
txsig = step(hspace,txsig,tgtloc,txloc,...
tgtvel,txvel); % propagate to array
rxsig(:,:,n) = step(hcol,txsig,tgtang); % collect pulse

jamsig = step(hjammer); % generate jammer signal


[~,jamang] = rangeangle(jamloc,txloc); % angle from jammer to transmitter
jamsig = step(hspace,jamsig,jamloc,txloc,...
[0;0;0],txvel); % propagate jammer signal
jsig(:,:,n) = step(hcol,jamsig,jamang); % collect jammer signal

rxsig(:,:,n) = step(hrx,...
rxsig(:,:,n) + csig(:,:,n) + jsig(:,:,n),...
~txstatus); % receive pulse plus clutter return plus jammer signal
end

Determine the target's range, range gate, and two-way Doppler shift.
sp = radialspeed(tgtloc, htgtplat.Velocity, ...
txloc, htxplat.Velocity);
tgtdoppler = 2*speed2dop(sp,lambda);
tgtLocation = global2localcoord(tgtloc,'rs',txloc);

7-20
Sample Matrix Inversion (SMI) Beamformer

tgtazang = tgtLocation(1);
tgtelang = tgtLocation(2);
tgtrng = tgtLocation(3);
tgtcell = val2ind(tgtrng,c/(2 * fs));

Construct an SMI beamformer object. Use 100 training cells, 50 on each side of the target
range gate. Use four guard cells, two range gates in front of the target cell and two range
gates beyond the target cell. Obtain the beamformer response and weights.
tgtang = [tgtazang; tgtelang];
hstap = phased.STAPSMIBeamformer('SensorArray',hula,...
'PRF',PRF,'PropagationSpeed',c,...
'OperatingFrequency',fc,...
'Direction',tgtang,'Doppler',tgtdoppler,...
'WeightsOutputPort',true,...
'NumGuardCells',4,'NumTrainingCells',100);
[y,weights] = step(hstap,rxsig,tgtcell);

Plot the resulting array output after beamforming.


figure;
plot([tgtrng,tgtrng],[0 5e-6],'-.',rangebins,abs(y));
axis tight;
title('SMI Beamformer Output');
xlabel('Range (meters)'); ylabel('Magnitude');

Plot the angle-Doppler response with the beamforming weights.


% Construct an angle-Doppler response object and apply the
% beamforming weights
hresp = phased.AngleDopplerResponse('SensorArray',hula,...
'OperatingFrequency',4e9,'PRF',PRF,...
'PropagationSpeed',physconst('LightSpeed'));
figure;
plotResponse(hresp,weights);

7-21
7 Space-Time Adaptive Processing (STAP)

title('Angle-Doppler Response with SMI Beamforming Weights');

7-22
8

Detection

• “Neyman-Pearson Hypothesis Testing” on page 8-2


• “Receiver Operating Characteristic (ROC) Curves” on page 8-6
• “Matched Filtering” on page 8-11
• “Stretch Processing” on page 8-17
• “FMCW Range Estimation” on page 8-19
• “Range-Doppler Response” on page 8-21
• “Constant False-Alarm Rate (CFAR) Detectors” on page 8-27
8 Detection

Neyman-Pearson Hypothesis Testing


In this section...
“Purpose of Hypothesis Testing” on page 8-2
“Support for Neyman-Pearson Hypothesis Testing” on page 8-2
“Threshold for Real-Valued Signal in White Gaussian Noise” on page 8-3
“Threshold for Two Pulses of Real-Valued Signal in White Gaussian Noise” on page
8-4
“Threshold for Complex-Valued Signals in Complex White Gaussian Noise” on page
8-5

Purpose of Hypothesis Testing


In phased-array applications, you sometimes need to decide between two competing
hypotheses to determine the reality underlying the data the array receives. For example,
suppose one hypothesis, called the null hypothesis, states that the observed data consists
of noise only. Suppose another hypothesis, called the alternative hypothesis, states
that the observed data consists of a deterministic signal plus noise. To decide, you
must formulate a decision rule that uses specified criteria to choose between the two
hypotheses.

Support for Neyman-Pearson Hypothesis Testing


When you use Phased Array System Toolbox software for applications such as radar and
sonar, you typically use the Neyman-Pearson (NP) optimality criterion to formulate your
hypothesis test.

When you choose the NP criterion, you can use npwgnthresh to determine the threshold
for the detection of deterministic signals in white Gaussian noise. The optimal decision
rule derives from a likelihood ratio test (LRT). An LRT chooses between the null and
alternative hypotheses based on a ratio of conditional probabilities.

npwgnthresh enables you to specify the maximum false-alarm probability as a


constraint. A false alarm means determining that the data consists of a signal plus noise,
when only noise is present.

For details about the statistical assumptions the npwgnthresh function makes, see the
reference page for that function.

8-2
Neyman-Pearson Hypothesis Testing

Threshold for Real-Valued Signal in White Gaussian Noise


This example shows how to verify the probability of false alarm empirically for a real-
valued signal in white Gaussian noise.

Determine the required signal-to-noise (SNR) in decibels for the NP detector when the
maximum tolerable false-alarm probability is 10–3.

Pfa = 1e-3;
T = npwgnthresh(Pfa,1,'real');

Determine the actual threshold corresponding to the desired false-alarm probability,


assuming the variance is 1.

variance = 1;
threshold = sqrt(variance * db2pow(T));

Verify empirically that the threshold results in the desired false-alarm probability under
the null hypothesis. To do so, generate 1 million samples of a Gaussian random variable,
and determine the proportion of samples that exceed the threshold.

rng default
N = 1e6;
x = sqrt(variance) * randn(N,1);
falsealarmrate = sum(x > threshold)/N

falsealarmrate =

9.9500e-04

Plot the first 10,000 samples and a line showing the threshold.

x1 = x(1:1e4);
plot(x1)
line([1 length(x1)],[threshold threshold],'Color','red');
xlabel('Sample'); ylabel('Value');

8-3
8 Detection

The red horizontal line in the plot indicates the threshold. You can see that few sample
values exceed the threshold. This result is expected because of the small false-alarm
probability.

Threshold for Two Pulses of Real-Valued Signal in White Gaussian Noise


This example shows how to verify the probability of false alarm empirically in a system
that uses pulse integration with two real-valued pulses. In this scenario, each sample is
the sum of two samples, one from each pulse.

Determine the required SNR for the NP detector when the maximum tolerable false-
alarm probability is 10–3.
Pfa = 1e-3;
T = npwgnthresh(Pfa,2,'real');

Generate two sets of 10,000 samples of a Gaussian random variable.


rng default
variance = 1;
N = 1e6;
puls1 = sqrt(variance)*randn(N,1);
puls2 = sqrt(variance)*randn(N,1);
intpuls = puls1 + puls2;

Compute the proportion of samples that exceed the threshold.

8-4
Neyman-Pearson Hypothesis Testing

threshold = sqrt(variance*db2pow(T));
falsealarmrate = sum(intpuls > threshold)/N

falsealarmrate =

9.8900e-04

Threshold for Complex-Valued Signals in Complex White Gaussian Noise


This example shows how to verify the probability of false alarm empirically in a system
that uses complex-valued signals. The system uses coherent detection, which means that
the system has information about the phase of the complex-valued signals.

Determine the required SNR for the NP detector in a coherent detection scheme with one
sample. Use a maximum tolerable false-alarm probability of 10–3.
Pfa = 1e-3;
T = npwgnthresh(Pfa,1,'coherent');

Test that this threshold empirically results in the correct false-alarm rate The sufficient
statistic in the complex-valued case is the real part of received sample.
rng default
variance = 1;
N = 1e6;
x = sqrt(variance/2)*(randn(N,1)+1j*randn(N,1));
threshold = sqrt(variance*db2pow(T));
falsealarmrate = sum(real(x)>threshold)/length(x)

falsealarmrate =

9.9500e-04

8-5
8 Detection

Receiver Operating Characteristic (ROC) Curves


ROC curves present graphical summaries of a detector's performance. You can generate
ROC curves using the functions rocpfa and rocsnr.

If you are interested in examining the effect of varying the false-alarm probability on the
probability of detection for a fixed SNR, you can use rocsnr.

For example, the threshold SNR for the Neyman-Pearson detector of a single sample in
real-valued Gaussian noise is approximately 13.5 dB. Use rocsnr to demonstrate how
the probability of detection varies as a function of the false-alarm rate at that SNR.

T = npwgnthresh(1e-6,1,'real');
rocsnr(T,'SignalType','real')

The ROC curve enables you to easily read off the probability of detection for a given false-
alarm rate.

You can use rocsnr to examine detector performance for different received signal types
at a fixed SNR.

SNR = 13.54;
[Pd_real,Pfa_real] = rocsnr(SNR,'SignalType','real',...
'MinPfa',1e-8);

8-6
Receiver Operating Characteristic (ROC) Curves

[Pd_coh,Pfa_coh] = rocsnr(SNR,...
'SignalType','NonfluctuatingCoherent',...
'MinPfa',1e-8);
[Pd_noncoh,Pfa_noncoh] = rocsnr(SNR,'SignalType',...
'NonfluctuatingNoncoherent','MinPfa',1e-8);
figure;
semilogx(Pfa_real,Pd_real); hold on; grid on;
semilogx(Pfa_coh,Pd_coh,'r');
semilogx(Pfa_noncoh,Pd_noncoh,'k');
xlabel('False-Alarm Probability');
ylabel('Probability of Detection');
legend('Real','Coherent','Noncoherent','location','southeast');
title('ROC Curve Comparison for Nonfluctuating RCS Target');

The ROC curves clearly demonstrate the superior probability of detection performance
for coherent and noncoherent detectors over the real-valued case.

The rocsnr function accepts an SNR vector input enabling you to quickly examine a
number of ROC curves.

SNRs = (6:2:12);
figure;
rocsnr(SNRs,'SignalType','NonfluctuatingNoncoherent');

8-7
8 Detection

The graph shows that—as the SNR increases—the supports of the probability
distributions under the null and alternative hypotheses become more disjoint. Therefore,
for a given false-alarm probability, the probability of detection increases.

You can examine the probability of detection as a function of SNR for a fixed false-alarm
probability with rocpfa.

To obtain ROC curves for a Swerling I target model at false-alarm probabilities of [1e-6
1e-4 1e-2 1e-1], enter:

Pfa = [1e-6 1e-4 1e-2 1e-1];


figure;
rocpfa(Pfa,'SignalType','Swerling1');

8-8
Receiver Operating Characteristic (ROC) Curves

Use rocpfa to examine the effect of SNR on the probability of detection for a detector
using noncoherent integration with a false-alarm probability of 1e-4. Assume the target
has a nonfluctuating RCS and that you are integrating over 5 pulses.

[Pd,SNR] = rocpfa(1e-4,...
'SignalType','NonfluctuatingNoncoherent',...
'NumPulses',5);
figure;
plot(SNR,Pd); xlabel('SNR (dB)');
ylabel('Probability of Detection'); grid on;
title('Nonfluctuating Noncoherent Detector (5 Pulses)');

8-9
8 Detection

Related Examples
• Detector Performance Analysis using ROC Curves

8-10
Matched Filtering

Matched Filtering
In this section...
“Reasons for Using Matched Filtering” on page 8-11
“Support for Matched Filtering” on page 8-11
“Matched Filtering of Linear FM Waveform” on page 8-11
“Matched Filtering to Improve SNR for Target Detection” on page 8-13

Reasons for Using Matched Filtering


You can see from the results in “Receiver Operating Characteristic (ROC) Curves”
on page 8-6 that the probability of detection increases with increasing SNR. For a
deterministic signal in white Gaussian noise, you can maximize the SNR at the receiver
by using a filter matched to the signal. The matched filter is a time-reversed and
conjugated version of the signal. The matched filter is shifted to be causal.

Support for Matched Filtering


Use phased.MatchedFilter to implement a matched filter.

When you use phased.MatchedFilter, you can customize characteristics of the


matched filter such as the matched filter coefficients and window for spectrum weighting.
If you apply spectrum weighting, you can specify the coverage region and coefficient
sample rate; Taylor, Chebyshev, and Kaiser windows have additional properties you can
specify.

Matched Filtering of Linear FM Waveform


This example shows how to compare the results of matched filtering with and without
spectrum weighting. Spectrum weighting is often used with linear FM waveforms to
reduce the sidelobes in the time domain.

Create a linear FM waveform with a duration of 0.1 milliseconds, a sweep bandwidth of


100 kHz, and a pulse repetition frequency of 5 kHz. Add noise to the linear FM pulse and
filter the noisy signal using a matched filter. This example applies a matched filter with
and without spectrum weighting.
% Specify the waveform.
hwav = phased.LinearFMWaveform('PulseWidth',1e-4,'PRF',5e3,...

8-11
8 Detection

'SampleRate',1e6,'OutputFormat','Pulses','NumPulses',1,...
'SweepBandwidth',1e5);
w = getMatchedFilter(hwav);

% Create a matched filter with no spectrum weighting, and a


% matched filter that uses a Taylor window for spectrum
% weighting.
hmf = phased.MatchedFilter('Coefficients',w);
hmf_taylor = phased.MatchedFilter('Coefficients',w,...
'SpectrumWindow','Taylor');

% Create the signal and add noise.


sig = step(hwav);
rng(17)
x = sig+0.5*(randn(length(sig),1)+1j*randn(length(sig),1));

% Filter the noisy signal separately with each of the filters.


y = step(hmf,x);
y_taylor = step(hmf_taylor,x);

% Plot the real parts of the waveform and noisy signal.


t = linspace(0,numel(sig)/hwav.SampleRate,...
hwav.SampleRate/hwav.PRF);
subplot(2,1,1);
plot(t,real(sig)); title('Input Signal');
xlim([0 max(t)]); grid on
ylabel('Amplitude');
subplot(2,1,2);
plot(t,real(x)); title('Input Signal + Noise');
xlim([0 max(t)]); grid on
xlabel('Seconds'); ylabel('Amplitude');

% Plot the magnitudes of the two matched filter outputs.


figure;
plot(t,abs(y),'b--');
title('Matched Filter Output');
xlim([0 max(t)]); grid on
hold on;
plot(t,abs(y_taylor),'r-');
ylabel('Magnitude'); xlabel('Seconds');
legend('No Spectrum Weighting','Taylor Window');
hold off;

8-12
Matched Filtering

Matched Filtering to Improve SNR for Target Detection


This example shows how to improve the SNR by performing matched filtering.

Place an isotropic antenna element at the global origin [0;0;0]. Then, place a
target with a nonfluctuating RCS of 1 square meter at [5000;5000;10], which is
approximately 7 km from the transmitter. Set the operating (carrier) frequency to
10 GHz. To simulate a monostatic radar, set the InUseOutputPort property on the
transmitter to true. Calculate the range and angle from the transmitter to the target.

8-13
8 Detection

hsensor = phased.IsotropicAntennaElement(...
'FrequencyRange',[5e9 15e9]);
htx = phased.Transmitter('Gain',20,'InUseOutputPort',true);
fc = 10e9;
htgt = phased.RadarTarget('Model','Nonfluctuating',...
'MeanRCS',1,'OperatingFrequency',fc);
txloc = [0;0;0];
tgtloc = [5000;5000;10];
htxloc = phased.Platform('InitialPosition',txloc);
htgtloc = phased.Platform('InitialPosition',tgtloc);
[tgtrng,tgtang] = rangeangle(htgtloc.InitialPosition,...
htxloc.InitialPosition);

Create a rectangular pulse waveform 25 μs in duration with a PRF of 10 kHz. Use a


single pulse for this example. Determine the maximum unambiguous range for the given
PRF. Use the radareqpow function to determine the peak power required to detect a
target. This target has an RCS of 1 square meter at the maximum unambiguous range
for the transmitter operating frequency and gain. The SNR is based on a desired false-
alarm rate of 1e-6 for a noncoherent detector.

hwav = phased.RectangularWaveform('PulseWidth',25e-6,...
'OutputFormat','Pulses','PRF',1e4,'NumPulses',1);
c = physconst('LightSpeed');
maxrange = c/(2*hwav.PRF);
SNR = npwgnthresh(1e-6,1,'noncoherent');
Pt = radareqpow(c/fc,maxrange,SNR,...
hwav.PulseWidth,'RCS',htgt.MeanRCS,'Gain',htx.Gain);

Set the peak transmit power to the output value from radareqpow.

htx.PeakPower = Pt;

Create radiator and collector objects that operate at 10 GHz. Create a free space path
for the propagation of the pulse to and from the target. Then, create a receiver and a
matched filter for the rectangular waveform.

hrad = phased.Radiator('PropagationSpeed',c,...
'OperatingFrequency',fc,'Sensor',hsensor);
hspace = phased.FreeSpace('PropagationSpeed',c,...
'OperatingFrequency',fc,'TwoWayPropagation',false);
hcol = phased.Collector('PropagationSpeed',c,...
'OperatingFrequency',fc,'Sensor',hsensor);
hrec = phased.ReceiverPreamp('NoiseFigure',0,...
'EnableInputPort',true,'SeedSource','Property','Seed',2e3);

8-14
Matched Filtering

hmf = phased.MatchedFilter(...
'Coefficients',getMatchedFilter(hwav),...
'GainOutputPort',true);

After you create all the objects that define your model, you can propagate the pulse to
and from the target. Collect the echo at the receiver, and implement the matched filter to
improve the SNR.

% Generate waveform
wf = step(hwav);
% Transmit waveform
[wf,txstatus] = step(htx,wf);
% Radiate pulse toward the target
wf = step(hrad,wf,tgtang);
% Propagate pulse toward the target
wf = step(hspace,wf,txloc,tgtloc,[0;0;0],[0;0;0]);
% Reflect it off the target
wf = step(htgt,wf);
% Propagate the pulse back to transmitter
wf = step(hspace,wf,tgtloc,txloc,[0;0;0],[0;0;0]);
% Collect the echo
wf = step(hcol,wf,tgtang);

% Receive target echo


rx_puls = step(hrec,wf,~txstatus);
[mf_puls,mfgain] = step(hmf,rx_puls);
% Get group delay of matched filter
Gd = length(hmf.Coefficients)-1;
% The group delay is constant
% Shift the matched filter output
mf_puls=[mf_puls(Gd+1:end); mf_puls(1:Gd)];
subplot(2,1,1);
t = unigrid(0,1e-6,1e-4,'[)');
rangegates = c.*t;
rangegates = rangegates/2;
plot(rangegates,abs(rx_puls)); title('Received Pulse');
ylabel('Amplitude'); hold on;
plot([tgtrng, tgtrng], [0 max(abs(rx_puls))],'r');
subplot(2,1,2)
plot(rangegates,abs(mf_puls)); title('With Matched Filtering');
xlabel('Meters'); ylabel('Amplitude'); hold on;
plot([tgtrng, tgtrng], [0 max(abs(mf_puls))],'r');

8-15
8 Detection

8-16
Stretch Processing

Stretch Processing
In this section...
“Reasons for Using Stretch Processing” on page 8-17
“Support for Stretch Processing” on page 8-17
“Stretch Processing Procedure” on page 8-17

Reasons for Using Stretch Processing


The linear FM waveform is popular in radar systems because its large time-bandwidth
product can provide good range resolution. However, the large bandwidth of this
waveform makes digital matched filtering difficult because it requires expensive, high-
quality analog-to-digital converters. Stretch processing, also known as deramping, or
dechirping, is an alternative to matched filtering. Stretch processing provides pulse
compression by looking for the return within a predefined range interval of interest.
Stretch processing typically occurs in the analog domain. Unlike matched filtering,
stretch processing reduces the bandwidth requirement of subsequent processing.

Support for Stretch Processing


The phased.StretchProcessor System object implements stretch processing. You can
use this object as part of a simulation that uses phased.LinearFMWaveform or directly
with your own data.

Stretch Processing Procedure


The typical procedure for stretch processing is as follows:

1 Choose a range interval of interest, centered on a reference range. Stretch processing


focuses on this interval instead of the entire range span that the pulse can cover.
2 Define and configure a stretch processor object. The configuration includes the
reference range, length of the range interval of interest, characteristics of the linear
FM waveform, and signal propagation speed.

• If you are using a phased.LinearFMWaveform object to implement the


linear FM waveform, use the getStretchProcessor method to define and
automatically configure a stretch processor object.

8-17
8 Detection

• Otherwise, create a phased.StretchProcessor object directly, and set its


properties as needed.
3 Perform stretch processing by calling the step method on your stretch processor
object. You provide your received signal as an input argument. The step method
generates a reference signal and correlates it with your received signal.
4 Compute a periodogram of the output from step, and identify the peak frequencies.
You can use the following features to help you perform this step:

• periodogram
• psd
• findpeaks
5 Convert each peak frequency to the corresponding range value, using the
stretchfreq2rng function.

See Also
phased.StretchProcessor | phased.LinearFMWaveform | findpeaks |
periodogram | stretchfreq2rng

Related Examples
• Range Estimation Using Stretch Processing

8-18
FMCW Range Estimation

FMCW Range Estimation


The purpose of FMCW range estimation is to estimate the range of a target. For example,
a radar for collision avoidance in an automobile needs to estimate the distance to the
nearest obstacle. FMCW range estimation algorithms can vary in the details, but the
typical high-level procedure is as follows:

1 Dechirp — Dechirp the received signal by mixing it with the transmitted signal. If
you use the dechirp function, the transmitted signal is the reference signal.
2 Find beat frequency — From the dechirped signal, extract the beat frequency
or pair of beat frequencies. If the FMCW signal has a sawtooth shape (up-sweep or
down-sweep sawtooth shape), you extract one beat frequency. If the FMCW signal
has a triangular sweep, you extract up-sweep and down-sweep beat frequencies.

Extracting beat frequencies can use a variety of algorithms. For example, you can
use the following features to help you perform this step:

• pwelch or periodogram
• psd
• findpeaks
• rootmusic
• phased.CFARDetector
3 Compute range — Use the beat frequency or frequencies to compute the
corresponding range value. The beat2range function can perform this computation.

While developing your algorithm, you might also perform these auxiliary tasks:

• Visualize targets in the range-Doppler domain, using the


phased.RangeDopplerResponse System object.
• Determine whether you need to compensate for range-Doppler coupling. Such
coupling can occur if the target is moving relative to the radar. You can use the
rdcoupling function to compute the range offset due to range-Doppler coupling. If
the range offset is not negligible, common compensation techniques include:

• Subtracting the range offset from your initial range estimate


• Having the FMCW signal use a triangle sweep instead of an up sweep or down
sweep

8-19
8 Detection

• Explore the relationships among your system’s range requirements and parameters of
the FMCW waveform. You can use these functions:

• range2time
• time2range
• range2bw

See Also
phased.FMCWWaveform | phased.RangeDopplerResponse | beat2range |
dechirp | findpeaks | periodogram | pwelch | range2beat | range2bw |
range2time | rdcoupling | rootmusic | time2range

Related Examples
• Automotive Adaptive Cruise Control Using FMCW Technology

8-20
Range-Doppler Response

Range-Doppler Response

In this section...
“Benefits of Producing Range-Doppler Response” on page 8-21
“Support for Range-Doppler Processing” on page 8-21
“Range-Speed Response Pattern of Target” on page 8-23

Benefits of Producing Range-Doppler Response


Visualizing a signal in the range-Doppler domain can help you intuitively understand
connections among targets. From a range-Doppler map, you can:

• See how far away the targets are and how quickly they are approaching or receding.
• Distinguish among targets moving at various speeds at various ranges, in particular:

• If a transmitter platform is stationary, a range-Doppler map shows a response


from stationary targets at zero Doppler.
• For targets that are moving relative to the transmitter platform, the range-
Doppler map shows a response at nonzero Doppler values.

You can also use the range-Doppler response in nonvisual ways. For example, you can
perform peak detection in the range-Doppler domain and use the information to resolve
the range-Doppler coupling of an FMCW radar system.

Support for Range-Doppler Processing


You can use the phased.RangeDopplerResponse object to compute and visualize
the range-Doppler response of input data. This object performs range processing in fast
time, followed by Doppler processing in slow time. The object configuration and syntax
typically depend on the kind of radar system.

Pulsed Radar Systems

This procedure is used typically to produce a range-Doppler response for a pulsed


radar system. (In the special case of linear FM pulses, the procedure in “FMCW Radar
Systems” on page 8-22 is an alternative option.)

8-21
8 Detection

1 Create a phased.RangeDopplerResponse object, setting the RangeMethod


property to 'Matched Filter'.
2 Customize these characteristics, or accept default values for any of them:

• Signal propagation speed


• Sample rate
• Length of the FFT for Doppler processing
• Characteristics of the window for Doppler weighting, if any
• Doppler domain output preference in terms of radial speed or Doppler shift
frequency. (If you select radial speed, also specify the signal carrier frequency.)
3 Organize your data, x, into a matrix. The columns in this matrix correspond to
separate, consecutive pulses.
4 Use plotResponse to plot the range-Doppler response or step to obtain data
representing the range-Doppler response. Include x and matched filter coefficients in
your syntax when you call plotResponse or step.

For examples, see the step reference page or “Range-Speed Response Pattern of Target”
on page 8-23.

FMCW Radar Systems

This procedure is used typically to produce a range-Doppler response for an FMCW radar
system. You can also use this procedure for a system that uses linear FM pulsed signals.
In the case of pulsed signals, you typically use stretch processing to dechirp the signal.

1 Create a phased.RangeDopplerResponse object, setting the RangeMethod


property to 'Dechirp'.
2 Customize these characteristics, or accept default values for any of them:

• Signal propagation speed


• Sample rate
• FM sweep slope
• Whether the processor should dechirp or decimate your signal
• Length of the FFT for range processing. The algorithm performs an FFT to
translate the dechirped data into the beat frequency domain, which provides
range information.
• Characteristics of the window for range weighting, if any

8-22
Range-Doppler Response

• Length of the FFT for Doppler processing


• Characteristics of the window for Doppler weighting, if any
• Doppler domain output preference in terms of radial speed or Doppler shift
frequency. (If you select radial speed, also specify the signal carrier frequency.)
3 Organize your data, x, into a matrix in which the columns correspond to sweeps or
pulses that are separate and consecutive.

In the case of an FMCW waveform with a triangle sweep, the sweeps alternate
between positive and negative slopes. However, phased.RangeDopplerResponse
is designed to process consecutive sweeps of the same slope. To apply
phased.RangeDopplerResponse for a triangle-sweep system, use one of the
following approaches:

• Specify a positive SweepSlope property value, with x corresponding to upsweeps


only. The true values of Doppler or speed are half of what step returns or
plotResponse plots.
• Specify a negative SweepSlope property value, with x corresponding to
downsweeps only. The true values of Doppler or speed are half of what step
returns or plotResponse plots.
4 Use plotResponse to plot the range-Doppler response or step to obtain data
representing the range-Doppler response. Include x in the syntax when you call
plotResponse or step. If your data is not already dechirped, also include a
reference signal in the syntax.

For an example, see the plotResponse reference page.

Range-Speed Response Pattern of Target


This example shows how to visualize the speed and range of a target in a pulsed radar
system that uses a rectangular waveform.

Place an isotropic antenna element at the global origin [0;0;0]. Then, place a
target with a nonfluctuating RCS of 1 square meter at [5000;5000;10], which is
approximately 7 km from the transmitter. Set the operating (carrier) frequency to
10 GHz. To simulate a monostatic radar, set the InUseOutputPort property on the
transmitter to true. Calculate the range and angle from the transmitter to the target.

hsensor = phased.IsotropicAntennaElement(...

8-23
8 Detection

'FrequencyRange',[5e9 15e9]);
htx = phased.Transmitter('Gain',20,'InUseOutputPort',true);
fc = 10e9;
htgt = phased.RadarTarget('Model','Nonfluctuating',...
'MeanRCS',1,'OperatingFrequency',fc);
txloc = [0;0;0];
tgtloc = [5000;5000;10];
htxloc = phased.Platform('InitialPosition',txloc);
htgtloc = phased.Platform('InitialPosition',tgtloc);
[tgtrng,tgtang] = rangeangle(htgtloc.InitialPosition,...
htxloc.InitialPosition);

Create a rectangular pulse waveform 2 μs in duration with a PRF of 10 kHz. Determine


the maximum unambiguous range for the given PRF. Use the radareqpow function to
determine the peak power required to detect a target. This target has an RCS of 1 square
meter at the maximum unambiguous range for the transmitter operating frequency and
gain. The SNR is based on a desired false-alarm rate of 1e-6 for a noncoherent detector.

hwav = phased.RectangularWaveform('PulseWidth',2e-6,...
'OutputFormat','Pulses','PRF',1e4,'NumPulses',1);
c = physconst('LightSpeed');
maxrange = c/(2*hwav.PRF);
SNR = npwgnthresh(1e-6,1,'noncoherent');
Pt = radareqpow(c/fc,maxrange,SNR,...
hwav.PulseWidth,'RCS',htgt.MeanRCS,'Gain',htx.Gain);

Set the peak transmit power to the output value from radareqpow.

htx.PeakPower = Pt;

Create radiator and collector objects that operate at 10 GHz. Create a free space path for
the propagation of the pulse to and from the target. Then, create a receiver.

hrad = phased.Radiator(...
'PropagationSpeed',c,...
'OperatingFrequency',fc,'Sensor',hsensor);
hspace = phased.FreeSpace(...
'PropagationSpeed',c,...
'OperatingFrequency',fc,'TwoWayPropagation',false);
hcol = phased.Collector(...
'PropagationSpeed',c,...
'OperatingFrequency',fc,'Sensor',hsensor);
hrec = phased.ReceiverPreamp('NoiseFigure',0,...
'EnableInputPort',true,'SeedSource','Property','Seed',2e3);

8-24
Range-Doppler Response

Propagate 25 pulses to and from the target. Collect the echoes at the receiver, and store
them in a 25-column matrix named rx_puls.

numPulses = 25;
rx_puls = zeros(100,numPulses);
for n = 1:numPulses
% Generate waveform
wf = step(hwav);
% Transmit waveform
[wf,txstatus] = step(htx,wf);
% Radiate pulse toward the target
wf = step(hrad,wf,tgtang);
% Propagate pulse toward the target
wf = step(hspace,wf,txloc,tgtloc,[0;0;0],[0;0;0]);
% Reflect it off the target
wf = step(htgt,wf);
% Propagate the pulse back to transmitter
wf = step(hspace,wf,tgtloc,txloc,[0;0;0],[0;0;0]);
% Collect the echo
wf = step(hcol,wf,tgtang);
% Receive target echo
rx_puls(:,n) = step(hrec,wf,~txstatus);
end

Create a range-Doppler response object that uses the matched filter approach. Configure
this object to show radial speed rather than Doppler frequency. Use plotResponse to
plot the range versus speed.

hrdr = phased.RangeDopplerResponse(...
'RangeMethod','Matched Filter',...
'PropagationSpeed',c,...
'DopplerOutput','Speed','OperatingFrequency',fc);
plotResponse(hrdr,rx_puls,getMatchedFilter(hwav))

8-25
8 Detection

The plot shows the stationary target at a range of approximately 7000 m.

See Also
phased.RangeDopplerResponse

Related Examples
• Automotive Adaptive Cruise Control Using FMCW Technology

8-26
Constant False-Alarm Rate (CFAR) Detectors

Constant False-Alarm Rate (CFAR) Detectors

In this section...
“Reasons for Using CFAR Detectors” on page 8-27
“Cell-Averaging CFAR Detector” on page 8-28
“Testing CFAR Detector Adaption to Noisy Input Data” on page 8-30
“Extensions of Cell-Averaging CFAR Detector” on page 8-31
“Detection Probability for CFAR Detector” on page 8-31

Reasons for Using CFAR Detectors


In the Neyman-Pearson framework, the probability of detection is maximized subject
to the constraint that the false-alarm probability does not exceed a specified level. The
false-alarm probability depends on the noise variance. Therefore, to calculate the false-
alarm probability, you must first estimate the noise variance. If the noise variance
changes, you must adjust the threshold to maintain a constant false-alarm rate. Constant
false-alarm rate detectors implement adaptive procedures that enable you to update the
threshold level of your test when the power of the interference changes.

To motivate the need for an adaptive procedure, assume a simple binary hypothesis test
where you must decide between these hypotheses for a single sample:

H0 : x[ 0 ] = w[ 0 ] w[ 0 ] ~ N ( 0,1)
H1 : x[ 0 ] = 4 + w[ 0]

Set the false-alarm rate to 0.001 and determine the threshold.

T = npwgnthresh(1e-3,1,'real');
threshold = sqrt(db2pow(T))

Check that this threshold yields the desired false-alarm rate probability, and compute
the probability of detection.

% check false-alarm probability


Pfa = 0.5*erfc(threshold/sqrt(2))
% compute probability of detection

8-27
8 Detection

Pd = 0.5*erfc((threshold-4)/sqrt(2))

Next, assume that the noise power increases by 6.02 dB, doubling the noise variance. If
your detector does not adapt to this increase in variance by determining a new threshold,
your false-alarm rate increases significantly.

Pfa = 0.5*erfc(threshold/2)

The following figure demonstrates the effect of increasing the noise variance on the false-
alarm probability for a fixed threshold.

noisevar = 1:0.1:10;
Noisepower = 10*log10(noisevar);
Pfa = 0.5*erfc(threshold./sqrt(2*noisevar));
semilogy(Noisepower,Pfa./1e-3);
grid on; title('Increase in P_{FA} due to Noise Variance');
ylabel('Increase in P_{FA} (Orders of Magnitude)');
xlabel('Noise Power Increase (dB)');

Cell-Averaging CFAR Detector


The cell-averaging CFAR detector estimates the noise variance for the range cell of
interest, or cell under test, by analyzing data from neighboring range cells designated as
training cells. The noise characteristics in the training cells are assumed to be identical
to the noise characteristics in the cell under test (CUT).

8-28
Constant False-Alarm Rate (CFAR) Detectors

This assumption is key in justifying the use of the training cells to estimate the noise
variance in the CUT. Additionally, the cell-averaging CFAR detector assumes that the
training cells do not contain any signals from targets. Thus, the data in the training cells
are assumed to consist of noise only.

To make these assumptions realistic:

• It is preferable to have some buffer, or guard cells, between the CUT and the training
cells. The buffer provided by the guard cells guards against signal leaking into the
training cells and adversely affecting the estimation of the noise variance.
• The training cells should not represent range cells too distant in range from the CUT,
as the following figure illustrates.

The optimum estimator for the noise variance depends on distributional assumptions and
the type of detector. Assume the following:

1 You are using a square-law detector.


2 You have a Gaussian, complex-valued, random variable (RV) with independent real
and imaginary parts.
3 The real and imaginary parts each have mean zero and variance equal to σ2/2.

Note: If you denote this RV by Z=U+jV, the squared magnitude |Z|2 follows an
exponential distribution with mean σ2.

If the samples in training cells are the squared magnitudes of such complex Gaussian
RVs, you can use the sample mean as an estimator of the noise variance.

8-29
8 Detection

To implement cell-averaging CFAR detection, use phased.CFARDetector. You can


customize characteristics of the detector such as the numbers of training cells and guard
cells, and the probability of false alarm.

Testing CFAR Detector Adaption to Noisy Input Data


This example shows how to create a CFAR detector and test its ability to adapt to the
statistics of input data. The test uses noise-only trials. By using the default square-law
detector, you can determine how close the empirical false-alarm rate is to the desired
false-alarm probability.

Create a CFAR detector object with two guard cells, 20 training cells, and a false-alarm
probability of 0.001. By default, this object assumes a square-law detector with no pulse
integration.
hdetector = phased.CFARDetector('NumGuardCells',2,...
'NumTrainingCells',20,'ProbabilityFalseAlarm',1e-3);

There are 10 training cells and 1 guard cell on each side of the cell under test (CUT). Set
the CUT index to 12.
CUTidx = 12;

Seed the random number generator for a reproducible set of input data.
rng(1000);

Set the noise variance to 0.25. This value corresponds to an approximate –6 dB SNR.
Generate a 23-by-10000 matrix of complex-valued, white Gaussian RVs with the specified
variance. Each row of the matrix represents 10,000 Monte Carlo trials for a single cell.
Ntrials = 1e4;
variance = 0.25;
Ncells = 23;
inputdata = sqrt(variance/2)*(randn(Ncells,Ntrials)+...
1j*randn(Ncells,Ntrials));

Because the example implements a square-law detector, take the squared magnitudes of
the elements in the data matrix.
Z = abs(inputdata).^2;

Provide the output of the square-law operator and the index of the cell under test to
CFAR detector's step method.

8-30
Constant False-Alarm Rate (CFAR) Detectors

Z_detect = step(hdetector,Z,CUTidx);

The output is a logical vector Z_detect with 10,000 elements. Sum the elements in
Z_detect and divide by the total number of trials to obtain the empirical false-alarm
rate.

Pfa = sum(Z_detect)/Ntrials

The empirical false-alarm rate is 0.0013, which corresponds closely to the desired false-
alarm rate of 0.001.

Extensions of Cell-Averaging CFAR Detector


The cell-averaging algorithm for a CFAR detector works well in many situations, but
not all. For example, when targets are closely located, cell averaging can cause a strong
target to mask a weak target nearby.phased.CFARDetector supports the CFAR
detection algorithms in the next table.

Algorithm Typical Usage


Cell-averaging CFAR Most situations
Greatest-of cell-averaging CFAR When it is important to avoid false alarms at the
edge of clutter
Smallest-of cell-averaging CFAR When targets are closely located
Order statistic CFAR Compromise between greatest-of and smallest-of
cell averaging

Detection Probability for CFAR Detector


This example shows how to compare the probability of detection resulting from two
CFAR algorithms. In this scenario, the order statistic algorithm detects a target that the
cell-averaging algorithm does not.

Create a CFAR detector that uses the cell-averaging CFAR algorithm.

Ntraining = 10;
Nguard = 2;
Pfa_goal = 0.01;
hdet = phased.CFARDetector('Method','CA',...
'NumTrainingCells',Ntraining,'NumGuardCells',Nguard,...

8-31
8 Detection

'ProbabilityFalseAlarm',Pfa_goal);

The detector has 2 guard cells, 10 training cells, and a false-alarm probability of 0.01.
This object assumes a square-law detector with no pulse integration.

Generate a vector of input data based on a complex-valued white Gaussian random


variable.
Ncells = 23;
Ntrials = 100000;
inputdata = 1/sqrt(2)*(randn(Ncells,Ntrials) + ...
1i*randn(Ncells,Ntrials));

In the input data, replace rows 8 and 12 to simulate two targets for the CFAR detector to
detect.
inputdata(8,:) = 3*exp(1i*2*pi*rand);
inputdata(12,:) = 9*exp(1i*2*pi*rand);

Because the example implements a square-law detector, take the squared magnitudes of
the elements in the input data vector.
Z = abs(inputdata).^2;

Perform the detection on rows 8 through 12.


Z_detect = step(hdet,Z,8:12);

The Z_detect matrix has five rows. The first and last rows correspond to the simulated
targets. The three middle rows correspond to noise.

Compute the probability of detection of the two targets. Also, estimate the probability of
false alarm using the noise-only rows.
Pd_1 = sum(Z_detect(1,:))/Ntrials
Pd_2 = sum(Z_detect(end,:))/Ntrials
Pfa = max(sum(Z_detect(2:end-1,:),2)/Ntrials)

Pd_1 =

Pd_2 =

8-32
Constant False-Alarm Rate (CFAR) Detectors

Pfa =

6.0000e-05

The 0 value of Pd_1 indicates that this detector does not detect the first target.

Change the CFAR detector so it uses the order statistic CFAR algorithm with a rank of 5.
release(hdet);
hdet.Method = 'OS';
hdet.Rank = 5;

Repeat the detection and probability computations.


Z_detect = step(hdet,Z,8:12);
Pd_1 = sum(Z_detect(1,:))/Ntrials
Pd_2 = sum(Z_detect(end,:))/Ntrials
Pfa = max(sum(Z_detect(2:end-1,:),2)/Ntrials)

Pd_1 =

0.5820

Pd_2 =

Pfa =

0.0066

Using the order statistic algorithm instead of the cell-averaging algorithm, the detector
detects the first target in about 58% of the trials.

8-33
8-34
9

Environment and Target Models

• “Free Space Path Loss” on page 9-2


• “Radar Target” on page 9-9
• “Clutter Modeling” on page 9-13
• “Barrage Jammer” on page 9-16
9 Environment and Target Models

Free Space Path Loss

In this section...
“Support for Modeling Propagation in Free Space” on page 9-2
“Free Space Path Loss in Decibels” on page 9-2
“Propagation of a Linear FM Pulse Waveform to and from a Target” on page 9-3
“One-Way and Two-Way Propagation” on page 9-4
“Propagation from Stationary Radar to Moving Target” on page 9-5

Support for Modeling Propagation in Free Space


Propagation environments have significant effects on the amplitude, phase, and shape
of propagating space-time wavefields. In some cases, you may want to simulate a
system that propagates narrowband signals through free space. If so, you can use the
phased.FreeSpace System object to model the range-dependent time delay, phase
shift, Doppler shift, and gain effects.

Consider this object as a point-to-point propagation channel. By setting object properties,


you can customize certain characteristics of the environment and the signals propagating
through it, including:

• Propagation speed and sampling rate of the signal you are propagating
• Signal carrier frequency
• Whether the object models one-way or two-way propagation

Each time you call step on a phased.FreeSpace object, you specify not only the signal
to propagate, but also the location and velocity of the signal origin and destination.

You can use fspl to determine the free space path loss, in decibels, for a given distance
and wavelength.

Free Space Path Loss in Decibels


Assume a transmitter is located at [1000; 250; 10] in the global coordinate system.
Assume a target is located at [3000; 750; 20]. The transmitter operates at 1 GHz.

9-2
Free Space Path Loss

Determine the free space path loss in decibels for a narrowband signal propagating to
and from the target.

[tgtrng,~] = rangeangle([3000; 750; 20],[1000; 250; 10]);


% Multiply range by two for two-way propagation
tgtrng = 2*tgtrng;
% Determine the wavelength for 1 GHz
lambda = physconst('LightSpeed')/1e9;
L = fspl(tgtrng,lambda)

The free space path loss in decibels is approximately 105 dB. You can express this value
as:

Loss = pow2db((4*pi*tgtrng/lambda)^2)

which is a direct implementation of the equation for free space path loss.

Propagation of a Linear FM Pulse Waveform to and from a Target


Construct a linear FM pulse waveform 50 ms in duration with a bandwidth of 100 kHz.
Model the range-dependent time delay and amplitude loss incurred during two-way
propagation. The pulse propagates between the transmitter located at [1000; 250;
10] and a target location of [3000; 750; 20].

hwav = phased.LinearFMWaveform('SweepBandwidth',1e5,...
'PulseWidth',5e-5,'OutputFormat','Pulses',...
'NumPulses',1,'SampleRate',1e6,'PRF',1e4);
wf = step(hwav);
hpath = phased.FreeSpace('SampleRate',1e6,...
'TwoWayPropagation',true,'OperatingFrequency',1e9);
y = step(hpath,wf,[1000; 250; 10],[3000; 750; 20],...
[0;0;0],[0;0;0]);

Plot the magnitude of the transmitted and received pulse to show the amplitude loss and
time delay. Scale the time axis in microseconds.

t = unigrid(0,1/hwav.SampleRate,1/hwav.PRF,'[)');
subplot(2,1,1)
plot(t.*1e6,abs(wf)); title('Magnitude of Transmitted Pulse');
xlabel('Microseconds'); ylabel('Magnitude');
subplot(2,1,2);
plot(t.*1e6,abs(y)); title('Magnitude of Received Pulse');

9-3
9 Environment and Target Models

xlabel('Microseconds'); ylabel('Magnitude');

The delay in the received pulse is approximately 14 μs, which is exactly what you expect
for a distance of 4.123 km at the speed of light.

One-Way and Two-Way Propagation


The TwoWayPropagation property of the phased.FreeSpace object enables you to use
the step method for one- or two-way propagation. The following example demonstrates
how to use this property for a single linear FM pulse propagated to and from a target.
The sensor is a single isotropic radiating antenna operating at 1 GHz located at [1000;
250; 10]. The target is located at [3000; 750; 20] and has a nonfluctuating RCS of
1 square meter.

The following code constructs the required objects and calculates the range and angle
from the antenna to the target.

hwav = phased.LinearFMWaveform('SweepBandwidth',1e5,...
'PulseWidth',5e-5,'OutputFormat','Pulses',...
'NumPulses',1,'SampleRate',1e6);
hant = phased.IsotropicAntennaElement(...
'FrequencyRange',[500e6 1.5e9]);
htx = phased.Transmitter('PeakPower',1e3,'Gain',20);
hrad = phased.Radiator('Sensor',hant,'OperatingFrequency',1e9);
hpath = phased.FreeSpace('SampleRate',1e6,...

9-4
Free Space Path Loss

'TwoWayPropagation',true,'OperatingFrequency',1e9);
htgt = phased.RadarTarget('MeanRCS',1,'Model','Nonfluctuating');
hcol = phased.Collector('Sensor',hant,'OperatingFrequency',1e9);
sensorpos = [3000; 750; 20];
tgtpos = [1000; 250; 10];
[tgtrng,tgtang] = rangeangle(sensorpos,tgtpos);

Because the TwoWayPropagation property is set to true, you call the step method
for the phased.FreeSpace object only once. The following code calls the step after the
pulse is radiated from the antenna and before the pulse is reflected from the target.

pulse = step(hwav); % Generate pulse


pulse = step(htx,pulse); % Transmit pulse
pulse = step(hrad,pulse,tgtang); % Radiate pulse
% Propagate pulse to and from target
pulse = step(hpath,pulse,sensorpos,tgtpos,[0;0;0],[0;0;0]);
pulse = step(htgt,pulse); % Reflect pulse
sig = step(hcol,pulse,tgtang); % Collect pulse

Alternatively, if you prefer to break up the two-way propagation into two separate calls
to the step method, you can do so by setting the TwoWayPropagation property to
false.

hpath = phased.FreeSpace('SampleRate',1e9,...
'TwoWayPropagation',false,'OperatingFrequency',1e6);

pulse = step(hwav); % Generate pulse


pulse = step(htx,pulse); % Transmit pulse
pulse = step(hrad,pulse,tgtang); % Radiate pulse
% Propagate pulse from the antenna to the target
pulse = step(hpath,pulse,sensorpos,tgtpos,[0;0;0],[0;0;0]);
pulse = step(htgt,pulse); % Reflect pulse
% Propagate pulse from the target to the antenna
pulse = step(hpath,pulse,tgtpos,sensorpos,[0;0;0],[0;0;0]);
sig = step(hcol,pulse,tgtang); % Collect pulse

Propagation from Stationary Radar to Moving Target


This example shows how to propagate a signal in free space from a stationary radar to a
moving target.

Define the signal’s sample rate, propagation speed, and carrier frequency. Define the
signal as a sinusoid of frequency 150 Hz.

9-5
9 Environment and Target Models

fs = 1000;
c = 1500;
fc = 300e3;
N = 1024;
t = (0:N-1)'/fs;
x = exp(1i*2*pi*150*t);

Assume the target is approaching the radar at 0.5 m/s, and the radar is stationary. Find
the Doppler shift that corresponds to this relative speed.

v = 0.5;
dop = speed2dop(v,c/fc)

dop =

100

Create a phased.FreeSpace object, and use it to propagate the signal from the radar to
the target. Assume the radar is at (0, 0, 0) and the target is at (100, 0, 0).

hpath = phased.FreeSpace('SampleRate',fs,...
'PropagationSpeed',c,'OperatingFrequency',fc);
origin_pos = [0;0;0]; dest_pos = [100;0;0];
origin_vel = [0;0;0]; dest_vel = [-v;0;0];
y = step(hpath,x,origin_pos,dest_pos,origin_vel,dest_vel);

Plot the spectrum of the transmitted signal. The peak at 150 Hz reflects the frequency of
the signal.

figure;
window = 64;
ovlp = 32;
[Pxx,F] = pwelch(x,window,ovlp,N,fs);
plot(F,10*log10(Pxx));
grid;
xlabel('Frequency (Hz)');
ylabel('Power/Frequency (dB/Hz)');
title('Transmitted Signal')

9-6
Free Space Path Loss

Plot the spectrum of the propagated signal. The peak at 250 Hz reflects the frequency of
the signal plus the Doppler shift of 100 Hz.

figure;
window = 64;
ovlp = 32;
[Pyy,F] = pwelch(y,window,ovlp,N,fs);
plot(F,10*log10(Pyy));
grid;
xlabel('Frequency (Hz)');
ylabel('Power/Frequency (dB/Hz)');
title('Propagated Signal');

9-7
9 Environment and Target Models

9-8
Radar Target

Radar Target
The phased.RadarTarget object models a reflected signal from a target with
nonfluctuating or fluctuating radar cross section (RCS). This object has the following
modifiable properties:

• MeanRCSSource — Source of the target's mean radar cross section


• MeanRCS — Target's mean RCS
• Model — Statistical model for the target's RCS
• PropagationSpeed — Signal propagation speed
• OperatingFrequency — Operating frequency
• SeedSource — Source of the seed for the random number generator to generate the
target's random RCS values
• Seed — Seed for the random number generator

Create a radar target with a nonfluctuating RCS of 1 square meter and an operating
frequency of 300 MHz. Specify a wave propagation speed equal to the speed of light.

hr = phased.RadarTarget('Model','nonfluctuating','MeanRCS',1,...
'PropagationSpeed',physconst('LightSpeed'),...
'OperatingFrequency',3e8);

The waveform incident on the target is scaled by the factor:

4ps
G=
l2

Here, σ represents the target mean RCS, and λ is the wavelength of the operating
frequency. Each element of the signal incident on the target is scaled by the preceding
factor.

Create a target with a nonfluctuating RCS of 1 square meter. Set the operating frequency
to 1 GHz. Set the signal incident on the target to be a vector of ones to demonstrate the
gain factor.

hr = phased.RadarTarget('MeanRCS',1,'OperatingFrequency',1e9);
x = ones(10,1);
y = step(hr,x);

9-9
9 Environment and Target Models

The output vector y is equal to 11.8245*ones(10,1). The amplitude scaling factor


equals:

lambda = hr.PropagationSpeed/hr.OperatingFrequency;
G = sqrt(4*pi*1/lambda^2)

The previous examples used nonfluctuating values for the target's RCS. This model is not
valid in many scenarios. There are several cases where the RCS exhibits relatively small
or large magnitude fluctuations. These fluctuations can occur rapidly on pulse-to-pulse,
or more slowly, on scan-to-scan time scales:

• Several small randomly distributed reflectors with no dominant reflector —


This target, at close range or when the radar uses pulse-to-pulse frequency agility,
can exhibit large magnitude rapid (pulse-to-pulse) fluctuations in the RCS. That same
complex reflector at long range with no frequency agility can exhibit large magnitude
fluctuations in the RCS over a longer time scale (scan-to-scan).
• Dominant reflector along with several small reflectors — The reflectors in this
target can exhibit small magnitude fluctuations on pulse-to-pulse or scan-to-scan time
scales, subject to:

• How rapidly the aspect changes


• Whether the radar uses frequency agility

To account for significant fluctuations in the RCS, you need to use statistical models.
The four Swerling models, described in the following table, are widely used to cover these
kinds of fluctuating-RCS cases.

Swerling Case Number Description


I Scan-to-scan decorrelation. Rayleigh/
exponential PDF — A number of randomly
distributed scatterers with no dominant
scatterer.
II Pulse-to-pulse decorrelation. Rayleigh/
exponential PDF — A number of randomly
distributed scatterers with no dominant
scatterer.
III Scan-to-scan decorrelation — Chi-square
PDF with 4 degrees of freedom. A number
of scatterers with one scatterer dominant.

9-10
Radar Target

Swerling Case Number Description


IV Pulse-to-pulse decorrelation — Chi-square
PDF with 4 degrees of freedom. A number
of scatterers with one scatterer dominant.

You can simulate a Swerling target model by setting the Model property. Use the step
method and set the UPDATERCS input argument to true or false. Setting UPDATERCS to
true updates the RCS value according to the specified probability model each time you
call step. If you set UPDATERCS to false, the previous RCS value is used.

Model Pulse Reflection from a Nonfluctuating Target

This example creates and transmits a linear FM waveform with a 1 GHz carrier
frequency. The waveform is transmitted and collected by an isotropic antenna with
a back-baffled response. The waveform propagates to and from a target with a
nonfluctuating RCS of 1 square meter. The target is located approximately 1414 meters
from the antenna at an angle of 45 degrees azimuth and 0 degrees elevation.
% Create objects and assign property values
% Isotropic antenna element
hant = phased.IsotropicAntennaElement('BackBaffled',true);
% Location of the antenna
harraypos = phased.Platform('InitialPosition',[0;0;0]);
% Location of the radar target
hrfpos = phased.Platform('InitialPosition',[1000; 1000; 0]);
% Linear FM waveform
hwav = phased.LinearFMWaveform('PulseWidth',100e-6);
% Transmitter
htx = phased.Transmitter('PeakPower',1e3,'Gain',40);
% Waveform radiator
hrad = phased.Radiator('OperatingFrequency',1e9, ...
'Sensor',hant);
% Propagation environment to and from the RadarTarget
hspace = phased.FreeSpace('OperatingFrequency',1e9,...
'TwoWayPropagation',true);
% Radar target
hr = phased.RadarTarget('MeanRCS',1,'OperatingFrequency',1e9);
% Collector
hc = phased.Collector('OperatingFrequency',1e9,...
'Sensor',hant);

% Implement system
wf = step(hwav); % generate waveform

9-11
9 Environment and Target Models

txwf = step(htx,wf); % transmit waveform


wfrad = step(hrad,txwf,[0 0]'); % radiate waveform
% propagate waveform to and from the RadarTarget
wfprop = step(hspace,wfrad,harraypos.InitialPosition,...
hrfpos.InitialPosition,[0;0;0],[0;0;0]);
wfreflect = step(hr,wfprop); % reflect waveform
wfcol = step(hc,wfreflect,[45 0]'); % collect waveform

9-12
Clutter Modeling

Clutter Modeling
In this section...
“Surface Clutter Overview” on page 9-13
“Approaches for Clutter Simulation or Analysis” on page 9-13
“Considerations for Setting Up a Constant Gamma Clutter Simulation” on page 9-14
“Related Examples” on page 9-15

Surface Clutter Overview


Surface clutter refers to reflections of a radar signal from land, sea, or the land-sea
interface. When trying to detect or track targets moving on or above the surface, you
must be able to distinguish between clutter and the targets of interest. For example, a
ground moving target indicator (GMTI) radar application should detect targets on the
ground while accounting for radar reflections from trees or houses.

If you are simulating a radar system, you might want to incorporate surface clutter into
the simulation to ensure the system can overcome the effects of surface clutter. If you are
analyzing the statistical performance of a radar system, you might want to incorporate
clutter return distributions into the analysis.

Approaches for Clutter Simulation or Analysis


Phased Array System Toolbox software offers these tools to help you incorporate surface
clutter into your simulation or analysis:

• phased.ConstantGammaClutter, a System object that simulates clutter returns


using the constant gamma model
• Utility functions to help you implement your own clutter models:

• billingsleyicm
• depressionang
• effearthradius
• grazingang
• horizonrange
• surfclutterrcs

9-13
9 Environment and Target Models

• surfacegamma

Considerations for Setting Up a Constant Gamma Clutter Simulation


When you use phased.ConstantGammaClutter, you must configure the object for the
situation you are simulating, and confirm that the assumptions the software makes are
valid for your system.

Physical Configuration Properties


The ConstantGammaClutter object has properties that correspond to physical aspects
of the situation you are modeling. These properties include:

• Propagation speed, sample rate, and pulse repetition frequency of the signal
• Operating frequency of the system
• Altitude, speed, and direction of the radar platform
• Depression angle of the broadside of the radar antenna array

Clutter-Related Properties
The object has properties that correspond to the clutter characteristics, location, and
modeling fidelity. These properties include:

• Gamma parameter that depends on the terrain type and system’s operating
frequency.
• Azimuth coverage and maximum range for the clutter simulation.
• Azimuth span of each clutter patch. The software internally divides the clutter ring
into a series of adjacent, nonoverlapping clutter patches.
• Clutter coherence time. This value indicates how frequently the software changes the
set of random numbers in the clutter simulation.

In the simulation, you can use identical random numbers over a time interval or
uncorrelated random numbers. Simulation behavior slightly differs from reality,
where a moving platform produces clutter returns that are correlated with each other
over small time intervals.

Working with Samples or Pulses


The ConstantGammaClutter object has properties that let you obtain results in a
convenient format. Using the OutputFormat property, you can choose to have the step
method produce a signal that represents:

9-14
Clutter Modeling

• A fixed number of pulses. You indicate the number of pulses using the NumPulses
property of the object.
• A fixed number of samples. You indicate the number of samples using the
NumSamples property of the object. Typically, you use the number of samples in one
pulse. In staggered PRF applications, you might find this option more convenient
because the step output always has the same matrix size.

Assumptions

The clutter simulation that ConstantGammaClutter provides is based on these


assumptions:

• The radar system is monostatic.


• The propagation is in free space.
• The terrain is homogeneous.
• The clutter patch is stationary during the coherence time. Coherence time indicates
how frequently the software changes the set of random numbers in the clutter
simulation.
• The signal is narrowband. Thus, the spatial response can be approximated by a phase
shift. Similarly, the Doppler shift can be approximated by a phase shift.
• The radar system maintains a constant height during simulation.
• The radar system maintains a constant speed during simulation.

Related Examples
• Ground Clutter Mitigation with Moving Target Indication (MTI) Radar
• Introduction to Space-Time Adaptive Processing
• “Example: DPCA Pulse Canceller for Clutter Rejection”
• “Example: Adaptive DPCA Pulse Canceller”
• “Example: Sample Matrix Inversion (SMI) Beamformer”

9-15
9 Environment and Target Models

Barrage Jammer
In this section...
“Support for Modeling Barrage Jammer” on page 9-16
“Model Real and Imaginary Parts of Barrage Jammer Output” on page 9-16
“Model Effect of Barrage Jammer on Target Echo” on page 9-17

Support for Modeling Barrage Jammer


The phased.BarrageJammer object models a broadband jammer. The output of
phased.BarrageJammer is a complex white Gaussian noise sequence. The modifiable
properties of the barrage jammer are:

• ERP — Effective radiated power in watts


• SamplesPerFrameSource — Source of number of samples per frame
• SamplesPerFrame — Number of samples per frame
• SeedSource — Source of seed for random number generator
• Seed — Seed for random number generator

The real and imaginary parts of the complex white Gaussian noise sequence each have
variance equal to 1/2 the effective radiated power in watts. Denote the effective radiated
power in watts by P. The barrage jammer output is:

w[ n] = P x[ n ] + j P y[ n]
2 2

In this equation, x[n] and y[n] are mutually uncorrelated sequences of Gaussian random
variables with zero mean and unit variance.

Model Real and Imaginary Parts of Barrage Jammer Output


Create a barrage jammer with the default effective radiated power of 5000 W. Generate
500 samples per frame.
hjam = phased.BarrageJammer('ERP',5e3,'SamplesPerFrame',500);
y = step(hjam);
subplot(2,1,1)

9-16
Barrage Jammer

hist(real(y)); title('Histogram of Real Part');


subplot(2,1,2)
hist(imag(y)); title('Histogram of Imaginary Part');
xlabel('Watts');

Model Effect of Barrage Jammer on Target Echo


This example demonstrates how to simulate the effect of a barrage jammer on a target
echo.

First, create the required objects. You need an array, a transmitter, a radiator, a target,
a jammer, a collector, and a receiver. Additionally, you need to define two propagation
paths: one from the array to the target and back, and the other path from the jammer to
the array.
hula = phased.ULA(4);
Fs = 1e6;
fc = 1e9;
hwav = phased.RectangularWaveform('PulseWidth',100e-6,...
'PRF',1e3,'NumPulses',5,'SampleRate',Fs);
htx = phased.Transmitter('PeakPower',1e4,'Gain',20,...
'InUseOutputPort',true);
hrad = phased.Radiator('Sensor',hula,'OperatingFrequency',fc);
hjammer = phased.BarrageJammer('ERP',1000,...
'SamplesPerFrame',hwav.NumPulses*hwav.SampleRate/hwav.PRF);
htarget = phased.RadarTarget('Model','Nonfluctuating',...

9-17
9 Environment and Target Models

'MeanRCS',1,'OperatingFrequency',fc);
htargetpath = phased.FreeSpace('TwoWayPropagation',true,...
'SampleRate',Fs,'OperatingFrequency', fc);
hjammerpath = phased.FreeSpace('TwoWayPropagation',false,...
'SampleRate',Fs,'OperatingFrequency', fc);
hcollector = phased.Collector('Sensor',hula,...
'OperatingFrequency',fc);
hrc = phased.ReceiverPreamp('EnableInputPort',true);

Assume that the array, target, and jammer are stationary. The array is located at the
global origin, [0;0;0]. The target is located at [1000 ;500;0], and the jammer is
located at [2000;2000;100]. Determine the directions from the array to the target and
jammer.

targetloc = [1000 ; 500; 0];


jammerloc = [2000; 2000; 100];
[~,tgtang] = rangeangle(targetloc);
[~,jamang] = rangeangle(jammerloc);

Finally, transmit the rectangular pulse waveform to the target, reflect it off the target,
and collect the echo at the array. Simultaneously, the jammer transmits a jamming
signal toward the array. The jamming signal and echo are mixed at the receiver.

% Generate waveform
wf = step(hwav);
% Transmit waveform
[wf,txstatus] = step(htx,wf);
% Radiate pulse toward the target
wf = step(hrad,wf,tgtang);
% Propagate pulse toward the target
wf = step(htargetpath,wf,[0;0;0],targetloc,[0;0;0],[0;0;0]);
% Reflect it off the target
wf = step(htarget,wf);
% Collect the echo
wf = step(hcollector,wf,tgtang);

% Generate the jamming signal


jamsig = step(hjammer);
% Propagate the jamming signal to the array
jamsig = step(hjammerpath,jamsig,jammerloc,[0;0;0],...
[0;0;0],[0;0;0]);
% Collect the jamming signal
jamsig = step(hcollector,jamsig,jamang);

9-18
Barrage Jammer

% Receive target echo alone and target echo + jamming signal


pulsewave = step(hrc, wf,~txstatus);
pulsewave_jamsig = step(hrc,wf+jamsig,~txstatus);

Plot the result, and compare it with received waveform with and without jamming.
subplot(2,1,1);
t = unigrid(0,1/Fs,size(pulsewave,1)*1/Fs,'[)');
plot(t,abs(pulsewave(:,1)));
title('Magnitudes of Pulse Waveform Without Jamming--Element 1')
ylabel('Magnitude');
subplot(2,1,2);
plot(t,abs(pulsewave_jamsig(:,1)));
title('Magnitudes of Pulse Waveform with Jamming--Element 1')
xlabel('Seconds'); ylabel('Magnitude');

9-19
9-20
10

Coordinate Systems and Motion


Modeling

• “Rectangular Coordinates” on page 10-2


• “Spherical Coordinates” on page 10-14
• “Global and Local Coordinate Systems” on page 10-22
• “Motion Modeling in Phased Array Systems” on page 10-29
• “Doppler Shift and Pulse-Doppler Processing” on page 10-34
10 Coordinate Systems and Motion Modeling

Rectangular Coordinates
In this section...
“Definitions of Coordinates” on page 10-2
“Notation for Vectors and Points” on page 10-3
“Orthogonal Basis and Euclidean Norm” on page 10-3
“Orientation of Coordinate Axes” on page 10-4
“Rotations and Rotation Matrices” on page 10-7

Definitions of Coordinates
Construct a rectangular, or Cartesian, coordinate system for three-dimensional space
by specifying three mutually orthogonal coordinate axes. The following figure shows one
possible specification of the coordinate axes.

Rectangular coordinates specify a position in space in a given coordinate system as an


ordered 3-tuple of real numbers, (x,y,z), with respect to the origin (0,0,0). Considerations
for choosing the origin are discussed in “Global and Local Coordinate Systems” on page
10-22.

You can view the 3-tuple as a point in space, or equivalently as a vector in three-
dimensional Euclidean space. Viewed as a vector space, the coordinate axes are basis

10-2
Rectangular Coordinates

vectors and the vector gives the direction to a point in space from the origin. Every vector
in space is uniquely determined by a linear combination of the basis vectors. The most
common set of basis vectors for three-dimensional Euclidean space are the standard unit
basis vectors:

{[1 0 0 ],[ 0 1 0 ],[0 0 1 ]}

Notation for Vectors and Points


In Phased Array System Toolbox software, you specify both coordinate axes and points as
column vectors.

Note: In this software, all coordinate vectors are column vectors. For convenience,
the documentation represents column vectors in the format [x y z] without transpose
notation.

Both the vector notation [x y z] and point notation (x,y,z) are used interchangeably. The
interpretation of the column vector as a vector or point depends on the context. If the
column vector specifies the axes of a coordinate system or direction, it is a vector. If the
column vector specifies coordinates, it is a point.

Orthogonal Basis and Euclidean Norm


Any three linearly independent vectors define a basis for three-dimensional space.
However, this software assumes that the basis vectors you use are orthogonal.

The standard distance measure in space is the l2 norm, or Euclidean norm. The
Euclidean norm of a vector [x y z] is defined by:

x2 + y2 + z2

The Euclidean norm gives the length of the vector measured from the origin as the
hypotenuse of a right triangle. The distance between two vectors [x0 y0 z0] and [x1 y1 z1] is:

( x0 − x1 ) 2 + ( y0 − y1) 2 + ( z0 − z1) 2

10-3
10 Coordinate Systems and Motion Modeling

Orientation of Coordinate Axes


Given an orthonormal set of basis vectors representing the coordinate axes, there are
multiple ways to orient the axes. The following figure illustrates one such orientation,
called a right-handed coordinate system. The arrows on the coordinate axes indicate the
positive directions.

If you take your right hand and point it along the positive x-axis with your palm facing
the positive y-axis and extend your thumb, your thumb indicates the positive direction of
the z-axis.

Phase Center of Array

For some array geometries, it is convenient to define the origin as the phase center of the
array. For example, create a default uniform linear array (ULA) and query the element
coordinates:

H = phased.ULA('NumElements',2,'ElementSpacing',0.5)
getElementPosition(H)

The following figure illustrates the default ULA with array elements located at ( 0, –0.25,
0) and (0, 0.25, 0).

10-4
Rectangular Coordinates

, 0)
0.25
(0,

, 0)
-0.25
(0,
x

The next example creates a uniform rectangular array (URA) with four elements:

H = phased.URA('Size',[2 2],'ElementSpacing',[0.5 0.5])


ElementLocs = getElementPosition(H)

10-5
10 Coordinate Systems and Motion Modeling

Boresight Direction

The direction that an antenna is facing when transmitting and receiving a signal
is referred to as the boresight, or look direction. The convention in this software for
specifying coordinate axes designates the positive x-axis as the boresight direction. The
following figure shows a right-handed coordinate system with the positive x-axis oriented
along the sensor boresight direction.
z

Common Boresight Direction

In ULAs and URAs, the boresight directions of all the array elements are equal. In the
case of the ULA, the y-axis is aligned with the array element apertures. This alignment
is referred to as the array axis. The array elements have a common boresight direction,
which the toolbox designates as the x-axis. The x-axis is orthogonal, or normal, to the
array axis.

In the case of the URA, the array element apertures lie in the yz plane and also exhibit
a common boresight direction. The x-axis is normal to the plane containing the array
elements. This alignment illustrates the software convention that the x-axis is the
direction normal to the array.

In the case of conformal arrays, the elements do not share a common boresight direction
and the direction normal to each element is a property of the individual array elements.

10-6
Rectangular Coordinates

Rotations and Rotation Matrices


In transforming vectors in three-dimensional space, rotation matrices are often
encountered. Rotation matrices are used in two senses: they can be used to rotate a
vector into a new position or they can be used to rotate a coordinate basis (or coordinate
system) into a new one. In this case, the vector is left alone but its components in the
new basis will be different from those in the original basis. In Euclidean space, there
are three basic rotations: one each around the x, y and z axes. Each rotation is specified
by an angle of rotation. The rotation angle is defined to be positive for a rotation that is
counterclockwise when viewed by an observer looking along the rotation axis towards the
origin. Any arbitrary rotation can be composed of a combination of these three (Euler’s
rotation theorem). For example, one can rotated a vector using a sequence of three
rotations: v ¢ = A v = Rz (g ) Ry ( b ) Rx (a ) v .

The rotation matrices that rotate a vector around the x, y, and z-axes are given by:

• Counterclockwise rotation around x-axis

È1 0 0 ˘
Í
Rx (a ) = Í0 cos a - sin a ˙˙
ÍÎ0 sin a cos a ˙˚

• Counterclockwise rotation around y-axis

È cos b 0 sin b ˘
Ry ( b ) = ÍÍ 0 1 0 ˙˙
ÍÎ - sin b 0 cos b ˙˚

• Counterclockwise rotation around z-axis

È cos g - sin g 0˘
Rz (g ) = ÍÍ sin g cos g 0 ˙˙
ÍÎ 0 0 1 ˙˚

The following three figures show what positive rotations look like for each rotation axis:

10-7
10 Coordinate Systems and Motion Modeling

10-8
Rectangular Coordinates

10-9
10 Coordinate Systems and Motion Modeling

For any rotation, there is an inverse rotation satisfying A -1 A = 1 . For example, the
inverse of the x-axis rotation matrix is obtained by changing the sign of the angle:

È1 0 0 ˘
Rx-1 (a ) Í
= Rx ( -a ) = Í0 cos a sin a ˙˙ = R¢x (a )
ÍÎ0 - sin a cos a ˙˚

This example illustrates a basic property: the inverse rotation matrix equals the
transpose of the original. Rotation matrices satisfy A’A = 1, and consequently det(A) = 1.
Under rotations, vector lengths are preserved as well as the angles between vectors.

We can think of rotations in another way. Consider the original set of basis vectors,
i, j, k , and rotate them all using the rotation matrix A. This produces a new set of basis

vectors i¢ , j,¢ k¢ related to the original by:

10-10
Rectangular Coordinates

i¢ = Ai
j¢ = Aj
k ¢ = Ak

The new basis vectors can be written as linear combinations of the old ones and involve
the transpose:

È i¢ ˘ Èi ˘
Í j¢ ˙ = A ¢ Í j ˙
Í ˙ Í ˙
ÍÎk ¢˙˚ ÍÎk ˙˚

Now any vector can be written as a linear combination of either set of basis vectors:

v = vx i + v y j + vzk = v¢x i ¢ + v¢y j¢ + v¢z k¢

Using some algebraic manipulation, one can derive the transformation of components for
a fixed vector when the basis (or coordinate system) rotates

Èv¢x ˘ È vx ˘ È vx ˘
Í ˙ -1 Í ˙ Í ˙
Ív¢y ˙ = A Í vy ˙ = A ¢ Ív y ˙
Í v¢ ˙ Ív ˙ Ív ˙
Î z˚ Î z˚ Î z˚

Thus the change in components of a vector when the coordinate system rotates involves
the transpose of the rotation matrix. The next figure illustrates how a vector stays fixed
as the coordinate system rotates around the x-axis. The figure after shows how this can
be interpreted as a rotation of the vector in the opposite direction.

10-11
10 Coordinate Systems and Motion Modeling

10-12
Rectangular Coordinates

More About
• “Global and Local Coordinate Systems” on page 10-22

10-13
10 Coordinate Systems and Motion Modeling

Spherical Coordinates
In this section...
“Support for Spherical Coordinates” on page 10-14
“Azimuth and Elevation Angles” on page 10-14
“Phi and Theta Angles” on page 10-15
“U and V Coordinates” on page 10-16
“Conversion Between Rectangular and Spherical Coordinates” on page 10-17
“Broadside Angle” on page 10-18

Support for Spherical Coordinates


Spherical coordinates describe a vector or point in space with a distance and two angles.
The distance, R, is the usual Euclidean norm. There are multiple conventions regarding
the specification of the two angles. They include:

• Azimuth and elevation angles


• Phi and theta angles
• u and v coordinates

Phased Array System Toolbox software natively supports the azimuth/elevation


representation. The software also provides functions for converting between the azimuth/
elevation representation and the other representations. See “Phi and Theta Angles” on
page 10-15 and “U and V Coordinates” on page 10-16.

Azimuth and Elevation Angles


In Phased Array System Toolbox software, the predominant convention for spherical
coordinates is as follows:

• Use the azimuth angle, az, and the elevation angle, el, to define the location of a point
on the unit sphere.
• Specify all angles in degrees.
• List coordinates in the sequence (az,el,R).

The azimuth angle is the angle from the positive x-axis toward the positive y-axis, to the
vector’s orthogonal projection onto the xy plane. The azimuth angle is between –180 and

10-14
Spherical Coordinates

180 degrees. The elevation angle is the angle from the vector’s orthogonal projection onto
the xy plane toward the positive z-axis, to the vector. The elevation angle is between –90
and 90 degrees. These definitions assume the boresight direction is the positive x-axis.

Note: The elevation angle is sometimes defined in the literature as the angle a vector
makes with the positive z-axis. The MATLAB and Phased Array System Toolbox
products do not use this definition.

This figure illustrates the azimuth angle and elevation angle for a vector that appears
as a green solid line. The coordinate system is relative to the center of a uniform linear
array, whose elements appear as blue circles.

Phi and Theta Angles


As an alternative to azimuth and elevation angles, you can use angles denoted by φ and θ
to express the location of a point on the unit sphere. To convert the φ/θ representation to
and from the corresponding azimuth/elevation representation, use coordinate conversion
functions, phitheta2azel and azel2phitheta.

The φ angle is the angle from the positive y-axis toward the positive z-axis, to the vector’s
orthogonal projection onto the yz plane. The φ angle is between 0 and 360 degrees. The θ
angle is the angle from the x-axis toward the yz plane, to the vector itself. The θ angle is
between 0 and 180 degrees.

10-15
10 Coordinate Systems and Motion Modeling

The figure illustrates φ and θ for a vector that appears as a green solid line. The
coordinate system is relative to the center of a uniform linear array, whose elements
appear as blue circles.

The coordinate transformations between φ/θ and az/el are described by the following
equations

sin( el) = sin f sinq


tan(az ) = cos f tanq

cosq = cos(el) cos(az)


tan f = tan (el) / sin(az)

U and V Coordinates
In radar applications, it is often useful to parameterize the hemisphere x ≥ 0 using
coordinates denoted by u and v.

• To convert the φ/θ representation to and from the corresponding u/v representation,
use coordinate conversion functions phitheta2uv and uv2phitheta.
• To convert the azimuth/elevation representation to and from the corresponding u/v
representation, use coordinate conversion functions azel2uv and uv2azel.

You can define u and v in terms of φ and θ:

10-16
Spherical Coordinates

u = sin q cos f
v = sin q sin f

In these expressions, φ and θ are the phi and theta angles, respectively.

In terms of azimuth and elevation, the u and v coordinates are

u = cos el sin az
v = sin el

The values of u and v satisfy the inequalities


-1 £ u £ 1
-1 £ v £ 1
u2 + v2 £ 1

Conversely, the phi and theta angles can be written in terms of u and v using

tan f = u / v

sin q = u2 + v2

The azimuth and elevation angles can also be written in terms of u and v

sin el = v
u
tan az =
1 - u2 - v2

Conversion Between Rectangular and Spherical Coordinates


The following equations define the relationships between rectangular coordinates and the
(az,el,R) representation used in Phased Array System Toolbox software.

To convert rectangular coordinates to (az,el,R):

R= x2 + y2 + z2
az = tan -1 ( y / x)

el = tan-1 ( z / x2 + y2 )

10-17
10 Coordinate Systems and Motion Modeling

To convert (az,el,R) to rectangular coordinates:

x = R cos( el ) cos( az)


y = R cos( el) sin( az)
z = R sin(el)

When specifying a target’s location with respect to a phased array, it is common to refer
to its distance and direction from the array. The distance from the array corresponds to R
in spherical coordinates. The direction corresponds to the azimuth and elevation angles.

Tip To convert between rectangular coordinates and (az,el,R), use the MATLAB functions
cart2sph and sph2cart. These functions specify angles in radians. To convert between
degrees and radians, use degtorad and radtodeg.

Broadside Angle
The special case of the uniform linear arrays (ULA) uses the concept of the broadside
angle. The broadside angle is the angle measured from array normal direction projected
onto the plane determined by the signal incident direction and the array axis to the
signal incident direction. Broadside angles assume values in the interval [–90,90]
degrees. The following figure illustrates the definition of the broadside angle.

The shaded gray area in the figure is the plane determined by the signal incident
direction and the array axis. The broadside angle is positive when measured toward the

10-18
Spherical Coordinates

positive direction of the array axis. A number of algorithms for ULAs use the broadside
angle instead of the azimuth and elevation angles. The algorithms do so because the
broadside angle more accurately describes the ability to discern direction of arrival with
this geometry.

Phased Array System Toolbox software provides functions az2broadside and


broadside2az for converting between azimuth and broadside angles. The following
equation determines the broadside angle, β, from the azimuth and elevation angles, az
and el:

b = sin-1 (sin( az) cos( el))

Expressing the broadside angle in terms of the azimuth and elevation angles reveals a
number of important characteristics, including:

• For an elevation angle of zero degrees, the broadside angle is equal to the azimuth
angle.
• Elevation angles equally above and below the xy plane result in identical broadside
angles.

The following figure depicts a ULA with elements spaced d meters apart. The ULA is
illuminated by a plane wave emitted from a point source in the far field. For convenience,
the elevation angle is zero degrees. The plane determined by the signal incident direction
and the array axis is the xy plane. The broadside angle reduces to the azimuth angle.

10-19
10 Coordinate Systems and Motion Modeling

Source

d sin(β)
β

1 2 3 4 5

Because of the angle of arrival, the array elements are not simultaneously illuminated
by the plane wave. The additional distance the incident wave travels between array
elements is d sin(β) where d is the distance between array elements. Therefore, the
constant time delay between array elements is:

d sin( b )
t = ,
c

where c is the speed of the wave.

For broadside angles of ±90 degrees, the plane wave is incident on the array along the
array axis and the time delay between sensors reduces to ±d/c. For a broadside angle of 0
degrees, the plane wave illuminates all elements of the ULA simultaneously and the time
delay between elements is zero.

The following examples show the use of the utility functions az2broadside and
broadside2az:

A target is located at an azimuth angle of 45 degrees and elevation angle of 60 degrees


relative to a ULA. Determine the corresponding broadside angle:

bsang = az2broadside(45,60)
% approximately 21 degrees

10-20
Spherical Coordinates

Calculate the azimuth corresponding to a broadside angle of 45 degrees and an elevation


of 20 degrees:
az = broadside2az(45,20)
% approximately 49 degrees

10-21
10 Coordinate Systems and Motion Modeling

Global and Local Coordinate Systems

In this section...
“Global Coordinate System” on page 10-22
“Local Coordinate System” on page 10-23
“Converting Between Global and Local Coordinate Systems” on page 10-27

Global Coordinate System


As the word global indicates, the global coordinate system describes the entire
environment that you want to model. Within this global coordinate system, you can have
several phased array systems, both stationary and mobile. You can also have a number
of stationary and mobile targets. Additionally, there are usually stationary and mobile
environmental features that produce spurious signals you want to ignore as well as
stationary and mobile sources that are actively attempting to interfere with your phased
arrays (jammers).

To extract useful information from this environment, you often need to analyze data
from multiple phased arrays over time. Each phased array senses the environment from
its own local perspective. To put the information from each phased array into a global
perspective, you must know the location of each array in the global coordinate system
and the orientation of the array’s coordinate axes.

In the following figure, the solid dark axes denote the coordinate axes of a global
coordinate system. There are two phased arrays, Array 1, and Array 2. Each of the
phased arrays defines its own coordinate system within the global system denoted by the
dashed lines. A target is indicated by the black circle.

10-22
Global and Local Coordinate Systems

The two phased arrays detect the target and estimate target characteristics such as
range and velocity. To translate information about the target derived from the two
spatially-separated phased arrays, you must know the positions of the phased arrays and
the orientation of their local coordinate axes with respect to the global coordinate system.

Note: In specifying a global coordinate system, you can designate any point as the origin.
The coordinate axes must be orthogonal.

Local Coordinate System


Local coordinate systems are defined by phased arrays located within the global
coordinate system. The coordinate axes of a local coordinate system must be orthogonal,

10-23
10 Coordinate Systems and Motion Modeling

but they do not need to be parallel to the global coordinate axes. The local origin may
be located anywhere in the global coordinate system and need not be stationary. For
example, a vehicle-mounted phased array has its own local coordinate system, which
moves within the global coordinate system.

You can specify target locations with respect to a local coordinate system in terms
of range and direction of arrival. A target’s range corresponds to R, the Euclidean
distance in spherical coordinates. The direction of arrival corresponds to the azimuth
and elevation angles. Phased Array System Toolbox software follows the MATLAB
convention and lists spherical coordinates in the order: (az,el,R).

The positions of all array elements in this software are in local coordinates. The following
examples illustrate local coordinate systems for uniform linear, uniform rectangular, and
conformal arrays.

Local Coordinate System for a Uniform Linear Array

For a uniform linear array (ULA), the origin of the local coordinate system is the phase
center of the array. The positive x-axis is the direction normal to the array, and the
elements of the array are located along the y-axis. The y-axis is referred to as the array
axis. Define the axis normal to the array as the span of the vector [1 0 0] and the array
axis as the span of the vector [0 1 0]. The z-axis is the span of the vector [0 0 1], which is
the cross product of the two vectors: [1 0 0] and [0 1 0].

Construct a uniform linear array:

H = phased.ULA('NumElements',2,'ElementSpacing',0.5)
getElementPosition(H)

The following figure illustrates the default ULA in a local right-handed coordinate
system:

10-24
Global and Local Coordinate Systems

, 0)
0.25
(0,

, 0)
-0.25
(0,
x

The elements are located 0.25 meters from the phase center of the array and the distance
between the two elements is 0.5 meters.

Construct a ULA with eight elements spaced 0.25 meters apart:

H = phased.ULA('NumElements',8,'ElementSpacing',0.25)
% Invoke the getElementPosition method
% to see the local coordinates of the elements
getElementPosition(H)

Local Coordinate System of a Uniform Rectangular Array

In a uniform rectangular array (URA), the origin of the local coordinate system is the
phase center of the array. The x-axis is the direction normal to the array. In the yz plane,
the array elements have even row spacing and even column spacing.

Construct a URA:

H = phased.URA('Size',[2 2],'ElementSpacing',[0.5 0.5])


ElementLocs = getElementPosition(H)

The following figure illustrates the default URA:

10-25
10 Coordinate Systems and Motion Modeling

Construct a uniform rectangular array with two elements along the y-axis and three
elements along the z-axis.

Ha = phased.URA([2 3])
ElementLocs2by3 = getElementPosition(Ha)

Local Coordinate System of a Conformal Array

In a conformal array, the phase center of the array may be defined at an arbitrary point.
In principle, the orientation of each element in a conformal array may be different.
Therefore, it is convenient to define the array by giving the element locations with
respect to the local coordinate system origin along with the azimuth and elevation angles
defining the boresight directions.

Construct a default conformal array:

H = phased.ConformalArray
% query element position and element normal
H.ElementPosition
H.ElementNormal

The default conformal array consists of a single element located at [0 0 0], the origin of
the local coordinate system. The boresight direction of the single element is specified by
the azimuth and elevation angles (in degrees) in the ElementNormal property, [0 0].

10-26
Global and Local Coordinate Systems

Construct a conformal array with three elements located at [1 0 0], [0 1 0], and [0 –1 0]
with respect to the origin. Define the normal direction to the first element as 0 degrees
azimuth and elevation. Define the normal direction to the second and third elements as
45 degrees azimuth and elevation.
H = phased.ConformalArray(...
'ElementPosition',[1 0 0; 0 1 0; 0 -1 0]',...
'ElementNormal',[0 45 45; 0 45 45])

Converting Between Global and Local Coordinate Systems


In many array processing applications, it is necessary to convert between global and local
coordinates. Two utility functions, global2localcoord and local2globalcoord,
enable you to do this conversion.

Convert Local Spherical Coordinates to Global Rectangular Coordinates

Assume a stationary target 1000 meters from a URA at an azimuth angle of 30 degrees
and elevation angle of 45 degrees. The phase center of the URA is located at the
rectangular coordinates [1000 500 100] in the global coordinate system. The local
coordinate axes of the URA are parallel to the global coordinate axes. Determine the
position of the target in rectangular coordinates in the global coordinate system.

In this example, the target’s location is specified in local spherical coordinates. The
target is 1000 meters from the array, which means that R=1000.The azimuth angle of 30
degrees and elevation angle of 45 degrees give the direction of the target from the array.
The spherical coordinates of the target in the local coordinate system are (30,45,1000).
To convert to global rectangular coordinates, you must know the position of the array in
global coordinates. The phase center of the array is located at [1000 500 100]. To convert
from local spherical coordinates to global rectangular coordinates, use the 'sr' option.

gCoord = local2globalcoord([30; 45; 1000],'sr',...


[1000; 500; 100]);

Convert Global Rectangular Coordinates to Local Spherical Coordinates

Assume a stationary target with global rectangular coordinates [5000 3000 50]. The
phase center of a URA has global rectangular coordinates [1000 500 10]. The local
coordinate axes of the URA are [0 1 0], [1 0 0], and [0 0 –1]. Determine the position of the
target in local spherical coordinates.
lCoord = global2localcoord([5000; 3000; 50],'rs',...

10-27
10 Coordinate Systems and Motion Modeling

[1000; 500; 10],[0 1 0;1 0 0;0 0 -1]);

The output lCoord is in the form (az,el,R). The target in local coordinates has an
azimuth of approximately 58 degrees, an elevation of 0.5 degrees, and a range of 4717.16
m.

10-28
Motion Modeling in Phased Array Systems

Motion Modeling in Phased Array Systems

In this section...
“Support for Motion Modeling” on page 10-29
“Platform Motion with Constant Velocity” on page 10-30
“Platform Motion with Nonconstant Velocity” on page 10-31
“Track Range and Angle Changes Between Platforms” on page 10-32

Support for Motion Modeling


A critical component in phased array system applications is the ability to model
motion in space. Such modeling includes the motion of arrays, targets, and sources of
interference. For convenience, you can ignore the distinction between these objects and
collectively model the motion of a platform.

Extended bodies can undergo both translational and rotational motion in space. Phased
Array System Toolbox software supports modeling of translational motion.

Modeling translational platform motion requires the specification of a position and


velocity vector. Specification of a position vector implies a coordinate system. In the
Phased Array System Toolbox, platform position and velocity are specified in a “Global
Coordinate System” on page 10-22. You can think of the platform position as the
displacement vector from the global origin or as the coordinates of a point with respect to
the global origin.

Let r0 denote the position vector at time 0 and v denote the velocity vector. The position
vector of a platform as a function of time, r(t), is:

r (t) = r0 + vt

The following figure depicts the vector interpretation of translational motion.

10-29
10 Coordinate Systems and Motion Modeling

r(t0)

r0=r(0)
vt

r(t)=r0+vt

When the platform represents a sensor element or array, it is important to know the
orientation of the element or array local coordinate axes. For example, the orientation
of the local coordinate axes is necessary to extract angle information from incident
waveforms. See “Global and Local Coordinate Systems” on page 10-22 for a description
of global and local coordinate systems in the software. Finally, for platforms with
nonconstant velocity, you must be able to update the velocity vector over time.

You can model platform position, velocity, and local axes orientation with the
phased.Platform object.

Platform Motion with Constant Velocity


Beginning with a simple example, model the motion of a platform over ten time steps.
To determine the time step, assume that you have a pulse transmitter with a pulse
repetition frequency (PRF) of 1 kilohertz. Accordingly, the time interval between each
pulse is 1 millisecond. Set the time step equal to pulse repetition interval.
PRF = 1e3;
Tstep = 1/PRF;
Nsteps = 10;
Next, construct a platform object specifying the platform’s initial position and velocity.
Assume that the initial position of the platform is 100 meters (m) from the origin at
(60,80,0). Assume the speed is approximately 30 meters per second (m/s) with the
constant velocity vector given by (15, 25.98, 0).

10-30
Motion Modeling in Phased Array Systems

hplat = phased.Platform('InitialPosition',[60;80;0], ...


'Velocity', [15;25.98;0]);

The orientation of the local coordinate axes of the platform is the value of
the OrientationAxes property. You can view the value of this property by
entering hplat.OrientationAxes at the MATLAB command prompt. Because
the OrientationAxes property is not specified in the construction of the
phased.Platform object, the property is assigned its default value of [1 0 0;0 1 0;0
0 1].

Use the step method to simulate the translational motion of the platform.
InitialPos = hplat.InitialPosition;
for k = 1:Nsteps
pos = step(hplat,Tstep);
end
FinalPos = pos+hplat.Velocity*Tstep;
DistTravel = norm(FinalPos-InitialPos);

The step method returns the current position of the platform and then updates the
platform position based on the time step and velocity. Equivalently, the first time you
invoke the step method, the output is the position of the platform at t=0.

Recall that the platform is moving with a constant velocity of approximately 30 m/s.
The total time elapsed is 0.01 seconds. Invoking the step method returns the current
position of the platform and then updates that position. Accordingly, you expect the
final position to differ from the initial position by 0.30 meters. Confirm this difference by
examining the value of DistTravel.

Platform Motion with Nonconstant Velocity


Most platforms in phased array applications do not move with constant velocity. If
the time interval described by the number of time steps is small with respect to the
platform’s speed, you can often approximate the velocity as constant. However, there are
situations where you must update the platform’s velocity over time. You can do so with
phased.Platform because the Velocity property is tunable. See “What You Cannot
Change While Your System Is Running” for details.

In this example, assume you model a target initially at rest. The initial velocity vector is
(0,0,0). Assume the time step is 1 millisecond. After 500 milliseconds, the platform begins
to move with a speed of approximately 10 m/s. The velocity vector is (7.07,7.07,0). The
platform continues at this velocity for an additional 500 milliseconds.

10-31
10 Coordinate Systems and Motion Modeling

Tstep = 1e-3;
Nsteps = 1/Tstep;
hplat = phased.Platform('InitialPosition',[100;100;0]);
for k = 1:Nsteps/2
[pos,vel] = step(hplat,Tstep);
end
hplat.Velocity = [7.07; 7.07; 0];
for k=Nsteps/2+1:Nsteps
[pos,vel] = step(hplat,Tstep);
end

Track Range and Angle Changes Between Platforms


This example uses the phased.Platform object to model the changes in range between
a stationary radar and a moving target. The radar is located at (1000,1000,0) and has a
velocity of (0,0,0). The target has an initial position of (5000,8000,0) and moves with a
constant velocity of (–30,–45,0). The pulse repetition frequency (PRF) is 1 kHz. Assume
that the radar emits ten pulses.

The example uses phased.Platform to model the motion of the target and radar. The
global2localcoord function translates the target’s rectangular coordinates in the
global coordinate system to spherical coordinates in the local coordinate system of the
radar.

PRF = 1e3;
Tstep = 1/PRF;
hradar = phased.Platform('InitialPosition',[1000;1000;0]);
htgt = phased.Platform('InitialPosition',[5000;8000;0],...
'Velocity',[-30;-45;0]);
% Calculate initial target range and angle
[InitRng, InitAng] = rangeangle(htgt.InitialPosition,...
hradar.InitialPosition);
% Calculate relative radial speed
v = radialspeed(htgt.InitialPosition,htgt.Velocity,...
hradar.InitialPosition);
% Simulate target motion
Npulses = 10; % Number of pulses
for num = 1:Npulses
tgtpos = step(htgt,Tstep);
end
tgtpos = tgtpos+htgt.Velocity*Tstep;
% Calculate final target range and angle
[FinalRng,FinalAng] = rangeangle(tgtpos,...

10-32
Motion Modeling in Phased Array Systems

hradar.InitialPosition);
DeltaRng = FinalRng-InitRng;

The constant velocity of the target is approximately 54 m/s. The total time elapsed is 0.01
seconds. The range between the target and the radar should decrease by approximately
54 centimeters. Compare the initial range of the target, InitRng, to the final range,
FinalRng, to confirm that this decrease occurs.

Related Examples
• “Introduction to Space-Time Adaptive Processing”

10-33
10 Coordinate Systems and Motion Modeling

Doppler Shift and Pulse-Doppler Processing


In this section...
“Support for Pulse-Doppler Processing” on page 10-34
“Converting Speed to Doppler Shift” on page 10-34
“Converting Doppler Shift to Speed” on page 10-35
“Pulse-Doppler Processing of Slow-Time Data” on page 10-35

Support for Pulse-Doppler Processing


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:

v
Df = ±
l

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.

Converting Speed to Doppler Shift


Assume a target approaching a stationary receiver with a radial speed of 23 meters per
second. The target is reflecting a narrowband electromagnetic wave with a frequency of 1
GHz. Estimate the one-way Doppler shift.
freq = 1e9;
lambda = physconst('LightSpeed')/freq;
DopplerShift = speed2dop(23,lambda)

The one-way Doppler shift is approximately 76.72 Hz. The fact that the target is
approaching the receiver results in a positive Doppler shift.

10-34
Doppler Shift and Pulse-Doppler Processing

Converting Doppler Shift to Speed


Assume you observe a Doppler shift of 400 Hz for a waveform with a frequency of 9 GHz.
Determine the radial velocity of the target.
freq = 9e9;
lambda = physconst('LightSpeed')/freq;
speed = dop2speed(400,lambda)

The target speed is approximately 13.32 m/sec.

Pulse-Doppler Processing of Slow-Time Data


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.

To illustrate pulse-Doppler processing with Phased Array System Toolbox software,


assume that you have a stationary monostatic radar located at the global origin,

10-35
10 Coordinate Systems and Motion Modeling

[0;0;0]. The radar consists of a single isotropic antenna element. There is a target with
a non-fluctuating radar cross section (RCS) of 1 square meter located initially at [1000;
1000; 0] and moving with a constant velocity of [-100; -100; 0]. The antenna
operates at a frequency of 1 GHz and illuminates the target with 10 rectangular pulses at
a PRF of 10 kHz.

Define the System objects needed for this example and set their properties. Seed
the random number generator for the phased.ReceiverPreamp object to produce
repeatable results.
hwav = phased.RectangularWaveform('SampleRate',5e6,...
'PulseWidth',6e-7,'OutputFormat','Pulses',...
'NumPulses',1,'PRF',1e4);
htgt = phased.RadarTarget('Model','Nonfluctuating',...
'MeanRCS',1,'OperatingFrequency',1e9);
htgtloc = phased.Platform('InitialPosition',[1000; 1000; 0],...
'Velocity',[-100; -100; 0]);
hant = phased.IsotropicAntennaElement(...
'FrequencyRange',[5e8 5e9]);
htrans = phased.Transmitter('PeakPower',5e3,'Gain',20,...
'InUseOutputPort',true);
htransloc = phased.Platform('InitialPosition',[0;0;0],...
'Velocity',[0;0;0]);
hrad = phased.Radiator('OperatingFrequency',1e9,'Sensor',hant);
hcol = phased.Collector('OperatingFrequency',1e9,'Sensor',hant);
hspace = phased.FreeSpace('SampleRate',hwav.SampleRate,...
'OperatingFrequency',1e9,'TwoWayPropagation',false);
hrx = phased.ReceiverPreamp('Gain',0,'LossFactor',0,...
'SampleRate',5e6,'NoiseFigure',5,...
'EnableInputPort',true,'SeedSource','Property','Seed',1e3);

The following 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’s position with the specified constant velocity.
NumPulses = 10;
sig = step(hwav); % get waveform
transpos = htransloc.InitialPosition; % get transmitter position
rxsig = zeros(length(sig),NumPulses);
% transmit and receive ten pulses
for n = 1:NumPulses
% update target position
[tgtpos,tgtvel] = step(htgtloc,1/hwav.PRF);
[tgtrng,tgtang] = rangeangle(tgtpos,transpos);

10-36
Doppler Shift and Pulse-Doppler Processing

tpos(n) = tgtrng;
[txsig,txstatus] = step(htrans,sig); % transmit waveform
txsig = step(hrad,txsig,...
tgtang); % radiate waveform toward target
txsig = step(hspace,txsig,transpos,tgtpos,...
[0;0;0],tgtvel); % propagate waveform to target
txsig = step(htgt,txsig); % reflect the signal
% propagate waveform from the target to the transmiter
txsig = step(hspace,txsig,tgtpos,transpos,tgtvel,[0;0;0]);
txsig = step(hcol,txsig,tgtang); % collect signal
rxsig(:,n) = step(hrx,txsig,~txstatus); % receive the signal
end

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 = hwav.PRF;
fs = hwav.SampleRate;
fasttime = unigrid(0,1/fs,1/prf,'[)');
rangebins = (physconst('LightSpeed')*fasttime)/2;

The next step is to detect range bins which contain targets. In this simple scenario,
no matched filtering or time-varying gain compensation is utilized. See “Doppler
Estimation” for an example using matched filtering and range-dependent gain
compensation to improve the SNR.

In this example, set the false-alarm probability to 1e-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,...
hrx.NoiseFigure,hrx.ReferenceTemperature);
thresh = npwgnthresh(probfa,NumPulses,'noncoherent');
thresh = sqrt(npower*db2pow(thresh));
[pks,range_detect] = findpeaks(pulsint(rxsig,'noncoherent'),...

10-37
10 Coordinate Systems and Motion Modeling

'MinPeakHeight',thresh,'SortStr','descend');
range_estimate = rangebins(range_detect(1));
fprintf('Estimated range of the target is %4.2f meters.\n',...
range_estimate);

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 and find the peak frequency. Convert the peak Doppler frequency to a
speed using dop2speed. 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 target speed is %3.1f m/sec.\n',tgtspeed);
if F(I)>0
fprintf('The target is approaching the radar.\n');
else
fprintf('The target is moving away from the radar.\n');
end

10-38
Doppler Shift and Pulse-Doppler Processing

The code produces:


Estimated range of the target is 1439.00 meters.
Estimated target speed is 140.5 m/sec.
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.

Related Examples
• “Doppler Estimation”
• “Scan Radar Using a Uniform Rectangular Array”

10-39
10-40
11

Using Polarization
11 Using Polarization

Polarized Fields
In this section...
“Introduction to Polarization” on page 11-2
“Linear and Circular Polarization” on page 11-4
“Elliptic Polarization” on page 11-9
“Linear and Circular Polarization Bases” on page 11-13
“Sources of Polarized Fields” on page 11-17
“Scattering Cross-Section Matrix” on page 11-24
“Polarization Loss Due to Field and Receiver Mismatch” on page 11-27
“Polarization Example” on page 11-29

Introduction to Polarization
You can use the Phased Array System Toolbox software to simulate radar systems that
transmit, propagate, reflect, and receive polarized electromagnetic fields. By including
this capability, the toolbox can realistically model the interaction of radar waves with
targets and the environment.

It is a basic property of plane waves in free-space that the directions of the electric and
magnetic field vectors are orthogonal to their direction of propagation. The direction of
propagation of an electromagnetic wave is determined by the Poynting vector

S = E¥ H

In this equation, E represents the electric field and H represents the magnetic field.
The quantity, S, represents the magnitude and direction of the wave’s energy flux.
Maxwell’s equations, when applied to plane waves, produce the result that the electric
and magnetic fields are related by

E = - Zs ¥ H
1
H = s¥E
Z

The vector s, the unit vector in the S direction, represents the direction of propagation
of the wave. The quantity, Z, is the wave impedanceand is a function of the electric
permittivity and the magnetic permeability of medium in which the wave travels.

11-2
Polarized Fields

After manipulating the two equations, you can see that the electric and magnetic fields
are orthogonal to the direction of propagation

E•s = H•s = 0.

This last result proves that there are really only two independent components of the
electric field, labeled Ex and Ey. Similarly, the magnetic field can be expressed in terms
of two independent components. Because of the orthogonality of the fields, the electric
field can be represented in terms of two unit vectors orthogonal to the direction of
propagation.

E = Ex e$ x + Ey e$ y

The unit vectors together with the unit vector in direction of propagation

{e˘ x , e˘ y , s}.

form a right-handed orthonormal triad. Later, these vectors and the coordinates they
define will be related to the coordinates of a specific radar system. In radar systems, it is
common to use the subscripts, H and V, denoting the horizontal and vertical components,
instead of x and y. Because the electric and magnetic fields are determined by each other,
only the properties of the electric field need be consider.

For a radar system, the electric and magnetic field are actually spherical waves, rather
than plane waves. However, in practice, these fields are usually measured in the far
field region or radiation zone of the radar source and are approximately plane waves.
In the far field, the waves are called quasi-plane waves. A point lies in the far field if
its distance, R, from the source satisfies R ≫D2/λ where D is a typical dimension of the
source, whether it is a single antenna or an array of antennas.

Polarization applies to purely sinusoidal signals. The most general expression for a
sinusoidal plane-wave has the form

E = Ex 0 cos ( w t - k•x + fx ) e$ x + Ey0 cos wt - k•x + f y e$ y = Ex e$ x + Ey e$ y


( )
The quantities Ex0 and Ey0 are the real-valued, non-negative, amplitudes of the
components of the electric field and ≫x and ≫y are field’s phases. This expression is the
most general one used for a polarized wave. An electromagnetic wave is polarized if the
ratio of the amplitudes of its components and phase difference between it components

11-3
11 Using Polarization

do not change with time. The definition of polarization can be broadened to include
narrowband signals, for which the bandwidth is small compared to the center or carrier
frequency of the signal. The amplitude ratio and phases difference vary slowly with time
when compared to the period of the wave and may be thought of as constant over many
oscillations.

You can usually suppress the spatial dependence of the field and write the electric field
vector as

E = Ex 0 cos ( w t + fx ) e$ x + Ey0 cos wt + f y e$ y = Ex e$ x + E y e$ y


( )

Linear and Circular Polarization


The preceding equation for a polarized plane wave shows that the tip of the two-
dimensional electric field vector moves along a path which lies in a plane orthogonal to
field’s direction of propagation. The shape of the path depends upon the magnitudes and
phases of the components. For example, if ≫x = ≫y, you can remove the time dependence
and write

Ey0
Ey = Ex
Ex0

This equation represents a straight line through the origin with positive slope.
Conversely, suppose ≫x = ≫y + π. Then, the tip of the electric field vector follows a straight
line through the origin with negative slope

Ey0
Ey = - Ex
Ex0

These two polarization cases are named linear polarized because the field always
oscillates along a straight line in the orthogonal plane. If Ex0= 0, the field is vertically
polarized, and if Ey0 = 0 the field is horizontally polarized.

A different case occurs when the amplitudes are the same, Ex = Ey, but the phases differ
by ±π/2

Ex = E0 cos(w t + f )
Ey = E0 cos(w t + f ± p / 2) = ∓ E0 sin(wt + f )

11-4
Polarized Fields

By squaring both sides, you can show that the tip of the electric field vector obeys the
equation of a circle

E2x + E2y = E02

While this equation gives the path the vector takes, it does not tell you in what
direction the electric field vector travels around the circle. Does it rotate clockwise or
counterclockwise? The rotation direction depends upon the sign of π/2 in the phase. You
can see this dependency by examining the motion of the tip of the vector field. Assume
the common phase angle, ≫ = 0. This assumption is permissible because the common
phase only determines starting position of the vector and does not change the shape
of its path. First, look at the +π/2 case for a wave travelling along the s-direction (out
of the page). At t=0, the vector points along the x-axis. One quarter period later, the
vector points along the negative y-axis. After another quarter period, it points along the
negative x-axis.

y
E (t = 3T/4)

E (t = T/2) E (t = 0)
x

E (t = T/4)

Left hand circular polarization. The direction of


the electric vector at 0, 1/4, 1/2, and 3/4 periods, T.
The z-axis points out of the page.

11-5
11 Using Polarization

MATLAB uses the IEEE convention to assign the names right-handed or left-handed
polarization to the direction of rotation of the electric vector, rather than clockwise or
counterclockwise. When using this convention, left or right handedness is determined
by pointing your left or right thumb along the direction of propagation of the wave.
Then, align the curve of your fingers to the direction of rotation of the field at a given
point in space. If the rotation follows the curve of your left hand, then the wave is left-
handed polarized. If it follows the curve of your right hand, then the wave is right-
handed polarized. In the preceding scenario, the field is left-handed circularly polarized
(LHCP). The phase difference –π/2 corresponds to right-handed circularly polarized
wave (RHCP). The following figure provides a three-dimensional view of what a LHCP
electromagnetic wave looks like as it moves in the s-direction.

When the terms clockwise or counterclockwise are used they depend upon how you look
at the wave. If you look along the direction of propagation, then the clockwise direction
corresponds to right-handed polarization and counterclockwise corresponds to left-
handed polarization. If you look toward where the wave is coming from, then clockwise
corresponds to left-handed polarization and counterclockwise corresponds to right-
handed polarization.

11-6
Polarized Fields

Left-Handed Circular Polarization

The figure below summarizes the appearance of linear and circularly polarized fields as
they move towards you along the s-direction.

11-7
11 Using Polarization

y y

Ey Ey
E E
τ

τ
x O
x
O Ex
Ex

Linear polarization with positive slope Linear polarization with negative slope

y y

E E
Ey Ey

x x
O Ex O Ex

Right hand circular polarization Left hand circular polarization

Linear and Circular Polarization

11-8
Polarized Fields

Elliptic Polarization
Besides the linear and circular states of polarization, a third type of polarization is
elliptic polarization. Elliptic polarization includes linear and circular polarization as
special cases.

As with linear or circular polarization, you can remove the time dependence to obtain the
locus of points that the tip of the electric field vector travels

2 2
Ê Ex ˆ Ê Ey ˆ Ê E ˆ Ê Ey ˆ
Á ˜ +Á ˜ - 2Á x ˜ ÁÁ ˜ cos f = sin 2 f
Ë Ex 0 ¯ ÁË Ey0 ˜
¯ Ë Ex0 ¯ Ë Ey0 ˜
¯

In this case, φ = φy – φx. This equation represents a tilted two-dimensional ellipse. Its
size and shape are determined by the component amplitudes and phase difference. The
presence of the cross term indicates that the ellipse is tilted. The equation does not, just
as in the circularly polarized case, provide any information about the rotation direction.
For example, the following figure shows the instantaneous state of the electric field but
does not indicate the direction in which the field is rotating.

The size and shape of a two-dimensional ellipse can be defined by three parameters.
These parameters are the lengths of its two axes, the semi-major axis, a, and semi-minor
axis, b, and a tilt angle, τ. The following figure illustrates the three parameters of a tilted
ellipse. You can derive them from the two electric field amplitudes and phase difference.

11-9
11 Using Polarization

Ey0

Ey
E a
b
τ
x
O Ex Ex0

Polarization Ellipse

Polarization can best be understood in terms of complex signals. The complex


representation of a polarized wave has the form

E = E x 0e
ifx iw t
e
if
( if if
)
e$ x + E y0 e y eiw t e$ y = Ex 0 e x e$ x + Ey0 e y e$ y eiwt

Define the complex polarization ratio as the ratio of the complex amplitudes

Ey0 i( f y -f x ) Ey 0 if
r= e = e
Ex0 Ex0

11-10
Polarized Fields

where ≫ = ≫y – ≫x.

It is useful to introduce the polarization vector. For the complex polarized electric field
above, the polarization vector, P, is obtained by normalizing the electric field

Ex 0 $ Ey0 i ( f y -fx ) $ E Ey 0 if $
P= ex + e e y = x0 e$ x + e ey
Em Em Em Em

where Em2 = Ex02 + Ey02 is the magnitude of the wave.

The overall size of the polarization ellipse is not important because that can vary as the
wave travels through space, especially through geometric attenuation. What is important
is the shape of the ellipse. Thus, the significant ellipse parameters are the ratio of its axis
dimensions, a/b, called the axial ratio, and the tilt angle, τ. Both of these quantities can
be determined from the ratio of the component amplitudes and the phase difference, or,
equivalently, from the polarization ratio. Another quantity, equivalent to the axial ratio,
is the ellipticity angle, ε.

In the Phased Array System Toolbox software, you can use the polratio function to
convert the complex amplitudes fv=[Ey;Ex] to the polarization ratio.
p = polratio(fv)

Tilt Angle

The tilt angle is defined as the positive (counterclockwise) rotation angle from the x-axis
to the semi-major axis of the ellipse. Because of the symmetry properties of the ellipse,
the tilt angle, τ, needs only be defined in the range –π/2 ≤ τ ≤ π/2. You can find the tilt
angle by determining the rotated coordinate system in which the semi-major and semi-
minor axes align with the rotated coordinate axes. Then, the ellipse equation has no
cross-terms. The solution takes the form

2E x0 E y0
tan 2t = cos f
E x20 - E 2y0

where φ = φy – φx. Notice that you can rewrite this equation strictly in terms of the
amplitude ratio and the phase difference.

Axial Ratio and Ellipticity Angle

After solving for the tilt angle, you can determine the semi-major and semi-minor axis
lengths. Conceptually, you rotate the ellipse clockwise by the tilt angle and measure the

11-11
11 Using Polarization

lengths of the intersections of the ellipse with the x- and y-axes. The point of intersection
with the larger value is the semi-major axis, a, and the one with the smaller value is the
semi-minor axis, b.

The axial ratio is defined as AR = a/b and, by construction, is always greater than or
equal to one. The ellipticity angle is defined by

b
tan e = ∓
a

and always lies in the range–π/4 ≤ τ ≤ π/4.

If you first introduced the auxilliary angle, α, by

Ey 0
tan a =
E x0

then, the ellipticity angle is given by


sin 2e = sin 2a sin f

Both the axial ratio and ellipticity angle are defined from the amplitude ratio and phase
difference and are independent of the overall magnitude of the field.

Rotation Sense

For elliptic polarization, just as with circular polarization, you need another parameter
to completely describe the ellipse. This parameter must provide the rotation sense or
the direction that the tip of the electric (or magnetic vector) moves in time. The rate
of change of the angle that the field vector makes with the x-axis is proportion to –sin
φ where φ is the phase difference. If sin φ is positive, the rate of change is negative,
indicating that the field has left-handed polarization. If sin φ is negative, the rate of
change is positive or right-handed polarization.

The function polellip lets you find the values of the parameters of the polarization
ellipse from either the field component vector fv=[Ey;Ex] or the polarization ratio, p.
fv=[Ey;Ex];
[tau,epsilon,ar,rs] = polellip(fv);
p = polratio(fv);
[tau,epsilon,ar,rs] = polellip(p);
The variables tau, epsilon, ar and rs represent the tilt angle, ellipticity angle, axial
ratio and rotation sense, respectively. Both syntaxes give the same result.

11-12
Polarized Fields

Polarization Value Summary

This table summaries several different common polarization states and the values of the
amplitudes, phases, and polarization ratio that produce them:

Polarization Amplitudes Phases Polarization Ratio


Linear positive slope Any non-negative φy = φx Any non-negative
real values for Ex, Ey. real number
Linear negative Any non-negative φy = φx+ π Any negative real
slope real values for Ex, Ey number
Right-Handed Ex=Ey φy= φx– π/2 –i
Circular
Left-Handed Ex=Ey φy= φx + π/2 i
Circular
Right-Handed Any non-negative sin (φy– φx) < 0 sin(arg ρ) < 0
Elliptical real values for Ex, Ey
Left-Handed Any non-negative sin (φy– φx) >0 sin(arg ρ) > 0
Elliptical real values for Ex, Ey

Linear and Circular Polarization Bases


As shown earlier, you can express a polarized electric field as a linear combination of
basis vectors along the x and y directions. For example, the complex electric field vectors
for the right-handed circularly polarized (RHCP) wave and the left-handed circularly
polarized (LHCP) wave, take the form:

E = Re[ E0 (e x ∓ ie y ) ei (w t+f ) ]

In this equation, the positive sign is for the LHCP field and the negative sign is for the
RHCP field. These two special combinations can be given a new name. Define a new basis
vector set, called the circular basis set

1
er = ( e x - ie y )
2
1
el = ( e x + ie y )
2

11-13
11 Using Polarization

You can express any polarized field in terms of the circular basis set instead of the linear
basis set. Conversely, you can also write the linear polarization basis in terms of the
circular polarization basis

1
ex = (e r + el )
2
1
ey = (e r - el )
2i

Any general elliptic field can be written as a combination of circular basis vectors

E = El e l + Er er

Jones Vector

The polarized field is orthogonal to the wave’s direction of propagation. Thus, the field
can be completely specified by the two complex components of the electric field vector in
the plane of polarization. The formulation of a polarized wave in terms of two-component
vectors is called the Jones vector formulation. The Jones vector formulation can be
expressed in either a linear basis or a circular basis or any basis. This table shows the
representation of common polarizations in a linear basis and circular basis.

Common Polarizations Jones Vector in Linear Basis Jones Vector in Circular Basis
Vertical [0;1] 1/sqrt(2)*[-1;1]
Horizontal [1;0] 1/sqrt(2)*[1;1]
45° Linear 1/sqrt(2)*[1;1] 1/sqrt(2)*[1-1i;1+1i]
135° Linear 1/sqrt(2)*[1;-1] 1/sqrt(2)*[1+1i;1-1i]
Right Circular 1/sqrt(2)*[1;-1i] [0;1]
Left Circular 1/sqrt(2)*[1;1i] [1;0]

Stokes Parameters and the Poincaré Sphere

The polarization ellipse is an instantaneous representation of a polarized wave. However,


its parameters, the tilt angle and the ellipticity angle, are often not directly measurable,
particularly at very high frequencies such as light frequencies. However, you can
determine the polarization from measurable intensities of the polarized field.

11-14
Polarized Fields

The measurable intensities are the Stokes parameters, S0, S1, S2, and S3. The first
Stokes parameter, S0, describes the total intensity of the field. The second parameter,
S1, describes the preponderance of linear horizontally polarized intensity over linear
vertically polarized intensity. The third parameter, S2, describes the preponderance
of linearly +45° polarized intensity over linearly 135° polarized intensity. Finally, S3
describes the preponderance of right circularly polarized intensity over left circularly
polarized intensity. The Stokes parameters are defined as

S0 = E 2x0 + E 2y 0
S1 = E 2x0 - E 2y 0
S2 = 2 Ex 0 E y 0 cos f
S3 = 2 Ex 0 E y 0 sinf

For completely polarized fields, you can show by time averaging the polarization ellipse
equation that

S02 = S12 + S22 + S32

Thus, there are only three independent Stokes’ parameters.

For partially polarized fields, in contrast, the Stokes parameters satisfy the inequality

S02 < S12 + S32 + S32

The Stokes parameters are related to the tilt and ellipticity angles, τ and ε

S1 = S0 cos 2t cos 2e
S2 = S0 sin 2t cos 2e
S3 = S0 sin 2e

and inversely by

S2
tan 2t =
S1
S3
sin 2e =
S0

11-15
11 Using Polarization

After you measure the Stokes’ parameters, the shape of the ellipse is completely
determined by the preceding equations.

The two-dimensional Poincaré sphere can help you visualize the state of a polarized
wave. Any point on or in the sphere represents a state of polarization determined by the
four Stokes parameters, S0, S1, S2, and S3. On the Poincaré sphere, the angle from the S1-
S2 plane to a point on the sphere is twice the ellipticity angle, ε. The angle from the S1-
axis to the projection of the point into the S1-S2 plane is twice the tilt angle, τ.

S3

S0


S2

S1

As an example, solve for the Stokes parameters of a RHCP field, fv=[1,-i], using the
stokes function.

11-16
Polarized Fields

S = stokes(fv)

S =

2
0
0
-2

Sources of Polarized Fields


Antennas couple propagating electromagnetic radiation to electrical currents in wires,
electromagnetic fields in waveguides or aperture fields. This coupling is a phenomenon
common to both transmitting and receiving antennas. For some transmitting antennas,
source currents in a wire produce electromagnetic waves that carrying power in all
directions. Sometimes an antenna provides a means for a guided electromagnetic wave
on a transmission line to transition to free-space waves such as a waveguide feeding a
dish antennas. For receiving antennas, electromagnetic fields can induce currents in
wires to generate signals to be then amplified and passed on to a detector.

For transmitting antennas, the shape of the antenna is chosen to enhance the power
projected into a given direction. For receiving antennas, you choose the shape of the
antenna to enhance the power received from a particular direction. Often, many
transmitting antennas or receiving antennas are formed into an array. Arrays increase
the transmitted power for a transmitting system or the sensitivity for a receiving system.
They improve directivity over a single antenna.

An antenna can be assigned a polarization. The polarization of a transmitting antenna


is the polarization of its radiated wave in the far field. The polarization of a receiving
antenna is actually the polarization of a plane wave, from a given direction, resulting in
maximum power at the antenna terminals. By the reciprocity theorem, all transmitting
antennas can serve as receiving antennas and vice versa.

Each antenna or array has an associated local Cartesian coordinate system (x,y,z)
as shown in the following figure. See “Global and Local Coordinate Systems” for
more information. The local coordinate system can also be represented by a spherical
coordinate system using azimuth, elevation and range coordinates, az, el, r, or alternately
written, (φ,θ,r), as shown. At each point in the far field, you can create a set of unit
spherical basis vectors, {e$ H , e$V , r$ } . The basis vectors are aligned with the (φ,θ,r)
directions, respectively. In the far field, the electric field is orthogonal to the unit vector

11-17
11 Using Polarization

r̂ . The components of a polarized field with respect to this basis, (EH,EV), are called the
horizontal and vertical components of the polarized field. In radar, it is common to use
(H,V) instead of (x,y) to denote the components of a polarized field. In the far field, the
polarized electric field takes the form

eikr eikr
E = F(f ,q ) = ( FH (f ,q ) eH + FV (f ,q )eV )
r r

In this equation, the quantity F(φ,θ) is called the vector radiation pattern of the source
and contains the angular dependence of the field in the far-field region.

êV
F(φ,θ)
êΗ
^r

r
Radar Coordinate System
θ, el
y

φ, az

Short Dipole Antenna Element

The simplest antenna is the dipole antenna which consist of a split length of wire coupled
at the middle to a coaxial cable. The simplest dipole, from a mathematical perspective,
is the Hertzian dipole, in which the length of wire is much shorter than a wavelength. A
diagram of the short dipole antenna of length L appears in the next figure. This antenna
is fed by a coaxial feed which splits into two equal length wires of length L/2. The
current, I, moves along the z-axis and is assumed to be the same at all points in the wire.

11-18
Polarized Fields

L/2
EV
EH
r

el
y
az

x
-L/2

The electric field in the far field has the form

Er = 0
EH = 0
iZ 0 IL e-ikr
EV = - cos el
2l r

The next figure shows how the vertical and horizontal polarization components of the
field depend on the elevation angle for all values of azimuth angle because the field is
axially symmetric. The horizontal component vanishes.

11-19
11 Using Polarization

The toolbox models the short dipole antenna in the


phased.ShortDipoleAntennaElement System object.

Crossed Dipole Antenna Element

The crossed dipole antenna comprises two identical but orthogonal short dipole antennas
which are phased 90° apart. A diagram of the crossed dipole antenna appears in the
following figure. You use this antenna to generate circularly polarized radiation. The

11-20
Polarized Fields

electric field created by a crossed-dipole antenna constructed from a y-directed short


dipole and a z-directed short dipole has the form

Er = 0
iZ 0 IL e -ikr
EH = - cos az
2l r
iZ 0 IL e-ikr
EV = (sin el sin az + i cos el)
2l r

The polarization ratio EV/EH when evaluated along the x-axis is just –i which means that
the polarization is exactly RHCP along the x-axis. It is predominantly RHCP when the
observation point is close to the x-axis. Away from the x-axis, the field is a mixture of
LHCP and RHCP polarizations. Along the –x-axis, the field is LHCP polarized. The figure
illustrates, for a point near the x, that the field is primarily RHCP.

11-21
11 Using Polarization

L/2

-L/2 L/2
y
el
EL

-L/2
az

You can see in the next figure how the circular polarization changes from pure RHCP at
0° azimuth angle to LHCP at 180° azimuth angle, both at 0° elevation.

11-22
Polarized Fields

The toolbox models a crossed dipole antenna using the


phased.CrossedDipoleAntennaElement System object.

Besides modeling antennas, the toolbox models several kinds of antenna arrays:

• phased.ULA for uniform line arrays


• phased.URA for uniform rectangular arrays
• phased.ConformalArray for arbitrary arrays of elements

11-23
11 Using Polarization

You can create polarized fields from arrays by using polarized antenna elements as a
value of the Elements property of an array System object.

Scattering Cross-Section Matrix


After a polarized field is created by an antenna system, the field radiates to the far-
field region. When the field propagates into free space, the polarization properties
remain unchanged until the field interacts with a material substance which scatters
the field into many directions. In such situations, the amplitude and polarization of
the scattered wave can differ from the incident wave polarization. The scattered wave
polarization may depend upon the direction in which the scattered wave is observed. The
exact way that the polarization changes depends upon the properties of the scattering
object. The quantity describing the response of an object to the incident field is called
the radar scattering cross-section matrix (RCSM), S. You can measure the scattering
matrix as follows. When a unit amplitude horizontally polarized wave is scattered, both
a horizontal and a vertical scattered component are produced. Call these two components
SHH and SVH. These components are complex numbers containing the amplitude and
phase changes from the incident wave. Similarly, when a unit amplitude vertically
polarized wave is scattered, the horizontal and vertical scattered component produced
are SHV and SVV. Because, any incident field can be decomposed into horizontal and
vertical components, you can arrange these quantities into a matrix and write the
scattered field in terms of the incident field

È E ( scat) ˘ 4p È S HH SVH ˘ È E (Hinc ) ˘ 4p È E ( inc ) ˘


Í H ˙= Í Í ˙ = [ S ] Í H ˙
ÍÎ EV( scat) ˙˚ l 2 Î SHV SVV ˙˚ Í E ( inc ) ˙ l 2
ÍÎ EV( inc ) ˙˚
Î V ˚

In general, the scattering cross-section matrix depends upon the angles that the incident
and scattered fields make with the object. When the incident field is scattered back to the
transmitting antenna or, backscattered, the scattering matrix is symmetric.

Polarization Signature

To understand how the scattered wave depends upon the polarization of the incident
wave, you need to examine all possible scattered field polarizations for each incident
polarization. Because this amount of data is difficult to visualize, consider two cases:

• The scattered polarization has the same polarization as the incident field
(copolarization)

11-24
Polarized Fields

• The scattered polarization has orthogonal polarization to the incident field (cross-
polarization)

You can represent the incident polarizations in terms of the tilt angle-ellipticity angle
pair (t ,e ) . Every unit incident polarization vector can be expressed as

È E ( inc) ˘ È cos t - sint ˘ È cos e ˘


Í H ˙=Í
ÍÎ EV( inc) ˙˚ Î sin t cost ˙˚ ÍÎ j sin e ˙˚

while the orthogonal polarization vector is

È E( inc) ^ ˘ È - sin t - cost ˘ È cos e ˘


Í H ˙ =Í ˙Í ˙
Í E( inc) ^ ˙ Î cost - sin t ˚ Î - j sin e ˚
Î V ˚

To form the copolarization signature, use the RCSM matrix, S, to compute:

* È E( inc) ˘
P ( co) = È E(Hinc) EV(inc) ˘ S Í H ˙
Î ˚ Í E( inc) ˙
Î V ˚

where []* denotes complex conjugation. For the cross-polarization signature, compute

* È E( inc) ˘
P ( cross) = È E(Hinc) ^ EV( inc) ^ ˘ S Í H ˙
Î ˚ Í E( inc) ˙
Î V ˚

You can compute both the copolarization and cross polarization signatures using the
polsignature function. This function returns the absolute value of the scattered
power (normalized by its maximum value). The next example shows how to plot the
copolarization signature for the RCSM matrix

È 1˘
Í 2i 2˙
S=Í ˙
Í1 i˙
ÍÎ 2 ˙˚

for all possible incident polarizations. The range of values of the ellipticity angle and tilt
span the entire possible range of polarizations.

11-25
11 Using Polarization

rscmat = [1i*2,0.5; 0.5, -1i];


el = [-45:45];
tilt = [-90:90];
polsignature(rscmat,'c',el,tilt);

Alternatively, the code generates a plot of cross-polarizations for all incident


polarizations.
rscmat = [1i*2,0.5; 0.5,-1i];
el = [-45:45];

11-26
Polarized Fields

tilt = [-90:90];
polsignature(rscmat,'x',el,tilt);

Polarization Loss Due to Field and Receiver Mismatch


An antenna that is used to receive polarized electromagnetic waves achieves its
maximum output power when the antenna polarization is matched to the polarization of
the incident electromagnetic field. Otherwise, there is polarization loss:

11-27
11 Using Polarization

• The polarization loss is computed from the projection (or dot product) of the
transmitted field’s electric field vector onto the receiver polarization vector.
• Loss occurs when there is a mismatch in direction of the two vectors, not in their
magnitudes.
• The polarization loss factor describes the fraction of incident power that has the
correct polarization for reception.

Using the transmitter’s spherical basis at the receiver’s position, you can represent the
incident electric field, (EiH, EiV), by

E = EiH eˆ H + EiV eˆ V = EmPi

You can represent the receiver’s polarization vector, (PH, PV), in the receiver’s local
spherical basis by:

P = PH eˆ ¢H + PV eˆ ¢V

The next figure shows the construction of the transmitter and receiver spherical basis
vectors.

z'

ê'V el' y'


z
êV az'
êH r^'
^r x' Receiver Coordinate System
ê'H
el
y

az
x Transmitter Coordinate System

11-28
Polarized Fields

The polarization loss is defined by:

|Ei ◊ P |2
r=
2
|Ei || P|2

and varies between 0 and 1. Because the vectors are defined with respect to different
coordinate systems, they must be converted to the global coordinate system to form the
projection. The toolbox function polloss computes the polarization mismatch between
an incident field and a polarized antenna.

To achieve maximum output power from a receiving antenna, the matched antenna
polarization vector must be the complex conjugate of the incoming field’s polarization
vector. As an example, if the incoming field is RHCP, with polarization vector given by
1
er = ( e x - ie y ) , the optimum receiver antenna polarization is LHCP. The introduction
2
of the complex conjugate is needed because field polarizations are described with respect
to its direction of propagation, whereas the polarization of a receive antenna is usually
specified in terms of the direction of propagation towards the antenna. The complex
conjugate corrects for the opposite sense of polarization when receiving.

As an example, if the transmitting antenna is transmits an RHCP field, the polarization


loss factors for various received antenna polarizations are

Receive Antenna Receive Antenna Polarization Loss Polarization Loss


Polarization Polarization Vector Factor Factor (dB)
Horizontal linear eH 1/2 3 dB
Vertical linear eV 1/2 3
RHCP 1 0 ∞
er = ( e x - ie y )
2
LHCP 1 1 0
el = ( e x + ie y )
2

Polarization Example
This example models a tracking radar based on a 31-by-31 (961-element) uniform
rectangular array (URA). The radar is designed to follow a moving target. At each

11-29
11 Using Polarization

time instant, the radar points in the known direction of the target. The basic radar
requirements are the probability of detection, pd, the probability of false alarm, pfa, the
maximum unambiguous range, max_range and the range resolution, range_res (all
distance units are in meters). The range_gate parameter limits the region of interest
to a range smaller than the maximum range. The operating frequency is set in fc. The
simulation lasts for numpulses pulses.
pd = 0.9; % Probability of detection
pfa = 1e-6; % Probability of false alarm
max_range = 1500*1000; % Maximum unambiguous range
range_res = 50.0; % Range resolution
rangegate = 5*1000; % Assume all objects are in this range
numpulses = 200; % Number of pulses to integrate
fc = 8e9; % Center frequency of pulse
c = physconst('LightSpeed');
tmax = 2*rangegate/c; % Time of echo from object at rangegate

Set the pulse repetition interval, PRI, and pulse repetition frequency, PRF, from the
maximum unambiguous range.
PRI = 2*max_range/c;
PRF = 1/PRI;

Set up the transmitted rectangular waveform using the


phased.RectangularWaveform System object. The waveform pulse width,
pulse_width, and pulse bandwidth, pulse_bw, are determined by the range resolution
you select, range_res. Specify the sampling rate, fs, to be twice the pulse bandwidth.
The sampling rate must be an integer multiple of the PRF. Therefore, modify the
sampling rate to satisfy this condition.
pulse_bw = c/(2*range_res); % Pulse bandwidth
pulse_width = 1/pulse_bw; % Pulse width
fs = 2*pulse_bw; % Sampling rate
% fs must be an integer multiple of the PRF.
% Insure that this is true by modifying the sampling frequency.
n = ceil(fs/PRF);
fs = n*PRF;
sWav = phased.RectangularWaveform(...
'PulseWidth',pulse_width,...
'PRF',PRF,...
'SampleRate',fs);

The array consists of short-dipole antenna elements. Using the


phased.ShortDipoleAntennaElement System object, create a short dipole antenna

11-30
Polarized Fields

element oriented along the z-axis. The frequency response of the element is chosen to lie
in the range of 5-10 gigahertz.

sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[5e9,10e9],'AxisDirection','Z');

Define a 31-by-31 Taylor tapered uniform rectangular array using the phased.URA
System object. Set the size of the array using the number of rows, numRows, and the
number of columns, numCols. The distance between elements, d, is slightly smaller
than one-half the wavelength, lambda. Compute the array taper, tw, using separate
Taylor windows for the row and column directions. Obtain the Taylor weights using
the taylorwin function. Plot the 3-D array response using the array phased.URA/
plotResponse method.

numCols = 31;
numRows = 31;
lambda = c/fc;
d = 0.9*lambda/2; % Nominal spacing
wc = taylorwin(numCols);
wr = taylorwin(numRows);
tw = wr*wc';
sArray = phased.URA('Element',sSD,'Size',[numCols,numRows],...
'ElementSpacing',[d,d],'Taper',tw);
plotResponse(sArray,fc,c,'Format','Polar','Polarization','V',...
'RespCut','3D');

11-31
11 Using Polarization

Next, set the properties of the radar platform in the phased.Platform System
object. The radar is assumed to be stationary and positioned at the origin of the global
coordinate system. Set the Velocity property to [0,0,0] and the InitialPosition
property to [0,0,0]. Set the OrientationAxes property to the identity matrix to align
the radar platform coordinate axes with the global coordinate system.

radarPlatformAxes = [1 0 0;0 1 0;0 0 1];


sRadarPlatform = phased.Platform('InitialPosition',[0;0;0],...
'Velocity',[0;0;0],...

11-32
Polarized Fields

'OrientationAxes',radarPlatformAxes);

In a radar system, the signal propagates in the form of an electromagnetic wave.


The signal is radiated and collected by the antennas used in the radar system.
Associate the array with a radiator phased.Radiator System object and two collector
phased.Collector System objects. Set the WeightsInputPort property of the
radiator to true to enable dynamic steering of the transmitted signal at each call of
the radiator’s step method. Creating the two collectors allows for collection of both
horizontal and vertical polarization components.
sRadiator = phased.Radiator(...
'Sensor',sArray,...
'OperatingFrequency',fc,...
'PropagationSpeed',c,...
'CombineRadiatedSignals',true,...
'EnablePolarization',true,...
'WeightsInputPort',true);
sCollector = phased.Collector(...
'Sensor',sArray,...
'OperatingFrequency',fc,...
'PropagationSpeed',c,...
'Wavefront','Plane',...
'EnablePolarization',true,...
'WeightsInputPort',false);
sCollector2 = phased.Collector(...
'Sensor',sArray,...
'OperatingFrequency',fc,...
'PropagationSpeed',c,...
'Wavefront','Plane',...
'EnablePolarization',true,...
'WeightsInputPort',false);

Estimate the peak power used in the phased.Transmitter System object to calculate
the desired radiated power levels. The transmitted peak power is the power required
to achieve a minimum-detection SNR, snr_min. You can determine the minimum SNR
from the probability of detection, pd, and the probability of false alarm, pfa, using the
albersheim function. Then, compute the peak power from the radar equation using
the radareqpow function. Among the inputs to this function are the overall signal gain,
which is the sum of the transmitting element gain, TransmitterGain and the array
gain, AG. Another input is the maximum detection range, rangegate. Finally, you need
to supply a target cross-section value, tgt_rcs. A scalar radar cross section is used in
this code section as an approximation even though the full polarization computation later
uses a 2-by-2 radar cross section scattering matrix.

11-33
11 Using Polarization

snr_min = albersheim(pd, pfa, numpulses);


AG = 10*log10(numCols*numRows);
tgt_rcs = 1; % Required target radar cross section
TransmitterGain = 20;
% Compute peak power per element
peak_power = radareqpow(lambda,rangegate,snr_min,...
sWav.PulseWidth,...
'RCS',tgt_rcs,...
'Gain',TransmitterGain + AG);
% Create a transmitter object
sTX = phased.Transmitter(...
'PeakPower',peak_power,...
'Gain',TransmitterGain,...
'LossFactor',0,...
'InUseOutputPort',true,...
'CoherentOnTransmit',true);

Create a rotating target object and a moving target platform. The rotating target is
represented later as an angle-dependent scattering matrix.
targetSpeed = 1000; % m/s
targetVec = [-1;1;0]/sqrt(2);
sTarget = phased.RadarTarget(...
'EnablePolarization',true,...
'Mode','Monostatic',...
'ScatteringMatrixSource','Input port',...
'OperatingFrequency',fc);
targetPlatformAxes = [1 0 0;0 1 0;0 0 1];
targetRotRate = 45; % degrees per sec
sTargetPlatform = phased.Platform(...
'InitialPosition',[3500.0; 0; 0],...
'Velocity', targetSpeed*targetVec,...
'OrientationAxes',targetPlatformAxes);

Set up the following System objects

• a steering vector using phased.SteeringVector System object


• a beamformer using phased.PhaseShiftBeamformer System object. The
DirectionSource property is set to 'Input Port' to enable the beamformer to always
points towards the known target direction at each call to its step method.
• a free-space propagator using phased.FreeSpace System object
• a receiver preamp model using phased.ReceiverPreamp System object.
sSV = phased.SteeringVector('SensorArray',sArray,...

11-34
Polarized Fields

'PropagationSpeed',c,...
'IncludeElementResponse',false);
% Create the receiving beamformer
sBF = phased.PhaseShiftBeamformer('SensorArray',sArray,...
'OperatingFrequency',fc,'PropagationSpeed',c,...
'DirectionSource','Input port');
% Define free space propagation channel
sFS = phased.FreeSpace(...
'SampleRate',fs,...
'TwoWayPropagation',true,...
'OperatingFrequency',fc);
% Define a receiver with receiver noise
sRX = phased.ReceiverPreamp('Gain',20,...
'LossFactor',0,...
'NoiseFigure',1,...
'ReferenceTemperature',290,...
'SampleRate',fs,...
'EnableInputPort',true,...
'PhaseNoiseInputPort',false,...
'SeedSource','Auto');

Allocate MATLAB arrays to store the processing results for later plotting.
sig_max_V = zeros(1,numpulses);
sig_max_H = zeros(1,numpulses);
tm_V = zeros(1,numpulses);
tm_H = zeros(1,numpulses);

After all the System objects are created, loop over the number of pulses to create the
reflected signals. Perform all the processing by invoking the step method for each
System object.
maxsamp = ceil(tmax*fs);
fast_time_grid = [0:(maxsamp-1)]/fs;
rotangle = 0.0;
for m = 1:numpulses
x = step(sWav); % Generate pulse
% Capture only samples within range gated
x = x(1:maxsamp);
[s, tx_status] = step(sTX,x); % Create transmitted pulse
% Move the radar platform and target platform.
[radarPos,radarVel] = step(sRadarPlatform,1/PRF);
[targetPos,targetVel] = step(sTargetPlatform,1/PRF);
% Compute the known target angle
[targetRng,targetAng] = rangeangle(targetPos,...

11-35
11 Using Polarization

radarPos,...
radarPlatformAxes);
% Compute the radar angle with respect to the target axes.
[radarRng,radarAng] = rangeangle(radarPos,...
targetPos,...
targetPlatformAxes);
% Calculate the steering vector designed to track the target
sv = step(sSV,fc,targetAng);
% Radiate the polarized signal toward the targat
tsig1 = step(sRadiator,...
s,...
targetAng,...
radarPlatformAxes,...
conj(sv));
% Compute the two-way propagation loss (4*pi*R/lambda)^2
tsig2 = step(sFS,...
tsig1,...
radarPos,...
targetPos,...
radarVel,...
targetVel);
% Create a very simple model of a changing scattering matrix
scatteringMatrix = [cosd(rotangle),0.5*sind(rotangle);...
0.5*sind(rotangle),cosd(rotangle)];
rsig1 = step(sTarget,...
tsig2,...
radarAng,...
targetPlatformAxes,...
scatteringMatrix); % Reflect off target
% Collect the vertical component of the radiation.
rsig3V = step(sCollector,...
rsig1,...
targetAng,...
radarPlatformAxes);
% Collect the horizontal component of the radiation. This
% second collector is rotated around the x-axis to be more
% sensitive to horizontal polarization
rsig3H = step(sCollector2,...
rsig1,...
targetAng,...
rotx(90)*radarPlatformAxes);
% Add receiver noise to both sets of signals
rsig4V = step(sRX,rsig3V,~(tx_status>0)); % Receive signal
rsig4H = step(sRX,rsig3H,~(tx_status>0)); % Receive signal

11-36
Polarized Fields

% Beamform the signal


rsigV = step(sBF,rsig4V,targetAng); % Beamforming
rsigH = step(sBF,rsig4H,targetAng); % Beamforming
% Find the maximum returns for each pulse and store them in
% a vector. Store the pulse received time as well.
[sigmaxV,imaxV] = max(abs(rsigV));
[sigmaxH,imaxH] = max(abs(rsigH));
sig_max_V(m) = sigmaxV;
sig_max_H(m) = sigmaxH;
tm_V(m) = fast_time_grid(imaxV) + (m-1)*PRI;
tm_H(m) = fast_time_grid(imaxH) + (m-1)*PRI;

% Update the orientation of the target platform axes


targetPlatformAxes = ...
rotx(PRI*targetRotRate)*targetPlatformAxes;
rotangle = rotangle + PRI*targetRotRate;
end

Plot the vertical and horizontal polarization for each pulse as a function of time.

figure(2);
plot(tm_V,sig_max_V,'.'); hold on;
plot(tm_H,sig_max_H,'r.'); hold off;
xlabel('Time (sec)')
ylabel('Amplitude');
title('Vertical and Horizontal Polarization Components');
legend('Vertical','Horizontal');
grid on;

11-37
11 Using Polarization

11-38
12

Antenna and Array Definitions


12 Antenna and Array Definitions

Element and Array Radiation and Response Patterns


In this section...
“Element Response and Radiation Patterns” on page 12-2
“Array Response and Radiation Patterns” on page 12-6

Element Response and Radiation Patterns


Antennas and acoustic transducers create radiated fields which propagate outwards
into space or into the air and water for acoustics. Conversely, antennas and transducers
react to impinging fields to produce output voltages. The electromagnetic fields created
by an antenna, or the acoustic field created by a transducer (called a speaker in speech
acoustics or hydrophone in ocean acoustics), depend on the distance from the sources and
the direction specified by angular coordinates. The terms response pattern and radiation
pattern are often used interchangeably but the term radiation pattern is mostly used to
describe the field radiated by an element and the term response pattern is mostly used
to describe the output of the antenna with respect to impinging wave field as a function
of wave direction. By the principle of reciprocity, these two patterns are identical. When
discussing the generation of the patterns, it is conceptually easier to think in terms of
radiation patterns.

In radar and sonar applications, the interactions between fields and targets take place in
the far-field region, often called the Fraunhofer region. The far-field region is defined as
the region for which
r≫λ2/L
where L represents the largest dimension of the source. In the far-field region, the fields
take a special form: they can be written as the product of a function of direction (such
as azimuth and elevation angles) and a geometric fall-off function, 1/r. It is the angular
function that is called the radiation pattern, response pattern, or simply pattern.

Radiation patterns can be viewed as field patterns or as power patterns. We shall


often add the term “field” or “power” to be more specific: contrast element field pattern
versus element power pattern. The radiation power pattern describes the field's radiant
intensity as a function of direction. Power units are watts/steradian.

Element field patterns

The element field response or element field pattern represents the angular distribution of
the electromagnetic field create by an antenna, E(θ,φ), or the scalar acoustic field, p(θ,φ),

12-2
Element and Array Radiation and Response Patterns

generated by an acoustic transducer such as a speaker or hydrophone. Because the far


field electromagnetic field consists of horizontal and vertical components orthogonal,
(EH(θ,φ), EV(θ,φ)) there may be different patterns for each component. Acoustic fields are
scalar fields so there is only one pattern. The general form of any field or field component
is

e-ikr
Af (q ,f )
r

where A is a nominal field amplitude and f(θ,φ) is the normalized field pattern
(normalized to unity). Because the field patterns are evaluated at some reference
distance from the source, the fields returned by the element’s step method are
represented simply as A f(θ,φ). You can display the nominal element field pattern by
invoking the element's plotResponse method, choosing 'Units' parameter value as
'mag' and setting the 'NormalizeResponse' parameter to false

plotResponse(elem,'NormalizeResponse', false,'Unit','mag');
You can view the normalized field pattern by setting the 'NormalizeResponse'
parameter value to true. For example, if EH(θ,φ) is the horizontal component of the
complex electromagnetic field, its normalized field pattern is given by |EH(θ,φ)|/EH,max|.

plotResponse(elem,'Polarization','H','NormalizeResponse', true,'Unit','mag');

Element power patterns

The element power response (or element power radiation pattern) is defined as the angular
distribution of the radiant intensity in the far field, Urad(θ,φ). When the elements are
used for reception, the patterns are interpreted as the sensitivity of the element to
radiation arriving from direction (θ,φ) and the power pattern represents the output
voltage power of the element as a function of wave arrival direction.

Physically, the radiant intensity for the electromagnetic field produced by an antenna
element is given by

r2
U rad (q , f) =
2 Z0
(| EH |2 + | EV |2 )
where Z0 is the characteristic impedance of free space. The radiant intensity of an
acoustic field is given by

12-3
12 Antenna and Array Definitions

r2
U rad (q , f) = | p|2
2Z

where Z is the characteristic impedance of the acoustic medium. For the fields produced
by the Phased Array System Toolbox element System objects, the radial dependence,
the impedances and field magnitudes are all collected in the nominal field amplitudes
defined above. Then the radiant intensity can generally be written

U rad (q , f) =| Af (q , f)|2

The radiant intensity pattern is the quantity returned by the elements plotResponse
method when the 'NormalizeResponse' parameter is set to false and the 'Unit'
parameter is set to 'pow' (or 'db' for decibels).

plotResponse(elem,'NormalizeResponse',false,'Unit','pow');
The normalized power pattern is defined as the radiant intensity divided by its maximum
value

Urad (q ,f)
U norm (q ,f ) = =| f (q ,f )|2
U rad, max

The plotResponse method returns a normalized power pattern when the


'NormalizeResponse' parameter is set to true and the 'Unit' parameter is set to
'pow' (or 'db' for decibels).

plotResponse(elem,'NormalizeResponse',true,'Unit','pow');

Element directivity

Element directivity measures the capability of an antenna or acoustic transducer to


radiate or receive power preferentially in a particular direction. Sometimes it is referred
to as directive gain. Directivity is measured by comparing the transmitted radiant
intensity in a given direction to the radiant intensity transmitted by an isotropic radiator
with the same total transmitted power. An isotropic radiator radiates equal power in
all directions. The radiant intensity of an isotropic radiator is just the total transmitted
power divided by the solid angle of a sphere, 4π,

iso Ptotal
U rad (q , f) =
4p

12-4
Element and Array Radiation and Response Patterns

The element directivity is defined to be

Urad (q ,f ) U rad (q , f)
D(q ,f ) = = 4p
iso Ptotal
Urad

By this definition, the integral of the directivity over a sphere surrounding the element is
exactly 4π. Directivity is related to the effective beamwidth of an element. Start with an
ideal antenna that has a uniform radiation field over a small solid angle (its beamwidth),
ΔΩ, in a particular direction, and zero outside that angle. The directivity is

Urad (q ,f ) 4p
D(q ,f ) = 4p =
Ptotal DW

The greater the directivity, the smaller the beamwidth.

The radiant intensity can be expressed in terms of the directivity and the total power

1
U rad (q , f) = D(q ,f ) Ptotal
4p

As an example, the directivity of the electric field of a z-oriented short-dipole antenna


element is given by

3
D(q ,f ) = cos2 q
2

Often, the largest value of D(θ,φ) is specified as an antenna operating parameter. The
direction in which D(θ,φ) is largest is the direction of maximum power radiation. This
direction is often called the boresight direction. In some of the literature, the maximum
value itself is called the directivity, reserving the phrase directive gain for what is called
here directivity. For the short-dipole antenna, the maximum value of directivity occurs
at θ = 0, independent of φ, and attains a value of 3/2. The concept of directivity applies
to receiving antennas as well. It describes the output power as a function of the arrival
direction of a plane wave impinging upon the antenna. By reciprocity, the directivity of
a receiving antenna is the same as that for a transmitting antenna. A quantity closely
related to directivity is element gain. The definition of directivity assumes that all the
power fed to the element is radiated to space. In reality, system losses reduce the radiant
intensity by some factor, the element efficiency, η. The term Ptotal becomes the power

12-5
12 Antenna and Array Definitions

supplied to the antenna and Prad becomes the power actually radiated into space. Then,
Prad = ηPtotal. The element gain is defined by

Urad (q ,f ) U (q , f)
G (q , f) = 4p = 4ph rad = h D(q ,f )
Ptotal Prad

and represents the power radiated away from the element compared to the total power
supplied to the element.

Using the element’s plotResponse method, you can plot the directivity of an element by
setting the 'Unit' parameter to 'dbi',

plotResponse(elem,'Unit','dbi');

Array Response and Radiation Patterns


Array magnitude and power patterns

When individual antenna elements are aggregated into arrays of elements, new response/
radiation patterns are created which depend upon both the element patterns and the
geometry of the array. These patterns are called beampatterns to reflect the fact that
the pattern may be constructed to have a very narrow angular distribution, i.e. a beam.
This term is used for an array in transmitting or receiving modes. Most often, but not
always, the array consists of identical antennas. The identical antenna case is interesting
because it lets us partition the radiation pattern into two components: one component
describes the element radiation pattern and the second describes the array radiation
pattern.

Just as an array of transmitting elements has a radiation pattern, an array of receiving


elements has a response pattern which describes how the output voltage of the array
changes with the direction of arrival of an plane incident wave. By reciprocity, the
response pattern is identical to the radiation pattern.

For transmitting arrays, the voltage driving the elements may be phase-adjusted to
allow the maximum radiant intensity to be transmitted in a particular direction. For
receiving arrays, the arriving signals may be phase adjusted to maximize the sensitivity
in a particular direction.

Start with a simple model of the radiation field produced by a single antenna which is
given by

12-6
Element and Array Radiation and Response Patterns

e-ikr
y(q ,f , r) = Af (q ,f )
r

where A is the field amplitude and f((θ,φ) is the normalized element field pattern. This
field may represent any of the components of the electric field, a scalar field, or an
acoustic field. For an array of identical elements, the output of the array is the weighted
sum of the individual elements, using the complex weights, wm

M -1 - ikrm
e
z(q ,f , r) = A Â wm* f (q ,f ) rm
m= 0

where rm is the distance from the mth element source point to the field point. In the far-
field region, this equation takes the form

M -1
e-ikr
z(q ,f , r) = A f (q ,f ) Â w*m e-iku •x m
r m= 0

where xm are the vector positions of the array elements with respect to the array origin.
u is the unit vector from the array origin to the field point. This equation can be written
compactly is the form

e-ikr
z(q ,f , r) = A f (q ,f ) w H s
r

The term wHs is called the array factor, Farray(θ,φ). The vector s is the steering vector (or
array manifold vector) for directions of propagation for transmit arrays or directions of
arrival for receiving arrays

s(q ,f) = {º , eiku •x m ,º}

The total array pattern consists of an amplitude term, an element pattern, f(θ,φ), and an
array factor, Farray(θ,φ). The total angular behavior of the array pattern, B(θ,φ), is called
the beampattern of the array

e-ikr e-ikr e-ikr


z(q ,f , r) = A f (q ,f ) w H s = A f (q , f) Farray (q , f) = A B(q ,f )
r r r

12-7
12 Antenna and Array Definitions

When evaluated at the reference distance, the array field pattern has the form

Af (q ,f )w H s = Af (q ,f ) Farray (q ,f ) = AB(q ,f )

The plotResponse method, when the 'NormalizeResponse' parameter is set to


false and the 'Unit' parameter is set to 'mag', returns the magnitude of the array
field pattern at the reference distance.
plotResponse(array,'NormalizeResponse',false,'Unit','mag');
When the 'NormalizeResponse' parameter is set to true, the plotResponse method
returns a pattern normalized to unity.
plotResponse(array,'NormalizeResponse',true,'Unit','mag');

The array power pattern is given by

| Af (q ,f ) w Hs|2 =| Af (q , f) Farray (q ,f )|2 =| AB(q ,f )|2

The plotResponse method, when the 'NormalizeResponse' parameter is set to


false and the 'Unit' parameter is set to 'pow' or 'db', returns the array power
pattern at the reference distance.
plotResponse(array,'NormalizeResponse',false,'Unit','pow');
When the 'NormalizeResponse' parameter is set to true, the plotResponse method
returns the power pattern normalized to unity.
plotResponse(array,'NormalizeResponse',true,'Unit','pow');

For the conventional beamformer, the weights are chosen to maximize the power
transmitted towards a particular direction, or in the case of receiving arrays, to maximize
the response of the array for a particular arrival direction. If u0 is the desired pointing
direction, then the weights which maximize the power and response in this direction
have the general form

w =|wm | e-iku0 •x m

For these weights, the array factor becomes

M -1
Farray (q ,f ) = Â |wm |e -ik(u - u )•x
0 m

m =0

12-8
Element and Array Radiation and Response Patterns

which has a maximum at u = u0.

Array directivity

Array directivity is defined the same way as element directivity: the radiant intensity
in a specific direction divided by the isotropic radiant intensity. The isotropic radiant
intensity is the array’s total radiated power divided by 4π. In terms of the arrays weights
and steering vectors, the directivity can be written as

| Af (q ,f ) w H s|2
D(q ,f ) = 4p
Ptotal

where Ptotal is the total radiated power from the array. In a discrete implementation, the
total radiated power can be computed by summing intensity values over a uniform grid of
angles that covers the full sphere surrounding the array

M -1 N -1
2p 2
Ptotal = Â Â |Af (q m ,fn ) w H s(q m ,fn )|2 cos qm
MN m =0 n = 0

where M is the number of elevation grid points and N is the number of azimuth grid
points.

Because the radiant intensity is proportional to the beampattern, B(θ,φ), the directivity
can also be written in terms of the beampattern

| B(q ,f )|2
D(q ,f ) = 4p
Ú|B(q ,f )|
2
cos q dq df

You can plot the directivity of an array by setting the 'Unit' parameter of the
plotResponse methods to 'dbi',

plotResponse(array,'Unit','dbi');

Array gain

In the Phased Array System Toolbox, array gain is defined to be the array SNR gain.
Array gain measures the improvement in SNR of a receiving array over the SNR for a
single element. Because an array is a spatial filter, the array SNR depends upon the

12-9
12 Antenna and Array Definitions

spatial properties of the noise field. When the noise is spatially isotropic, the array gain
takes a simple form

SNR array |w H s|2


G= =
SNRelement wHw

In addition, for an array with uniform weights, the array gain for an N-element array
has a maximum value at boresight of N, (or 10logN in db).

12-10
13

Code Generation

• “Code Generation” on page 13-2


• “Generate MEX Function to Estimate Directions of Arrival” on page 13-12
• “Generate MEX Function Containing Persistent System Objects ” on page 13-15
• “Functions and System Objects Supported for C/C++ Code Generation” on page
13-18
13 Code Generation

Code Generation
In this section...
“Code Generation Use and Benefits” on page 13-2
“Limitations Specific to Phased Array System Toolbox” on page 13-3
“General Limitations” on page 13-6
“Limitations for System Objects that Require Dynamic Memory Allocation” on page
13-11

Code Generation Use and Benefits


You can use the Phased Array System Toolbox software together with the MATLAB
Coder™ product to create C/C++ code that implements your MATLAB functions and
models. With this software, you can

• Create a MEX file to speed up your own MATLAB application.


• Generate a stand-alone executable that runs independently of MATLAB on your own
computer or another platform.
• Include System objects in the same way as any other element.

In general, the code you generate using the toolbox is portable ANSI® C code. In order
to use code generation, you need a MATLAB Coder license. Using Phased Array System
Toolbox software requires licenses for both the DSP System Toolbox™ and the Signal
Processing Toolbox™. See the “Getting Started with MATLAB Coder” page for more
information.

Creating a MATLAB Coder MEX-file can lead to substantial acceleration of your


MATLAB algorithms. It is also a convenient first step in a workflow that ultimately leads
to completely standalone code. When you create a MEX-file, it runs in the MATLAB
environment. Its inputs and outputs are available for inspection just like any other
MATLAB variable. You can use MATLAB’s visualization, and other tools, for verification
and analysis.

Within your code, you can run specific commands either as generated C code or by
running using the MATLAB engine. In cases where an isolated command does not yet
have code generation support, you can use the coder.extrinsic command to embed
the command in your code. This means that the generated code reenters the MATLAB
environment when it needs to run that particular command. This also useful if you wish
to embed certain commands that cannot generate code (such as plotting functions).

13-2
Code Generation

The simplest way to generate MEX-files from your MATLAB code is by using the
codegen function at the command line. Often, generating a MEX-files involves nothing
more than invoking the coder command on one of your existing functions. For example,
if you have an existing function, myfunction.m, you can type the commands at the
command line to compile and run the MEX function. codegen adds a platform-specific
extension to this name. In this case, the “mex” suffix is added.

codegen myfunction.m
myfunction_mex;

You can generate standalone executables that run independently of the MATLAB
environment. You can do this by creating a MATLAB Coder project inside the MATLAB
Coder Integrated Development Environment (IDE). Alternatively, you can issue the
codegen command in the command line environment with appropriate configuration
parameters. To create a standalone executable, you must write your own main.c or
main.cpp function. See “C/C++ Code Generation” for more information.

Set Up Your Compiler

Before using codegen to compile your code, you must set up your C/C++ compiler. For
32-bit Windows platforms, MathWorks® supplies a default compiler with MATLAB. If
your installation does not include a default compiler, you can supply your own compiler.
For the current list of supported compilers, see Supported and Compatible Compilers
on the MathWorks Web site. Install a compiler that is suitable for your platform. Then,
read “Setting Up the C or C++ Compiler”. After installation, at the MATLAB command
prompt, run mex -setup. You can then use the codegen function to compile your code.

Functions and System Objects That Support Code Generation

Almost all Phased Array System Toolbox functions and System objects are supported for
code generation. For a list of supported functions and System objects, see “Functions and
System Objects Supported for C/C++ Code Generation” on page 13-18.

Limitations Specific to Phased Array System Toolbox


Code Generation has the following limitations when used with the Phased Array System
Toolbox software:

• Passing arguments with variable-sized dimensions into any Phased Array System
Toolbox function or System object step method is not supported.

13-3
13 Code Generation

• When you employ antennas and arrays that produce polarized fields, the
EnablePolarization parameter for the phased.Collector, phased.Radiator, and
phased.WidebandCollector, phased.RadarTarget, phased.ArrayResponse,
and phased.SteeringVector System objects must be set to true. This requirement
differs from regular MATLAB usage where you can set EnablePolarization property
to false even when polarization is enabled. For example, this code uses a polarized
antenna, which requires that EnablePolarization property of the phased.Radiator
System object be set to true.
function [y] = codegen_radiator()
sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
c = physconst('LightSpeed');
fc = 200e6;
lambda = c/fc;
d = lambda/2;
sURA = phased.URA('Element',sSD,...
'Size',[3,3],...
'ElementSpacing',[d,d]);
sRad = phased.Radiator('Sensor',sURA,...
'OperatingFrequency',150e6,...
'CombineRadiatedSignals',true,...
'EnablePolarization',true);
x = [1;2;1];
radiatingAngle = [10;0]; % One angle for one antenna
y = step(sRad,x,radiatingAngle,eye(3,3));
• Visualization methods for Phased Array System Toolbox methods such
plotResponse and viewArray are not supported.
• When a System object contains another System object as a property value, you must
set the contained System object in the constructor. You cannot use Object.Property
notation to set the property. For example
sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
sURA = phased.URA('Element',sSD,...
'Size',[3,3],...
'ElementSpacing',[0.75,0.75]);

is valid for codegen but


sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
sURA = phased.URA('Size',[3,3],...

13-4
Code Generation

'ElementSpacing',[0.75,0.75]);
sURA.Element = sSD;

is not.
• A list of the limitations on Phased Array System Toolbox functions and System
objects is presented here:

Function or System Object Limitation


plotResponse This System object method is not
supported.
viewArray This System object method is not
supported.
blakechart This function is not supported.
polsignature Supported only when output arguments
are specified.
rocpfa The NonfluctuatingNoncoherent signal
type is not supported.
rocsnr The NonfluctuatingNoncoherent signal
type is not supported.
stokes Supported only when output arguments
are specified.
This System object is not supported.
phased.HeterogeneousConformalArray
phased.HeterogeneousULA This System object is not supported.
phased.HeterogeneousURA This System object is not supported.
phased.ArrayGain This System object cannot be
used with arrays containing
polarized antenna elements, that is,
phased.ShortDipoleAntennaElement
or
phased.CrossedDipoleAntennaElement
phased.MatchedFilter The CustomSpectrumWindow property is
not supported.
phased.RangeDopplerResponse The CustomRangeWindow and the
CustomDopplerWindow properties are
not supported.

13-5
13 Code Generation

General Limitations
Code Generation has some general limitations not specifically related to the Phased
Array System Toolbox software. For a more complete discussion, see “System Objects in
MATLAB Code Generation”.

• You cannot use cell arrays in your code.


• The data type and complexity (i.e., real or complex) of any input argument to a
function or System object must always remain the same.
• You can assign a nontunable System object property value only once before a step
method is executed. This requirement differs from MATLAB usage where you can
initialize these properties multiple times before the step method is executed.

This example sets the Size property twice.


function codegen_property
sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[0.9e8,2e9],'AxisDirection','Y');
sURA = phased.URA('Element',sSD,...
'Size',[3,3],...
'ElementSpacing',[0.15,0.15]);
sURA.Size = [4,4];

When you issue the command


codegen codegen_property

the following error message is produced: "A nontunable property may only be
assigned once."
• You cannot pass a System object to any method or function that you made extrinsic
using coder.extrinsic.
• You cannot load a MAT-file using coder.load when it contains a System object. For
example, if you construct a System object in the MATLAB environment and save it to
a MAT-file
sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[0.9e8,2e9],'AxisDirection','Y');
save x.mat sSD;
clear sSD;
then you cannot load the System object in your compiled MEX-file:
function codegen_load1()

13-6
Code Generation

W = coder.load('x.mat');
sSD = W.sSD;
The compilation

codegen codegen_load1
will produced an error message: ‘Found unsupported class for
variable using function 'coder.load'. MATLAB class
'phased.ShortDipoleAntennaElement' found at 'W.sSD' is
unsupported.’

To avoid this problem, you can save the object's properties to a MAT-file, then, use
coder.load to load the object properties and re-create the object. For example,
create and save a System object’s properties in the MATLAB environment

sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[0.9e8,2e9],'AxisDirection','Y');
FrequencyRange = sSD.FrequencyRange;
AxisDirection = sSD.AxisDirection;
save x.mat FrequencyRange AxisDirection;

Then, write a function codegen_load2 to load the properties and create a System
object.

function codegen_load2()
W = coder.load('x.mat');
sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',W.FrequencyRange,...
'AxisDirection',W.AxisDirection);
Then, issue the commands to create and execute the MEX-file, codegen_load2_mex.

codegen codegen_load2;
codegen_load2_mex
• Nontunable properties must be constant. A constant is a value that can be evaluated
at compile-time. System objects properties are either tunable or nontunable. You can
change tunable properties even if the object is locked. Unless otherwise specified,
System object properties are nontunable. Refer to the object's reference page to
determine whether an individual property is tunable or not. If you try to set a
nontunable System object property and the compiler determines that it is not
constant, you will get an error. For example, the phased.URA System object has a
nontunable property, ElementSpacing, which sets the distance between elements.
You may want to create an array that is tuned to a frequency. You cannot pass in the
frequency as an input argument because the frequency must be a constant.

13-7
13 Code Generation

function [resp] = codegen_const1(fc)


sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
c = physconst('LightSpeed');
lambda = c/fc;
d = lambda/2;
sURA = phased.URA('Element',sSD,...
'Size',[3,3],...
'ElementSpacing',[d,d]);
ang = [30;0];
resp = step(sURA,fc,ang);

When you codegen this function

fc = 200e6;
codegen codegen_const1 -args {fc}

the compiler responds that the value of the 'ElementSpacing' property, d, is not
constant and generates the error message: "Failed to compute constant value
for nontunable property 'ElementSpacing'. In code generation,
nontunable properties can only be assigned constant values." It is
not constant because it depends upon a non-constant variable, fc.

To correct this problem, set fc to a constant within the function:

function [resp] = codegen_const2()


sSD = phased.ShortDipoleAntennaElement(...
'FrequencyRange',[100e6,600e6],'AxisDirection','Y');
c = physconst('LightSpeed');
fc = 200e6;
lambda = c/fc;
d = lambda/2;
sURA = phased.URA('Element',sSD,...
'Size',[3,3],...
'ElementSpacing',[d,d]);
ang = [30;0];
resp = step(sURA,fc,ang);
and then compile

codegen codegen_const2
• In certain cases, the compiler cannot determine the values of nontunable properties
at compile time or the code may not even compile. Consider the following example

13-8
Code Generation

that reads in the x,y,z-coordinates of a 5-element array from a file and then, creates
a conformal array System object. The text file, elempos.txt, contains the element
coordinates

-0.5000 -0.2588 0 0.2588 0.5000


-0.8660 -0.9659 -1.0000 -0.9659 -0.8660
0 0 0 0 0
The file collectWave.m contains reads the element coordinates and creates the
object.

function y = collectWave(angle)
elPos = calcElPos;
cArr = phased.ConformalArray('ElementPosition',elPos);
y = collectPlaneWave(cArr,randn(4,2),angle,1e8);
end

function elPos = calcElPos


fid = fopen('elempos.txt','r');
el = textscan(fid, '%f');
n = length(el{1});
nelem = n/3;
fclose(fid);
elPos = reshape(el{1},nelem,3).';
end
Attempting to compile

codegen collectWave -args {[10 30]}


produces the error "Permissions 'r' and 'r+' are not supported".

The following example is a work-around that uses coder.extrinsic


and coder.const to insure that the value for the nontunable property,
'ElementPosition', is a compile time constant. The function in the file,
collectWave1.m, creates the object using the calcElPos function. This function
runs inside the MATLAB interpreter at compile time.

function y = collectWave1(angle)
coder.extrinsic('calcElPos')
elPos = coder.const(calcElPos);
cArr = phased.ConformalArray('ElementPosition',elPos);
y = collectPlaneWave(cArr,randn(4,2),angle,1e8);
end
The file calcElPos.m loads the element positions from the text file

function elPos = calcElPos

13-9
13 Code Generation

fid = fopen('elempos.txt','r');
el = textscan(fid, '%f');
n = length(el{1});
nelem = n/3;
fclose(fid);
elPos = reshape(el{1},nelem,3).';

Only the collectWave1.m file is compiled with codegen. Compiling and running

codegen collectWave1 -args {[10 30]}


collectWave1_mex([10,30])
will succeed.

An alternate work-around uses coder.load to insure that the value of the


nontunable property 'ElementPosition' is compile-time constant. In the
MATLAB environment, run calcElPos2 to save the array coordinates contained
in elempos.txt to a MAT-file. Then, load the contents of the MAT-file within the
compiled code.

function calcElPos2
fid = fopen('elempos.txt');
el = textscan(fid, '%f');
fclose(fid);
elPos = reshape(el{1},[],3).';
save('positions', 'elPos');
end
The file collectWave2.m loads the coordinate positions and creates the conformal
array object

function y = collectWave2(angle)
var = coder.load('positions');
cArr = phased.ConformalArray('ElementPosition',var.elPos);
y = collectPlaneWave(cArr,randn(4,2),angle,1e8);
end
Only the collectWave2.m file is compiled with codegen. Compiling and running
collectWave2.m

codegen collectWave2 -args {[10 30]}


collectWave2_mex([10,30])
will succeed. This second approach is more general than the first since a MAT-file can
contain any variables, except System objects.
• The System object clone method is not supported.

13-10
Code Generation

Limitations for System Objects that Require Dynamic Memory Allocation


System objects that require dynamic memory allocation cannot be used for code
generation in the following cases:

Inside a MATLAB Function block in a Simulink® model.


Inside a MATLAB function in a Stateflow® chart.
When using MATLAB as the action language in a Stateflow chart.
Inside a Truth Table block in a Simulink model.
Inside a MATLAB System block (except for normal mode).
When using Simulink Coder for code generation.
When using MATLAB Coder for code generation and dynamic memory allocation is
disabled.

13-11
13 Code Generation

Generate MEX Function to Estimate Directions of Arrival


Compile, using codegen, the function EstimateDOA.m. This function estimates the
directions-of-arrival (DOA’s) of two signals with added noise that are received by a
standard 10-element Uniform Line Array (ULA). The antenna operating frequency is 150
MHz and the array elements are spaced one-half wavelength apart. The actual direction
of arrival of the first signal is 10° azimuth, 20° elevation. The direction of arrival of the
second signal is 45° azimuth, 60° elevation. Signals and noise are generated using the
sensorsig function.
function [az] = EstimateDOA()
% Example:
% Estimate the DOAs of two signals received by a standard
% 10-element ULA with element spacing one half-wavelength apart.
% The antenna operating frequency is 150 MHz.
% The actual direction of the first signal is 10 degrees in
% azimuth and 20 degrees in elevation. The direction of the
% second signal is 45 degrees in azimuth and 60 degrees in
% elevation.
c = physconst('LightSpeed');
fc = 150e6;
lambda = c/fc;
fs = 8000;
nsamp = 8000;
sigma = 0.1;
ang = [10 20; 45 60]';
sIso = phased.IsotropicAntennaElement('FrequencyRange',[100e6,300e6]);
sULA = phased.ULA('Element',sIso,'NumElements',10,'ElementSpacing',lambda/2);
pos = getElementPosition(sULA)/lambda;
sig = sensorsig(pos,nsamp,ang,sigma^2);
sDOA = phased.RootMUSICEstimator('SensorArray',sULA,...
'OperatingFrequency',fc,...
'NumSignalsSource','Property','NumSignals',2);
doas = step(sDOA,sig);
az = broadside2az(sort(doas),[20,60]);
end

Run codegen at the command line to generate the mex function, EstimateDOA_mex,
and then run the mex function:
codegen EstimateDOA.m
EstimateDOA_mex

The estimated arrival angles are:

13-12
Generate MEX Function to Estimate Directions of Arrival

az =

10.0036 45.0030

The program contains a fixed value for the noise variance. If you wanted to reuse the
same code for different noise levels, you can pass the noise variance as an argument into
the function. This is done in the function EstimateDOA1.m, shown here, which has the
input argument sigma.

function [az] = EstimateDOA1(sigma)


% Example:
% Estimate the DOAs of two signals received by a standard
% 10-element ULA with element spacing one half-wavelength apart.
% The antenna operating frequency is 150 MHz.
% The actual direction of the first signal is 10 degrees in
% azimuth and 20 degrees in elevation. The direction of the
% second signal is 45 degrees in azimuth and 60 degrees in
% elevation.
c = physconst('LightSpeed');
fc = 150e6;
lambda = c/fc;
fs = 8000;
nsamp = 8000;
ang = [10 20; 45 60]';
sIso = phased.IsotropicAntennaElement('FrequencyRange',[100e6,300e6]);
sULA = phased.ULA('Element',sIso,'NumElements',10,'ElementSpacing',lambda/2);
pos = getElementPosition(sULA)/lambda;
sig = sensorsig(pos,nsamp,ang,sigma^2);
sDOA = phased.RootMUSICEstimator('SensorArray',sULA,...
'OperatingFrequency',fc,...
'NumSignalsSource','Property','NumSignals',2);
doas = step(sDOA,sig);
az = broadside2az(sort(doas),[20,60]);

Run codegen at the command line to generate the mex function, EstimateDOA1_mex,
using the -args option to specify the type of input argument. Then run the mex function
with several different input parameters:

codegen EstimateDOA1.m -args {1}


EstimateDOA1_mex(1)
az =
10.0130 45.0613
EstimateDOA1_mex(10)
az =

13-13
13 Code Generation

10.1882 44.3327
EstimateDOA1_mex(15)
az =
8.1620 46.2440

Increasing the value of sigma degrades the estimates of the azimuth angles.

13-14
Generate MEX Function Containing Persistent System Objects

Generate MEX Function Containing Persistent System Objects


Sometimes, it is convenient to put System objects inside a function that is to be called
many times. This eliminates the overhead in creating new instances of a System object
each time the function is called. You can write logic which creates the System object just
once and declares it to be persistent. For example, suppose you require the response
of an 11-element ULA for several different arrival angles and want to plot that response
versus angle.

function plot_ULA_response
azangles = [-90:90];
elangles = zeros(size(azangles));
fc = 100e9;
c = physconst('LightSpeed');
N = size(azangles,2);
lambda = c/fc;
d = 0.4*lambda;
numelements = 11;
resp = zeros(1,N);
sIso = phased.IsotropicAntennaElement(...
'FrequencyRange',[1,200]*1e9,...
'BackBaffled',false);
sULA = phased.ULA('Element',sIso,...
'NumElements',numelements,...
'ElementSpacing',d,...
'Taper',taylorwin(numelements).');
for n = 1:N
x = get_ULA_response(sULA,fc,azangles(n),elangles(n));
resp(n) = abs(x);
end
plot(azangles,20*log10(resp));
title('ULA Response');
xlabel('Angle (deg)');
ylabel('Response (db)');
grid;
end

function resp = get_ULA_response(sULA,fc,az,el)


persistent sAR;
c = physconst('LightSpeed');
if isempty(sAR)
sAR = phased.ArrayResponse('SensorArray',sULA,...
'PropagationSpeed',c,...

13-15
13 Code Generation

'WeightsInputPort',false,...
'EnablePolarization',false);
end
resp = step(sAR,fc,[az;el]);
end

To create the code, run codegento create the mex-file plot_ULA_response_mex, and
execute the mex-file at the command line:

codegen plot_ULA_response
plot_ULA_response_mex;
which yields the plot

13-16
Generate MEX Function Containing Persistent System Objects

13-17
13 Code Generation

Functions and System Objects Supported for C/C++ Code


Generation
Name Remarks and Limitations
Antenna and Microphone Elements
aperture2gain Does not support variable-size inputs.
azel2phithetapat Does not support variable-size inputs.
azel2uvpat Does not support variable-size inputs.
circpol2pol Does not support variable-size inputs.
gain2aperture Does not support variable-size inputs.
phased.CosineAntennaElement • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.CrossedDipoleAntennaElement • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.CustomAntennaElement • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.CustomMicrophoneElement • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.IsotropicAntennaElement • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.OmnidirectionalMicrophoneElement• plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.ShortDipoleAntennaElement • plotResponse and viewArray methods are
not supported.
• “Code Generation”.

13-18
Functions and System Objects Supported for C/C++ Code Generation

Name Remarks and Limitations


phitheta2azelpat Does not support variable-size inputs.
phitheta2uvpat Does not support variable-size inputs.
pol2circpol Does not support variable-size inputs.
polellip Does not support variable-size inputs.
polloss Does not support variable-size inputs.
polratio Does not support variable-size inputs.
polsignature • Does not support variable-size inputs.
• Supported only when output arguments are
specified.
stokes • Does not support variable-size inputs.
• Supported only when output arguments are
specified.
uv2azelpat Does not support variable-size inputs.
uv2phithetapat Does not support variable-size inputs.
Array Geometries and Analysis
az2broadside Does not support variable-size inputs.
broadside2az Does not support variable-size inputs.
phased.ArrayGain • Does not support arrays containing
polarized antenna elements, that is, the
phased.ShortDipoleAntennaElement or
phased.CrossedDipoleAntennaElement
antennas.
• “Code Generation”.
phased.ArrayResponse “Code Generation”.
phased.ConformalArray • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.ElementDelay “Code Generation”.

13-19
13 Code Generation

Name Remarks and Limitations


phased.PartitionedArray • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.ReplicatedSubarray • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.SteeringVector See “Code Generation”.
phased.ULA • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
phased.URA • plotResponse and viewArray methods are
not supported.
• “Code Generation”.
Signal Radiation and Collection
phased.Collector “Code Generation”.
phased.Radiator “Code Generation”.
phased.WidebandCollector • Requires dynamic memory allocation. See
“Limitations for System Objects that Require
Dynamic Memory Allocation”.
• “Code Generation”.
sensorsig Does not support variable-size inputs.
Waveforms
ambgfun Does not support variable-size inputs.
phased.FMCWWaveform “Code Generation”.
phased.LinearFMWaveform “Code Generation”.
phased.PhaseCodedWaveform “Code Generation”.
phased.RectangularWaveform “Code Generation”.
phased.SteppedFMWaveform “Code Generation”.
range2bw Does not support variable-size inputs.

13-20
Functions and System Objects Supported for C/C++ Code Generation

Name Remarks and Limitations


range2time Does not support variable-size inputs.
time2range Does not support variable-size inputs.
unigrid Does not support variable-size inputs.
Transmitters and Receivers
delayseq Does not support variable-size inputs.
noisepow Does not support variable-size inputs.
phased.ReceiverPreamp “Code Generation”.
phased.Transmitter “Code Generation”.
systemp Does not support variable-size inputs.
Beamforming
cbfweights Does not support variable-size inputs.
lcmvweights Does not support variable-size inputs.
mvdrweights Does not support variable-size inputs.
phased.FrostBeamformer • Requires dynamic memory allocation. See
“Limitations for System Objects that Require
Dynamic Memory Allocation”.
• “Code Generation”.
phased.LCMVBeamformer “Code Generation”.
phased.MVDRBeamformer “Code Generation”.
phased.PhaseShiftBeamformer “Code Generation”.
phased.SteeringVector “Code Generation”.
phased.SubbandPhaseShiftBeamformer “Code Generation”.
phased.TimeDelayBeamformer • Requires dynamic memory allocation. See
“Limitations for System Objects that Require
Dynamic Memory Allocation”.
• “Code Generation”.

13-21
13 Code Generation

Name Remarks and Limitations


phased.TimeDelayLCMVBeamformer • Requires dynamic memory allocation. See
“Limitations for System Objects that Require
Dynamic Memory Allocation”.
• “Code Generation”.
sensorcov Does not support variable-size inputs.
steervec Does not support variable-size inputs.
Direction of Arrival (DOA) Estimation
aictest Does not support variable-size inputs.
espritdoa Does not support variable-size inputs.
mdltest Does not support variable-size inputs.
phased.BeamscanEstimator “Code Generation”.
phased.BeamscanEstimator2D “Code Generation”.
phased.BeamspaceESPRITEstimator “Code Generation”.
phased.ESPRITEstimator “Code Generation”.
phased.MVDREstimator “Code Generation”.
phased.MVDREstimator2D “Code Generation”.
phased.RootMUSICEstimator “Code Generation”.
phased.RootWSFEstimator “Code Generation”.
phased.SumDifferenceMonopulseTracker “Code Generation”.
phased.SumDifferenceMonopulseTracker2D “Code Generation”.
rootmusicdoa Does not support variable-size inputs.
spsmooth Does not support variable-size inputs.
Space-Time Adaptive Processing (STAP)
dopsteeringvec Does not support variable-size inputs.
phased.ADPCACanceller “Code Generation”.
phased.AngleDopplerResponse “Code Generation”.
phased.DPCACanceller “Code Generation”.
phased.STAPSMIBeamformer “Code Generation”.

13-22
Functions and System Objects Supported for C/C++ Code Generation

Name Remarks and Limitations


val2ind Does not support variable-size inputs.
Signal Propagation and Environment
billingsleyicm Does not support variable-size inputs.
depressionang Does not support variable-size inputs.
effearthradius Does not support variable-size inputs.
fspl Does not support variable-size inputs.
grazingang Does not support variable-size inputs.
horizonrange Does not support variable-size inputs.
phased.BarrageJammer “Code Generation”.
phased.ConstantGammaClutter “Code Generation”.
phased.FreeSpace • Requires dynamic memory allocation. See
“Limitations for System Objects that Require
Dynamic Memory Allocation”.
• “Code Generation”.
phased.RadarTarget “Code Generation”.
physconst Does not support variable-size inputs.
surfacegamma Does not support variable-size inputs.
surfclutterrcs Does not support variable-size inputs.
Detection and System Analysis
albersheim Does not support variable-size inputs.
beat2range Does not support variable-size inputs.
dechirp Does not support variable-size inputs.
npwgnthresh Does not support variable-size inputs.
phased.CFARDetector “Code Generation”.
phased.MatchedFilter • The CustomSpectrumWindow property is
not supported.
• “Code Generation”.

13-23
13 Code Generation

Name Remarks and Limitations


phased.RangeDopplerResponse • The CustomRangeWindow and the
CustomDopplerWindow properties are not
supported.
• “Code Generation”.
phased.StretchProcessor “Code Generation”.
phased.TimeVaryingGain “Code Generation”.
pulsint Does not support variable-size inputs.
radareqpow Does not support variable-size inputs.
radareqrng Does not support variable-size inputs.
radareqsnr Does not support variable-size inputs.
radarvcd Does not support variable-size inputs.
range2beat Does not support variable-size inputs.
rdcoupling Does not support variable-size inputs.
rocpfa • Does not support variable-size inputs.
• The NonfluctuatingNoncoherent signal
type is not supported.
rocsnr • Does not support variable-size inputs.
• The NonfluctuatingNoncoherent signal
type is not supported.
shnidman Does not support variable-size inputs.
stretchfreq2rng Does not support variable-size inputs.
Motion Modeling and Coordinate Systems
azel2phitheta Does not support variable-size inputs.
azel2uv Does not support variable-size inputs.
azelaxes Does not support variable-size inputs.
cart2sphvec Does not support variable-size inputs.
dop2speed Does not support variable-size inputs.
global2localcoord Does not support variable-size inputs.
local2globalcoord Does not support variable-size inputs.

13-24
Functions and System Objects Supported for C/C++ Code Generation

Name Remarks and Limitations


phased.Platform “Code Generation”.
phitheta2azel Does not support variable-size inputs.
phitheta2uv Does not support variable-size inputs.
radialspeed Does not support variable-size inputs.
rangeangle Does not support variable-size inputs.
rotx Does not support variable-size inputs.
roty Does not support variable-size inputs
rotz Does not support variable-size inputs.
speed2dop Does not support variable-size inputs.
sph2cartvec Does not support variable-size inputs.
uv2azel Does not support variable-size inputs.
uv2phitheta Does not support variable-size inputs.

13-25
13-26
14

Define New System Objects

• “Define Basic System Objects” on page 14-2


• “Change Number of Step Inputs or Outputs” on page 14-4
• “Validate Property and Input Values” on page 14-8
• “Initialize Properties and Setup One-Time Calculations” on page 14-11
• “Set Property Values at Construction Time” on page 14-14
• “Reset Algorithm State” on page 14-16
• “Define Property Attributes” on page 14-18
• “Hide Inactive Properties” on page 14-22
• “Limit Property Values to Finite String Set” on page 14-24
• “Process Tuned Properties” on page 14-27
• “Release System Object Resources” on page 14-29
• “Define Composite System Objects” on page 14-31
• “Define Finite Source Objects” on page 14-34
• “Save System Object” on page 14-36
• “Load System Object” on page 14-39
• “Clone System Object” on page 14-42
• “Define System Object Information” on page 14-43
• “Methods Timing” on page 14-45
• “System Object Input Arguments and ~ in Code Examples” on page 14-48
• “What Are Mixin Classes?” on page 14-49
• “Best Practices for Defining System Objects” on page 14-50
14 Define New System Objects

Define Basic System Objects


This example shows how to create a basic System object that increments a number by
one.

The class definition file contains the minimum elements required to define a System
object.

Create the Class Definition File

1 Create a MATLAB file named AddOne.m to contain the definition of your System
object.
edit AddOne.m
2 Subclass your object from matlab.System. Insert this line as the first line of your
file.
classdef AddOne < matlab.System
3 Add the stepImpl method, which contains the algorithm that runs when users call
the step method on your object. You always set the stepImpl method access to
protected because it is an internal method that users do not directly call or run.

All methods, except static methods, expect the System object handle as the first
input argument. You can use any name for your System object handle.

In this example, instead of passing in the object handle, ~ is used to indicate that
the object handle is not used in the function. Using ~ instead of an object handle
prevents warnings about unused variables from occurring.

By default, the number of inputs and outputs are both one. To change the number
of inputs or outputs, use the getNumInputsImpl or getNumOutputsImpl method,
respectively.
methods (Access = protected)
function y = stepImpl(~,x)
y = x + 1;
end
end

Note: Instead of manually creating your class definition file, you can use an option on
the New > System Object menu to open a template. The Basic template opens a simple

14-2
Define Basic System Objects

System object template. The Advanced template includes more advanced features of
System objects, such as backup and restore. The Simulink Extension template includes
additional customizations of the System object for use in the Simulink MATLAB System
block. You then can edit the template file, using it as guideline, to create your own
System object.

Complete Class Definition File for Basic System Object


classdef AddOne < matlab.System
% ADDONE Compute an output value one greater than the input value

% All methods occur inside a methods declaration.


% The stepImpl method has protected access
methods (Access = protected)

function y = stepImpl(~,x)
y = x + 1;
end
end
end

See Also
matlab.System | getNumInputsImpl | getNumOutputsImpl | stepImpl

Related Examples
• “Change Number of Step Inputs or Outputs” on page 14-4

More About
• “System Design and Simulation in MATLAB”

14-3
14 Define New System Objects

Change Number of Step Inputs or Outputs


This example shows how to specify two inputs and two outputs for the step method.

If you specify the inputs and outputs to the stepImpl method, you do not need to
specify the getNumInputsImpl and getNumOutputsImpl methods. If you have
a variable number of inputs or outputs (using varargin or varargout), include the
getNumInputsImpl or getNumOutputsImpl method, respectively, in your class
definition file.

Note: You should only use getNumInputsImpl or getNumOutputsImpl methods to


change the number of System object inputs or outputs. Do not use any other handle
objects within a System object to change the number of inputs or outputs.

You always set the getNumInputsImpl and getNumOutputsImpl methods access to


protected because they are internal methods that users do not directly call or run.

Update the Algorithm for Multiple Inputs and Outputs


Update the stepImpl method to specify two inputs and two outputs. You do not need to
implement associated getNumInputsImpl or getNumOutputsImpl methods.
methods (Access = protected)
function [y1,y2] = stepImpl(~,x1,x2)
y1 = x1 + 1
y2 = x2 + 1;
end
end

Update the Algorithm and Associated Methods


Update the stepImpl method to use varargin and varargout. In this case, you must
implement the associated getNumInputsImpl and getNumOutputsImpl methods to
specify two or three inputs and outputs.
methods (Access = protected)
function varargout = stepImpl(obj,varargin)
varargout{1} = varargin{1}+1;
varargout{2} = varargin{2}+1;
if (obj.numInputsOutputs = 3)
varargout{3} = varargin{3}+1;
end

14-4
Change Number of Step Inputs or Outputs

end

function validatePropertiesImpl(obj)
if ~((obj.numInputsOutputs == 2) ||...
(obj.numInputsOutputs == 3))
error('Only 2 or 3 input and outputs allowed.');
end
end

function numIn = getNumInputsImpl(obj)


numIn = 3;
if (obj.numInputsOutputs == 2)
numIn = 2;
end
end

function numOut = getNumOutputsImpl(obj)


numOut = 3;
if (obj.numInputsOutputs == 2)
numOut = 2;
end
end
end

Use this syntax to run the algorithm with two inputs and two outputs.

x1 = 3;
x2 = 7;
[y1,y2] = step(AddOne,x1,x2);

To change the number of inputs or outputs, you must release the object before rerunning
it.

release(AddOne)
x1 = 3;
x2 = 7;
x3 = 10
[y1,y2,y3] = step(AddOne,x1,x2,x3);

Complete Class Definition File with Multiple Inputs and Outputs


classdef AddOne < matlab.System
% ADDONE Compute output values one greater than the input values

% This property is nontunable and cannot be changed

14-5
14 Define New System Objects

% after the setup or step method has been called.


properties (Nontunable)
numInputsOutputs = 3; % Default value
end

% All methods occur inside a methods declaration.


% The stepImpl method has protected access
methods (Access = protected)
function varargout = stepImpl(obj,varargin)
if (obj.numInputsOutputs = 2)
varargout{1} = varargin{1}+1;
varargout{2} = varargin{2}+1;
else
varargout{1} = varargin{1}+1;
varargout{2} = varargin{2}+1;
varargout{3} = varargin{3}+1;
end
end

function validatePropertiesImpl(obj)
if ~((obj.numInputsOutputs == 2) ||
(obj.numInputsOutputs == 3))
error('Only 2 or 3 input and outputs allowed.');
end
end

function numIn = getNumInputsImpl(obj)


numIn = 3;
if (obj.numInputsOutputs == 2)
numIn = 2;
end
end

function numOut = getNumOutputsImpl(obj)


numOut = 3;
if (obj.numInputsOutputs == 2)
numOut = 2;
end
end
end

14-6
Change Number of Step Inputs or Outputs

end

See Also
getNumInputsImpl | getNumOutputsImpl

Related Examples
• “Validate Property and Input Values” on page 14-8
• “Define Basic System Objects” on page 14-2

More About
• “System Object Input Arguments and ~ in Code Examples” on page 14-48

14-7
14 Define New System Objects

Validate Property and Input Values


This example shows how to verify that the user’s inputs and property values are valid.

Validate Properties

This example shows how to validate the value of a single property using
set.PropertyName syntax. In this case, the PropertyName is Increment.

methods
% Validate the properties of the object
function set.Increment(obj,val)
if val >= 10
error('The increment value must be less than 10');
end
obj.Increment = val;
end
end

This example shows how to validate the value of two interdependent properties using the
validatePropertiesImpl method. In this case, the UseIncrement property value
must be true and the WrapValue property value must be less than the Increment
property value.

methods (Access = protected)


function validatePropertiesImpl(obj)
if obj.UseIncrement && obj.WrapValue < obj.Increment
error('Wrap value must be less than increment value');
end
end
end

Validate Inputs

This example shows how to validate that the first input is a numeric value.

methods (Access = protected)


function validateInputsImpl(~,x)
if ~isnumeric(x)
error('Input must be numeric');
end
end

14-8
Validate Property and Input Values

end

Complete Class Definition File with Property and Input Validation


classdef AddOne < matlab.System
% ADDONE Compute an output value by incrementing the input value

% All properties occur inside a properties declaration.


% These properties have public access (the default)
properties (Logical)
UseIncrement = true
end

properties (PositiveInteger)
Increment = 1
WrapValue = 10
end

methods
% Validate the properties of the object
function set.Increment(obj, val)
if val >= 10
error('The increment value must be less than 10');
end
obj.Increment = val;
end
end

methods (Access = protected)


function validatePropertiesImpl(obj)
if obj.UseIncrement && obj.WrapValue < obj.Increment
error('Wrap value must be less than increment value');
end
end

% Validate the inputs to the object


function validateInputsImpl(~,x)
if ~isnumeric(x)
error('Input must be numeric');
end
end

function out = stepImpl(obj,in)


if obj.UseIncrement
out = in + obj.Increment;

14-9
14 Define New System Objects

else
out = in + 1;
end
end
end
end

Note: All inputs default to variable-size inputs. See “Change Input Complexity or
Dimensions” for more information.

See Also
validateInputsImpl | validatePropertiesImpl

Related Examples
• “Define Basic System Objects” on page 14-2

More About
• “Methods Timing” on page 14-45
• “Property Set Methods”
• “System Object Input Arguments and ~ in Code Examples” on page 14-48

14-10
Initialize Properties and Setup One-Time Calculations

Initialize Properties and Setup One-Time Calculations


This example shows how to write code to initialize and set up a System object.

In this example, you allocate file resources by opening the file so the System object can
write to that file. You do these initialization tasks one time during setup, rather than
every time you call the step method.

Define Public Properties to Initialize

In this example, you define the public Filename property and specify the value of that
property as the nontunable string, default.bin. Users cannot change nontunable
properties after the setup method has been called. Refer to the Methods Timing section
for more information.

properties (Nontunable)
Filename = 'default.bin'
end

Define Private Properties to Initialize

Users cannot access private properties directly, but only through methods of the System
object. In this example, you define the pFileID property as a private property. You also
define this property as hidden to indicate it is an internal property that never displays to
the user.

properties (Hidden,Access = private)


pFileID;
end

Define Setup

You use the setupImpl method to perform setup and initialization tasks. You should
include code in the setupImpl method that you want to execute one time only. The
setupImpl method is called once during the first call to the step method. In this
example, you allocate file resources by opening the file for writing binary data.

methods
function setupImpl(obj)
obj.pFileID = fopen(obj.Filename,'wb');
if obj.pFileID < 0
error('Opening the file failed');

14-11
14 Define New System Objects

end
end
end

Although not part of setup, you should close files when your code is done using them. You
use the releaseImpl method to release resources.

Complete Class Definition File with Initialization and Setup


classdef MyFile < matlab.System
% MyFile write numbers to a file

% These properties are nontunable. They cannot be changed


% after the setup or step method has been called.
properties (Nontunable)
Filename = 'default.bin' % the name of the file to create
end

% These properties are private. Customers can only access


% these properties through methods on this object
properties (Hidden,Access = private)
pFileID; % The identifier of the file to open
end

methods (Access = protected)


% In setup allocate any resources, which in this case
% means opening the file.
function setupImpl(obj)
obj.pFileID = fopen(obj.Filename,'wb');
if obj.pFileID < 0
error('Opening the file failed');
end
end

% This System object™ writes the input to the file.


function stepImpl(obj,data)
fwrite(obj.pFileID,data);
end

% Use release to close the file to prevent the


% file handle from being left open.
function releaseImpl(obj)
fclose(obj.pFileID);
end
end

14-12
Initialize Properties and Setup One-Time Calculations

end

See Also
releaseImpl | setupImpl | stepImpl

Related Examples
• “Release System Object Resources” on page 14-29
• “Define Property Attributes” on page 14-18

More About
• “Methods Timing” on page 14-45

14-13
14 Define New System Objects

Set Property Values at Construction Time


This example shows how to define a System object constructor and allow it to accept
name-value property pairs as input.

Set Properties to Use Name-Value Pair Input

Define the System object constructor, which is a method that has the same name as
the class (MyFile in this example). Within that method, you use the setProperties
method to make all public properties available for input when the user constructs the
object. nargin is a MATLAB function that determines the number of input arguments.
varargin indicates all of the object’s public properties.
methods
function obj = MyFile(varargin)
setProperties(obj,nargin,varargin{:});
end
end

Complete Class Definition File with Constructor Setup


classdef MyFile < matlab.System
% MyFile write numbers to a file

% These properties are nontunable. They cannot be changed


% after the setup or step method has been called.
properties (Nontunable)
Filename ='default.bin' % the name of the file to create
Access = 'wb' % The file access string (write, binary)
end

% These properties are private. Customers can only access


% these properties through methods on this object
properties (Hidden,Access = private)
pFileID; % The identifier of the file to open
end

methods
% You call setProperties in the constructor to let
% a user specify public properties of object as
% name-value pairs.
function obj = MyFile(varargin)
setProperties(obj,nargin,varargin{:});
end

14-14
Set Property Values at Construction Time

end

methods (Access = protected)


% In setup allocate any resources, which in this case is
% opening the file.
function setupImpl(obj)
obj.pFileID = fopen(obj.Filename,obj.Access);
if obj.pFileID < 0
error('Opening the file failed');
end
end

% This System object™ writes the input to the file.


function stepImpl(obj,data)
fwrite(obj.pFileID,data);
end

% Use release to close the file to prevent the


% file handle from being left open.
function releaseImpl(obj)
fclose(obj.pFileID);
end
end
end

See Also
nargin | setProperties

Related Examples
• “Define Property Attributes” on page 14-18
• “Release System Object Resources” on page 14-29

14-15
14 Define New System Objects

Reset Algorithm State


This example shows how to reset an object state.

Reset Counter to Zero

pCount is an internal counter property of the System object obj. The user calls the
reset method, which calls the resetImpl method. In this example , pCount resets to 0.

Note: When resetting an object’s state, make sure you reset the size, complexity, and
data type correctly.

methods (Access = protected)


function resetImpl(obj)
obj.pCount = 0;
end
end

Complete Class Definition File with State Reset

classdef Counter < matlab.System


% Counter System object™ that increments a counter

properties (Access = private)


pCount
end

methods (Access = protected)


% In step, increment the counter and return
% its value as an output
function c = stepImpl(obj)
obj.pCount = obj.pCount + 1;
c = obj.pCount;
end

% Reset the counter to zero.


function resetImpl(obj)
obj.pCount = 0;
end
end

14-16
Reset Algorithm State

end

See “Methods Timing” on page 14-45 for more information.

See Also
resetImpl

More About
• “Methods Timing” on page 14-45

14-17
14 Define New System Objects

Define Property Attributes


This example shows how to specify property attributes.

Property attributes, which add details to a property, provide a layer of control to your
properties. In addition to the MATLAB property attributes, System objects can use these
three additional attributes—nontunable, logical, and positiveInteger. To specify
multiple attributes, separate them with commas.

Specify Property as Nontunable

Use the nontunable attribute for a property when the algorithm depends on the value
being constant once data processing starts. Defining a property as nontunable may
improve the efficiency of your algorithm by removing the need to check for or react to
values that change. For code generation, defining a property as nontunable allows the
memory associated with that property to be optimized. You should define all properties
that affect the number of input or output ports as nontunable.

System object users cannot change nontunable properties after the setup or step
method has been called. In this example, you define the InitialValue property, and set
its value to 0.

properties (Nontunable)
InitialValue = 0;
end

Specify Property as Logical

Logical properties have the value, true or false. System object users can enter 1 or
0 or any value that can be converted to a logical. The value, however, displays as true
or false. You can use sparse logical values, but they must be scalar values. In this
example, the Increment property indicates whether to increase the counter. By default,
Increment is tunable property. The following restrictions apply to a property with the
Logical attribute,

• Cannot also be Dependent or PositiveInteger


• Default value must be true or false. You cannot use 1 or 0 as a default value.

properties (Logical)
Increment = true
end

14-18
Define Property Attributes

Specify Property as Positive Integer

In this example, the private property pCount is constrained to accept only real, positive
integers. You cannot use sparse values. The following restriction applies to a property
with the PositiveInteger attribute,

• Cannot also be Dependent or Logical


properties (PositiveInteger)
Count
end

Specify Property as DiscreteState

If your algorithm uses properties that hold state, you can assign those properties the
DiscreteState attribute . Properties with this attribute display their state values
when users call getDiscreteStateImpl via the getDiscreteState method. The
following restrictions apply to a property with the DiscreteState attribute,

• Numeric, logical, or fi value, but not a scaled double fi value


• Does not have any of these attributes: Nontunable, Dependent, Abstract,
Constant, or Transient.
• No default value
• Not publicly settable
• GetAccess = Public by default
• Value set only using the setupImpl method or when the System object is locked
during resetImpl or stepImpl

In this example, you define the Count property.


properties (DiscreteState)
Count;
end

Complete Class Definition File with Property Attributes


classdef Counter < matlab.System
% Counter Increment a counter to a maximum value

% These properties are nontunable. They cannot be changed


% after the setup or step method has been called.
properties (Nontunable)

14-19
14 Define New System Objects

% The inital value of the counter


InitialValue = 0
end
properties (Nontunable, PositiveInteger)
% The maximum value of the counter
MaxValue = 3
end

properties (Logical)
% Whether to increment the counter
Increment = true
end

properties (DiscreteState)
% Count state variable
Count
end

methods (Access = protected)


% In step, increment the counter and return its value
% as an output

function c = stepImpl(obj)
if obj.Increment && (obj.Count < obj.MaxValue)
obj.Count = obj.Count + 1;
else
disp(['Max count, ' num2str(obj.MaxValue) ',reached'])
end
c = obj.Count;
end

% Setup the Count state variable


function setupImpl(obj)
obj.Count = 0;
end

% Reset the counter to one.


function resetImpl(obj)
obj.Count = obj.InitialValue;
end
end

14-20
Define Property Attributes

end

More About
• “Class Attributes”
• “Property Attributes”
• “What You Cannot Change While Your System Is Running”
• “Methods Timing” on page 14-45

14-21
14 Define New System Objects

Hide Inactive Properties


This example shows how to hide the display of a property that is not active for a
particular object configuration.

Hide an inactive property

You use the isInactivePropertyImpl method to hide a property from displaying. If


the isInactiveProperty method returns true to the property you pass in, then that
property does not display.
methods (Access = protected)
function flag = isInactivePropertyImpl(obj,propertyName)
if strcmp(propertyName,'InitialValue')
flag = obj.UseRandomInitialValue;
else
flag = false;
end
end
end

Complete Class Definition File with Hidden Inactive Property


classdef Counter < matlab.System
% Counter Increment a counter

% These properties are nontunable. They cannot be changed


% after the setup or step method has been called.
properties (Nontunable)
% Allow the user to set the initial value
UseRandomInitialValue = true
InitialValue = 0
end

% The private count variable, which is tunable by default


properties (Access = private)
pCount
end

methods (Access = protected)


% In step, increment the counter and return its value
% as an output
function c = stepImpl(obj)
obj.pCount = obj.pCount + 1;

14-22
Hide Inactive Properties

c = obj.pCount;
end

% Reset the counter to either a random value or the initial


% value.
function resetImpl(obj)
if obj.UseRandomInitialValue
obj.pCount = rand();
else
obj.pCount = obj.InitialValue;
end
end

% This method controls visibility of the object's properties


function flag = isInactivePropertyImpl(obj,propertyName)
if strcmp(propertyName,'InitialValue')
flag = obj.UseRandomInitialValue;
else
flag = false;
end
end
end
end

See Also
isInactivePropertyImpl

14-23
14 Define New System Objects

Limit Property Values to Finite String Set


This example shows how to limit a property to accept only a finite set of string values.

Specify a Set of Valid String Values

String sets use two related properties. You first specify the user-visible property name
and default string value. Then, you specify the associated hidden property by appending
“Set” to the property name. You must use a capital “S” in “Set.”

In the “Set” property, you specify the valid string values as a cell array of the
matlab.system.Stringset class. This example uses Color and ColorSet as the
associated properties.
properties
Color = 'blue'
end

properties (Hidden,Transient)
ColorSet = matlab.system.StringSet({'red','blue','green'});
end

Complete Class Definition File with String Set


classdef Whiteboard < matlab.System
% Whiteboard Draw lines on a figure window
%
% This System object™ illustrates the use of StringSets

properties
Color = 'blue'
end

properties (Hidden,Transient)
% Let them choose a color
ColorSet = matlab.system.StringSet({'red','blue','green'});
end

methods (Access = protected)


function stepImpl(obj)
h = Whiteboard.getWhiteboard();
plot(h, ...
randn([2,1]),randn([2,1]), ...
'Color',obj.Color(1));

14-24
Limit Property Values to Finite String Set

end
function releaseImpl(obj)
cla(Whiteboard.getWhiteboard());
hold on
end
end

methods (Static)
function a = getWhiteboard()
h = findobj('tag','whiteboard');
if isempty(h)
h = figure('tag','whiteboard');
hold on
end
a = gca;
end
end
end

String Set System Object Example


%%
% Each call to step draws lines on a whiteboard

%% Construct the System object


hGreenInk = Whiteboard;
hBlueInk = Whiteboard;

% Change the color


% Note: Press tab after typing the first single quote to
% display all enumerated values.
hGreenInk.Color = 'green';
hBlueInk.Color = 'blue';

% Take a few steps


for i=1:3
hGreenInk.step();
hBlueInk.step();
end

%% Clear the whiteboard


hBlueInk.release();

%% Display System object used in this example

14-25
14 Define New System Objects

type('Whiteboard.m');

See Also
matlab.system.StringSet

14-26
Process Tuned Properties

Process Tuned Properties


This example shows how to specify the action to take when a tunable property value
changes during simulation.

The processTunedPropertiesImpl method is useful for managing actions to prevent


duplication. In many cases, changing one of multiple interdependent properties causes
an action. With the processTunedPropertiesImpl method, you can control when that
action is taken so it is not repeated unnecessarily.

Control When a Lookup Table Is Generated

This example of processTunedPropertiesImpl causes the pLookupTable to be


regenerated when either the NumNotes or MiddleC property changes.
methods (Access = protected)
function processTunedPropertiesImpl(obj)
obj.pLookupTable = obj.MiddleC * ...
(1+log(1:obj.NumNotes)/log(12));
end
end

Complete Class Definition File with Tuned Property Processing


classdef TuningFork < matlab.System
% TuningFork Illustrate the processing of tuned parameters
%

properties
MiddleC = 440
NumNotes = 12
end

properties (Access = private)


pLookupTable
end

methods (Access = protected)


function resetImpl(obj)
obj.MiddleC = 440;
obj.pLookupTable = obj.MiddleC * ...
(1+log(1:obj.NumNotes)/log(12));
end

14-27
14 Define New System Objects

function hz = stepImpl(obj,noteShift)
% A noteShift value of 1 corresponds to obj.MiddleC
hz = obj.pLookupTable(noteShift);
end

function processTunedPropertiesImpl(obj)
% Generate a lookup table of note frequencies
obj.pLookupTable = obj.MiddleC * ...
(1+log(1:obj.NumNotes)/log(12));
end
end
end

See Also
processTunedPropertiesImpl

14-28
Release System Object Resources

Release System Object Resources


This example shows how to release resources allocated and used by the System object.
These resources include allocated memory, files used for reading or writing, etc.

Release Memory by Clearing the Object

This method allows you to clear the axes on the Whiteboard figure window while keeping
the figure open.

methods
function releaseImpl(obj)
cla(Whiteboard.getWhiteboard());
hold on
end
end

Complete Class Definition File with Released Resources


classdef Whiteboard < matlab.System
% Whiteboard Draw lines on a figure window
%
% This System object™ shows the use of StringSets
%
properties
Color = 'blue'
end

properties (Hidden)
% Let user choose a color
ColorSet = matlab.system.StringSet({'red','blue','green'});
end

methods (Access = protected)


function stepImpl(obj)
h = Whiteboard.getWhiteboard();
plot(h, ...
randn([2,1]), randn([2,1]), ...
'Color',obj.Color(1));
end

function releaseImpl(obj)
cla(Whiteboard.getWhiteboard());
hold on

14-29
14 Define New System Objects

end

methods (Static)
function a = getWhiteboard()
h = findobj('tag','whiteboard');
if isempty(h)
h = figure('tag','whiteboard');
hold on
end
a = gca;
end
end
end

See Also
releaseImpl

Related Examples
• “Initialize Properties and Setup One-Time Calculations” on page 14-11

14-30
Define Composite System Objects

Define Composite System Objects


This example shows how to define System objects that include other System objects.

This example defines a filter System object from an FIR System object and an IIR System
object.

Store System Objects in Properties

To define a System object from other System objects, store those objects in your class
definition file as properties. In this example, FIR and IIR are separate System objects
defined in their own class-definition files. You use those two objects to calculate the pFir
and pIir property values.
properties (Nontunable, Access = private)
pFir % Store the FIR filter
pIir % Store the IIR filter
end

methods
function obj = Filter(varargin)
setProperties(obj,nargin,varargin{:});
obj.pFir = FIR(obj.zero);
obj.pIir = IIR(obj.pole);
end
end

Complete Class Definition File of Composite System Object


classdef Filter < matlab.System
% Filter System object with a single pole and a single zero
%
% This System object illustrates composition by
% composing an instance of itself.
%

properties (Nontunable)
zero = 0.01
pole = 0.5
end

properties (Nontunable,Access = private)


pZero % Store the FIR filter
pPole % Store the IIR filter

14-31
14 Define New System Objects

end

methods
function obj = Filter(varargin)
setProperties(obj,nargin,varargin{:});
% Create instances of FIR and IIR as
% private properties
obj.pZero = Zero(obj.zero);
obj.pPole = Pole(obj.pole);
end
end

methods (Access = protected)


function setupImpl(obj,x)
setup(obj.pZero,x);
setup(obj.pPole,x);
end

function resetImpl(obj)
reset(obj.pZero);
reset(obj.pPole);
end

function y = stepImpl(obj,x)
y = step(obj.pZero,x) + step(obj.pPole,x);
end
function releaseImpl(obj)
release(obj.pZero);
release(obj.pPole);
end
end
end

Class Definition File for IIR Component of Filter


classdef Pole < matlab.System

properties
Den = 1
end

properties (Access = private)


tap = 0
end

14-32
Define Composite System Objects

methods
function obj = Pole(varargin)
setProperties(obj,nargin,varargin{:},'Den');
end
end

methods (Access = protected)


function y = stepImpl(obj,x)
y = x + obj.tap * obj.Den;
obj.tap = y;
end
end

end

Class Definition File for FIR Component of Filter


classdef Zero < matlab.System

properties
Num = 1
end

properties (Access = private)


tap = 0
end

methods
function obj = Zero(varargin)
setProperties(obj,nargin,varargin{:},'Num');
end
end

methods (Access = protected)


function y = stepImpl(obj,x)
y = x + obj.tap * obj.Num;
obj.tap = x;
end
end

end

See Also
nargin

14-33
14 Define New System Objects

Define Finite Source Objects


This example shows how to define a System object that performs a specific number of
steps or specific number of reads from a file.

Use the FiniteSource Class and Specify End of the Source

1 Subclass from finite source class.


classdef RunTwice < matlab.System & ...
matlab.system.mixin.FiniteSource
2 Specify the end of the source with the isDoneImpl method. In this example, the
source has two iterations.
methods (Access = protected)
function bDone = isDoneImpl(obj)
bDone = obj.NumSteps==2
end

Complete Class Definition File with Finite Source


classdef RunTwice < matlab.System & ...
matlab.system.mixin.FiniteSource
% RunTwice System object that runs exactly two times
%
properties (Access = private)
NumSteps
end

methods (Access = protected)


function resetImpl(obj)
obj.NumSteps = 0;
end

function y = stepImpl(obj)
if ~obj.isDone()
obj.NumSteps = obj.NumSteps + 1;
y = obj.NumSteps;
else
y = 0;
end
end

function bDone = isDoneImpl(obj)

14-34
Define Finite Source Objects

bDone = obj.NumSteps==2;
end
end
end

See Also
matlab.system.mixin.FiniteSource

More About
• “What Are Mixin Classes?” on page 14-49
• “Subclassing Multiple Classes”
• “System Object Input Arguments and ~ in Code Examples” on page 14-48

14-35
14 Define New System Objects

Save System Object


This example shows how to save a System object.

Save System Object and Child Object

Define a saveObjectImpl method to specify that more than just public properties
should be saved when the user saves a System object. Within this method, use the
default saveObjectImpl@matlab.System to save public properties to the struct,
s. Use the saveObject method to save child objects. Save protected and dependent
properties, and finally, if the object is locked, save the object’s state.
methods (Access = protected)
function s = saveObjectImpl(obj)
s = saveObjectImpl@matlab.System(obj);
s.child = matlab.System.saveObject(obj.child);
s.protected = obj.protected;
s.pdependentprop = obj.pdependentprop;
if isLocked(obj)
s.state = obj.state;
end
end
end

Complete Class Definition File with Save and Load


classdef MySaveLoader < matlab.System

properties (Access = private)


child
pdependentprop
end

properties (Access = protected)


protected = rand;
end

properties (DiscreteState = true)


state
end

properties (Dependent)
dependentprop
end

14-36
Save System Object

methods
function obj = MySaveLoader(varargin)
obj@matlab.System();
setProperties(obj,nargin,varargin{:});
end
end

methods (Access = protected)


function setupImpl(obj)
obj.state = 42;
end

function out = stepImpl(obj,in)


obj.state = in;
out = obj.state;
end
end

% Serialization
methods (Access = protected)
function s = saveObjectImpl(obj)
% Call the base class method
s = saveObjectImpl@matlab.System(obj);

% Save the child System objects


s.child = matlab.System.saveObject(obj.child);

% Save the protected & private properties


s.protected = obj.protected;
s.pdependentprop = obj.pdependentprop;

% Save the state only if object locked


if isLocked(obj)
s.state = obj.state;
end
end

function loadObjectImpl(obj,s,wasLocked)
% Load child System objects
obj.child = matlab.System.loadObject(s.child);

% Load protected and private properties

14-37
14 Define New System Objects

obj.protected = s.protected;
obj.pdependentprop = s.pdependentprop;

% Load the state only if object locked


if wasLocked
obj.state = s.state;
end

% Call base class method to load public properties


loadObjectImpl@matlab.System(obj,s,wasLocked);
end
end
end

See Also
loadObjectImpl | saveObjectImpl

Related Examples
• “Load System Object” on page 14-39

14-38
Load System Object

Load System Object


This example shows how to load a System object.

Load System Object and Child Object

Define a loadObjectImpl method to load a previously saved System object. Within


this method, use the matlab.System.loadObject to assign the child object struct
data to the associated object property. Assign protected and dependent property data
to the associated object properties. If the object was locked when it was saved, assign
the object’s state to the associated property. Load the saved public properties with the
loadObjectImpl method.
methods (Access = protected)
function loadObjectImpl(obj,s,wasLocked)
obj.child = matlab.System.loadObject(s.child);
obj.protected = s.protected;
obj.pdependentprop = s.pdependentprop;
if wasLocked
obj.state = s.state;
end
loadObjectImpl@matlab.System(obj,s,wasLocked);
end
end
end

Complete Class Definition File with Save and Load


classdef MySaveLoader < matlab.System

properties (Access = private)


child
pdependentprop
end

properties (Access = protected)


protected = rand;
end

properties (DiscreteState = true)


state
end

properties (Dependent)

14-39
14 Define New System Objects

dependentprop
end

methods
function obj = MySaveLoader(varargin)
obj@matlab.System();
setProperties(obj,nargin,varargin{:});
end
end

methods (Access = protected)


function setupImpl(obj)
obj.state = 42;
end

function out = stepImpl(obj,in)


obj.state = in;
out = obj.state;
end
end

% Serialization
methods (Access = protected)
function s = saveObjectImpl(obj)
% Call the base class method
s = saveObjectImpl@matlab.System(obj);

% Save the child System objects


s.child = matlab.System.saveObject(obj.child);

% Save the protected & private properties


s.protected = obj.protected;
s.pdependentprop = obj.pdependentprop;

% Save the state only if object locked


if isLocked(obj)
s.state = obj.state;
end
end

function loadObjectImpl(obj,s,wasLocked)
% Load child System objects
obj.child = matlab.System.loadObject(s.child);

14-40
Load System Object

% Load protected and private properties


obj.protected = s.protected;
obj.pdependentprop = s.pdependentprop;

% Load the state only if object locked


if wasLocked
obj.state = s.state;
end

% Call base class method to load public properties


loadObjectImpl@matlab.System(obj,s,wasLocked);
end
end
end

See Also
loadObjectImpl | saveObjectImpl

Related Examples
• “Save System Object” on page 14-36

14-41
14 Define New System Objects

Clone System Object


This example shows how to clone a System object.

Clone System Object

You can define your own clone method, which is useful for copying objects without saving
their state. The default cloneImpl method copies both a System object™ and its current
state. If an object is locked, the default cloneImpl creates a cloned object that is also
locked. An example of when you may want to write your own clone method is for cloning
objects that handle resources. These objects cannot allocate resources twice and you
would not want to save their states. To write your clone method, use the saveObject
and loadObject methods to perform the clone within the cloneImpl method.

methods (Access = protected)


function obj2 = cloneImpl(obj1)
s = saveObject (obj1);
obj2 = loadObject(s);
end
end

Complete Class Definition File with Clone


classdef PassThrough < matlab.System
methods (Access = protected)
function y = stepImpl(~,u)
y = u;
end
function obj2 = cloneImpl(obj1)
s = matlab.System.saveObject(obj1);
obj2 = matlab.System.loadObject(s);
end
end
end

See Also
cloneImpl | loadObjectImpl | saveObjectImpl

14-42
Define System Object Information

Define System Object Information


This example shows how to define information to display for a System object.

Define System Object Info

You can define your own info method to display specific information for your
System object. The default infoImpl method returns an empty struct. This
infoImpl method returns detailed information when the info method is called using
info(x,'details') or only count information if it is called using info(x).
methods (Access = protected)
function s = infoImpl(obj,varargin)
if nargin>1 && strcmp('details',varargin(1))
s = struct('Name','Counter',...
'Properties', struct('CurrentCount', ...
obj.pCount,'Threshold',obj.Threshold));
else
s = struct('Count',obj.pCount);
end
end
end

Complete Class Definition File with InfoImpl


classdef Counter < matlab.System
% Counter Count values above a threshold

properties
Threshold = 1
end

properties (DiscreteState)
Count
end

methods (Access = protected)


function setupImpl(obj)
obj.Count = 0;
end

function resetImpl(obj)
obj.Count = 0;
end

14-43
14 Define New System Objects

function y = stepImpl(obj,u)
if (u > obj.Threshold)
obj.Count = obj.Count + 1;
end
y = obj.Count;
end

function s = infoImpl(obj,varargin)
if nargin>1 && strcmp('details',varargin(1))
s = struct('Name','Counter',...
'Properties', struct('CurrentCount', ...
obj.pCount,'Threshold',obj.Threshold));
else
s = struct('Count',obj.pCount);
end
end
end

See Also
infoImpl

14-44
Methods Timing

Methods Timing

In this section...
“Setup Method Call Sequence” on page 14-45
“Step Method Call Sequence” on page 14-45
“Reset Method Call Sequence” on page 14-46
“Release Method Call Sequence” on page 14-47

Setup Method Call Sequence


This hierarchy shows the actions performed when you call the setup method.

Step Method Call Sequence


This hierarchy shows the actions performed when you call the step method.

14-45
14 Define New System Objects

Reset Method Call Sequence


This hierarchy shows the actions performed when you call the reset method.

14-46
Methods Timing

Release Method Call Sequence


This hierarchy shows the actions performed when you call the release method.

See Also
releaseImpl | resetImpl | setupImpl | stepImpl

Related Examples
• “Release System Object Resources” on page 14-29
• “Reset Algorithm State” on page 14-16
• “Set Property Values at Construction Time” on page 14-14
• “Define Basic System Objects” on page 14-2

More About
• “What Are System Object Methods?”
• “The Step Method”
• “Common Methods”

14-47
14 Define New System Objects

System Object Input Arguments and ~ in Code Examples


All methods, except static methods, expect the System object handle as the first input
argument. You can use any name for your System object handle. In many examples,
instead of passing in the object handle, ~ is used to indicate that the object handle is
not used in the function. Using ~ instead of an object handle prevents warnings about
unused variables.

14-48
What Are Mixin Classes?

What Are Mixin Classes?


Mixin classes are partial classes that you can combine in various combinations to form
desired behaviors using multiple inheritance. System objects are composed of a base
class, matlab.System and may include one or more mixin classes. You specify the base
class and mixin classes on the first line of your class definition file.

The following mixin classes are available for use with System objects.

• matlab.system.mixin.CustomIcon — Defines a block icon for System objects in


the MATLAB System block
• matlab.system.mixin.FiniteSource — Adds the isDone method to System
objects that are sources
• matlab.system.mixin.Nondirect — Allows the System object, when used in the
MATLAB System block, to support nondirect feedthrough by making the runtime
callback functions, output and update available
• matlab.system.mixin.Propagates — Enables System objects to operate in the
MATLAB System block using the interpreted execution

14-49
14 Define New System Objects

Best Practices for Defining System Objects


A System object is a specialized kind of MATLAB object that is optimized for iterative
processing. Use System objects when you need to call the step method multiple times
or process data in a loop. When defining your own System object, use the following
suggestions to help your code run efficiently.

• Define all one-time calculations in the setupImpl method and cache the results in a
private property. Use the stepImpl method for repeated calculations.
• For parameters that do not change, define them in a locked object as Nontunable
properties.
• If the number of System object inputs does not change, do not implement the
getNumInputsImpl method. Also do not implement the getNumInputsImpl
method when you explicitly list the inputs in the stepImpl method instead of
using varargin. The same caveats apply to the outputs, getNumOutputsImpl and
varargout.
• Variables that do not need to retain their values between calls should have local scope
for that method.
• If properties are accessed more than once in the stepImpl method, or in the
updateImpl and outputImpl methods, cache those properties as local variables
inside the method. Iterative calculations using cached local variables run faster than
calculations that must access the properties of an object. When the calculations for
the method complete, you can save the local cached results back to the properties of
that System object. Copy frequently used tunable properties into private properties.
• For best practices for including System objects in code generation, see “System
Objects in MATLAB Code Generation”.

14-50

You might also like