# phased.ULA

Uniform linear array

## Description

The `phased.ULA` System object™ creates a uniform linear array (ULA) and computes its response.

To compute the response for each element in the array for specified directions:

1. Create the `phased.ULA` object and set its properties.

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

## Creation

### Syntax

``array = phased.ULA``
``array = phased.ULA(Name = Value)``
``array = phased.ULA(N,D,Name = Value)``

### Description

````array = phased.ULA` creates a uniform linear array (ULA) System object `array`. In this syntax, the object models a ULA formed with identical sensor elements. 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.```
````array = phased.ULA(Name = Value)` creates the object `array` with each specified property `Name` set to the specified `Value`. You can specify additional name-value pair arguments in any order as (`Name1` = `Value1`, … ,`NameN` = `ValueN`).```

example

````array = phased.ULA(N,D,Name = Value)` creates a ULA object, `array`, with the `NumElements` property set to `N`, the `ElementSpacing` property set to `D`, and other specified property Names set to the specified Values. `N` and `D` are value-only arguments. When specifying a value-only argument, specify all preceding value-only arguments. You can specify name-value pair arguments in any order.```

## Properties

expand all

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

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

Array element, specified as an antenna, microphone, or transducer System object.

Number of array elements, specified as a positive integer.

Data Types: `double`

Spacing between two adjacent elements in the array, specified as a positive scalar. Units are in meters.

Data Types: `double`

Axis of linear array, specified as `'x'`, `'y'`, or `'z'`. Linear array elements are located along the selected coordinate system axis. The array axis determines the direction along which the element normal vectors point.

ArrayAxis Property ValueElement Normal Direction
`'x'`azimuth = 90°, elevation = 0° (y-axis)
`'y'`azimuth = 0°, elevation = 0° (x-axis)
`'z'`azimuth = 0°, elevation = 0° (x-axis)

Example: `'y'`

Data Types: `char` | `string`

Array element tapering, specified as a complex-valued scalar, 1-by-N complex-valued row vector, or N-by-1 complex-valued column vector. N represents the number of elements of the array. Tapers, also known as weights, are applied to each sensor element in the sensor array and modify both the amplitude and phase of the received data. If `'Taper'` is a scalar, the same taper value is applied to all elements. If `'Taper'` is a vector, each taper value is applied to the corresponding sensor element.

Data Types: `double`

## Usage

### Syntax

``resp = array(freq,ang)``

### Description

example

````resp = array(freq,ang)` returns the array element responses, `resp`, at the operating frequencies specified in `freq` and in directions specified in `ang`.```

### Input Arguments

expand all

Array operating frequencies, specified as a length-L row vector. Typical values are within the range specified by a frequency range property of the array element. That property is called `FrequencyRange` or `FrequencyVector`, depending on the type of array element. The element has zero response at frequencies outside that range. Units are in Hz.

Data Types: `double`

Array response directions, specified as a 2-by-M matrix or length-M row vector.

If `ANG` is a 2-by-M matrix, each column of the matrix specifies the direction in the form ```[azimuth; elevation]```. The azimuth angle must lie between –180° and 180°, inclusive. The elevation angle must lie between –90° and 90°, inclusive.

If `ang` is a row vector of length M, each element specifies the azimuth angle of the direction. In this case, the corresponding elevation angle is assumed to be 0°.

Units are in degrees.

### Output Arguments

expand all

Voltage responses of the phased array. The output depends on whether the array supports polarization or not.

• If the array is not capable of supporting polarization, the voltage response, `resp`, has the dimensions N-by-M-by-L. N is the number of elements in the array. The dimension M is the number of angles specified in `ang`. L is the number of frequencies specified in `freq`. For any element, the columns of `resp` contain the responses of the array elements for the corresponding direction specified in `ang`. Each of the L pages of `resp` contains the responses of the array elements for the corresponding frequency specified in `freq`.

• If the array is capable of supporting polarization, the voltage response, `resp`, is a MATLAB `struct` containing two fields, `resp.H` and `resp.V`. The field, `resp.H`, represents the array’s horizontal polarization response, while `resp.V` represents the array’s vertical polarization response. Each field has the dimensions N-by-M-by-L. N is the number of elements in the array, and M is the number of angles specified in `ang`. L is the number of frequencies specified in `freq`. Each column of `resp` contains the responses of the array elements for the corresponding direction specified in `ang`. Each of the L pages of `ang` contains the responses of the array elements for the corresponding frequency specified in `freq`.

## Object Functions

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

`release(obj)`

expand all

 `beamwidth` Compute and display beamwidth of an array `collectPlaneWave` Simulate received plane waves at array `directivity` Compute array directivity `getElementNormal` Normal vectors for array elements `getElementPosition` Positions of array elements `getNumElements` Number of elements in an array `getTaper` Array element tapers `isPolarizationCapable` Array polarization capability `pattern` Plot array directivity and patterns `patternAzimuth` Plot array directivity or pattern versus azimuth `patternElevation` Plot array directivity or pattern versus elevation `perturbations` Perturbations defined on array `perturbedArray` Apply perturbations to phased array `perturbedPattern` Display pattern of perturbed array `plotGratingLobeDiagram` Plot grating lobe diagram of array `viewArray` View array geometry
 `step` Run System object algorithm `release` Release resources and allow changes to System object property values and input characteristics `reset` Reset internal states of System object

## Examples

collapse all

Compute the directivities of two different uniform linear arrays (ULA). One array consists of isotropic antenna elements and the second array consists of cosine antenna elements. In addition, compute the directivity when the first array is steered in a specified direction. For each case, calculate the directivities for a set of seven different azimuth directions all at zero degrees elevation. Set the frequency to 800 MHz.

Array of isotropic antenna elements

First, create a 10-element ULA of isotropic antenna elements spaced 1/2-wavelength apart.

```c = physconst('LightSpeed'); fc = 3e8; lambda = c/fc; ang = [-30,-20,-10,0,10,20,30; 0,0,0,0,0,0,0]; myAnt1 = phased.IsotropicAntennaElement; myArray1 = phased.ULA(10,lambda/2,'Element',myAnt1);```

Compute the directivity.

`d = directivity(myArray1,fc,ang,'PropagationSpeed',c)`
```d = 7×1 -6.9886 -6.2283 -6.5176 10.0011 -6.5176 -6.2283 -6.9886 ```

Array of cosine antenna elements

Next, create a 10-element ULA of cosine antenna elements spaced 1/2-wavelength apart.

```myAnt2 = phased.CosineAntennaElement('CosinePower',[1.8,1.8]); myArray2 = phased.ULA(10,lambda/2,'Element',myAnt2);```

Compute the directivity.

`d = directivity(myArray2,fc,ang,'PropagationSpeed',c)`
```d = 7×1 -1.9838 0.0529 0.4968 17.2548 0.4968 0.0529 -1.9838 ```

The directivity of the cosine ULA is greater than the directivity of the isotropic ULA because of the larger directivity of the cosine antenna element.

Steered array of isotropic antenna elements

Finally, steer the isotropic antenna array to 30 degrees in azimuth and compute the directivity.

```w = steervec(getElementPosition(myArray1)/lambda,[30;0]); d = directivity(myArray1,fc,ang,'PropagationSpeed',c,... 'Weights',w)```
```d = 7×1 -297.2705 -13.9783 -9.5713 -6.9897 -4.5787 -2.0536 10.0000 ```

The directivity is greatest in the steered direction.

Construct three ULAs with elements along the x-, y-, and z-axes. Obtain the element normals.

First, choose the array axis along the x-axis.

```sULA1 = phased.ULA('NumElements',5,'ArrayAxis','x'); norm = getElementNormal(sULA1)```
```norm = 2×5 90 90 90 90 90 0 0 0 0 0 ```

The element normal vectors point along the y-axis.

Next, choose the array axis along the y-axis.

```sULA2 = phased.ULA('NumElements',5,'ArrayAxis','y'); norm = getElementNormal(sULA2)```
```norm = 2×5 0 0 0 0 0 0 0 0 0 0 ```

The element normal vectors point along the x-axis.

Finally, set the array axis along the z-axis. Obtain the normal vectors of the odd-numbered elements.

```sULA3 = phased.ULA('NumElements',5,'ArrayAxis','z'); norm = getElementNormal(sULA3,[1,3,5])```
```norm = 2×3 0 0 0 0 0 0 ```

The element normal vectors also point along the x-axis.

Construct a ULA with 5 elements along the z-axis. Obtain the element positions.

```sULA = phased.ULA('NumElements',5,'ArrayAxis','z'); pos = getElementPosition(sULA)```
```pos = 3×5 0 0 0 0 0 0 0 0 0 0 -1.0000 -0.5000 0 0.5000 1.0000 ```

Construct a default ULA and obtain the number of elements in that array.

``` array = phased.ULA; N = getNumElements(array)```
```N = 2 ```

Draw a 6-element ULA and use the `'ShowIndex'` parameter to show the indices of the first and third elements.

```array = phased.ULA(6); viewArray(array,'ShowIndex',[1 3],'ShowNormals',true, ... 'ShowLocalCoordinates',true,'Orientation',[60;100;45], ... 'ShowAnnotation',true)```

Construct a 5-element ULA with a Taylor window taper. Then, obtain the element taper values.

```taper = taylorwin(5)'; array = phased.ULA(5,'Taper',taper); w = getTaper(array)```
```w = 5×1 0.5181 1.2029 1.5581 1.2029 0.5181 ```

Show that an array of `phased.ShortDipoleAntennaElement` antenna elements supports polarization.

```antenna = phased.ShortDipoleAntennaElement(... 'FrequencyRange',[1e9 10e9]); array = phased.ULA('NumElements',3,'Element',antenna); isPolarizationCapable(array)```
```ans = logical 1 ```

The returned value of `1` shows that this array supports polarization.

Create a 4-element undersampled ULA and find the response of each element at boresight. Plot the array pattern at 1 GHz for azimuth angles between -180 and 180 degrees. The default element spacing is 0.5 meters.

```array = phased.ULA('NumElements',4); fc = 1e9; ang = [0;0]; resp = array(fc,ang)```
```resp = 4×1 1 1 1 1 ```
```c = physconst('LightSpeed'); pattern(array,fc,-180:180,0,'PropagationSpeed',c,... 'CoordinateSystem','rectangular',... 'Type','powerdb','Normalize',true)```

Construct a 10-element uniform linear array of omnidirectional microphones spaced 3 cm apart. Then, plot the array pattern at 100 Hz.

```mic = phased.OmnidirectionalMicrophoneElement(... 'FrequencyRange',[20 20e3]); Nele = 10; array = phased.ULA('NumElements',Nele,... 'ElementSpacing',3e-2,... 'Element',mic); fc = 100; ang = [0; 0]; resp = array(fc,ang); c = 340; pattern(array,fc,[-180:180],0,'PropagationSpeed',c,... 'CoordinateSystem','polar',... 'Type','powerdb',... 'Normalize',true);```

Build a tapered uniform line array of 5 short-dipole sensor elements. Because short dipoles support polarization, the array should as well. Verify that it supports polarization by looking at the output of the `isPolarizationCapable` method.

```antenna = phased.ShortDipoleAntennaElement(... 'FrequencyRange',[100e6 1e9],'AxisDirection','Z'); array = phased.ULA('NumElements',5,'Element',antenna,... 'Taper',[.5,.7,1,.7,.5]); isPolarizationCapable(array)```
```ans = logical 1 ```

Then, draw the array using the `viewArray` method.

`viewArray(array,'ShowTaper',true,'ShowIndex','All')`

Compute the horizontal and vertical responses.

```fc = 150e6; ang = [10]; resp = array(fc,ang);```

Display the horizontal polarization response.

`resp.H`
```ans = 5×1 0 0 0 0 0 ```

Display the vertical polarization response.

`resp.V`
```ans = 5×1 -0.6124 -0.8573 -1.2247 -0.8573 -0.6124 ```

Plot an azimuth cut of the vertical polarization response.

```c = physconst('LightSpeed'); pattern(array,fc,[-180:180],0,... 'PropagationSpeed',c,... 'CoordinateSystem','polar',... 'Polarization','V',... 'Type','powerdb',... 'Normalize',true)```

Create an 9-element ULA of short dipole antenna elements spaced 0.2 meters apart. Display the azimuth and elevation directivities. The operating frequency is 500 MHz. Plot the directivities in polar coordinates.

Evaluate the fields at 45 degrees azimuth and 0 degrees elevation.

```element = phased.ShortDipoleAntennaElement(... 'FrequencyRange',[50e6,1000e6],... 'AxisDirection','Z'); array = phased.ULA('NumElements',9,'ElementSpacing',1.5,'Element',element); fc = 500e6; ang = [45;0]; resp = array(fc,ang); disp(resp.V)```
``` -1.2247 -1.2247 -1.2247 -1.2247 -1.2247 -1.2247 -1.2247 -1.2247 -1.2247 ```

Display the azimuth directivity pattern at 500 MHz for azimuth angles between -180 and 180 degrees.

```c = physconst('LightSpeed'); pattern(array,fc,[-180:180],0,... 'Type','directivity',... 'PropagationSpeed',c)```

Display the elevation directivity pattern at 500 MHz for elevation angles between -90 and 90 degrees.

```pattern(array,fc,[0],[-90:90],... 'Type','directivity',... 'PropagationSpeed',c)```

Create a 10-element ULA antenna array consisting of cosine antenna elements spaced 10 cm apart. Display the 3-D power pattern in UV space. The operating frequency is 500 MHz.

```sCos = phased.CosineAntennaElement('FrequencyRange',[100e6 1e9],... 'CosinePower',[2.5,2.5]); sULA = phased.ULA('NumElements',10,... 'ElementSpacing',.1,... 'Element',sCos); c = physconst('LightSpeed'); fc = 500e6; pattern(sULA,fc,[-1:.01:1],[-1:.01:1],... 'CoordinateSystem','uv',... 'Type','powerdb',... 'PropagationSpeed',c)```

Create a 7-element ULA of short-dipole antenna elements spaced 10 cm apart. Plot an azimuth cut of directivity at 0 and 10 degrees elevation. Assume the operating frequency is 500 MHz.

```fc = 500e6; sCDant = phased.ShortDipoleAntennaElement('FrequencyRange',[100,900]*1e6); sULA = phased.ULA('NumElements',7,'ElementSpacing',0.1,'Element',sCDant); patternAzimuth(sULA,fc,[0 30])```

You can plot a smaller range of azimuth angles by setting the `Azimuth` property.

`patternAzimuth(sULA,fc,[0 30],'Azimuth',[-90:90])`

Create a 6-element ULA of short-dipole antenna elements with element spacing of 10 cm. Plot an elevation cut of directivity at 0 and 90 degrees azimuth. Assume the operating frequency is 500 MHz.

```fc = 500e6; c = physconst('LightSpeed'); sSD = phased.ShortDipoleAntennaElement('FrequencyRange',[100,900]*1e6); sULA = phased.ULA('NumElements',6,'ElementSpacing',0.1,'Element',sSD); patternElevation(sULA,fc,[0 90],'PropagationSpeed',c)```

You can plot a smaller range of elevation angles by setting the `Elevation` property.

`patternElevation(sULA,fc,[0 45],'Elevation',[0:90],'PropagationSpeed',c)`

Plot the beamwidth of a sonar array operating at a frequency of 2 kHz when the propagation speed of sound in water is 1500 m/s.

The sonar array consists of a 20-element uniform linear array (ULA). Consider the element of the ULA to be a backbaffled `phased.IsotropicProjector` with a `VoltageResponse` of 100 Volts and with a `FrequencyRange` from 10 Hz to 300 kHz. Create a `phased.ULA` object to model the uniform linear array.

``` projector = phased.IsotropicProjector('BackBaffled',true,... 'VoltageResponse',100,'FrequencyRange',[10 300000])```
```projector = phased.IsotropicProjector with properties: VoltageResponse: 100 FrequencyRange: [10 300000] BackBaffled: true ```
```myArray = phased.ULA('Element',projector,'NumElements',20,... 'ElementSpacing',1500/200e3/2)```
```myArray = phased.ULA with properties: Element: [1x1 phased.IsotropicProjector] NumElements: 20 ElementSpacing: 0.0037 ArrayAxis: 'y' Taper: 1 ```

Using the `beamwidth` function, calculate and plot the 6 dB beamwidth of the sonar array.

`beamwidth(myArray,200e3,'dBDown',6,'PropagationSpeed',1500)`

```ans = 6.9200 ```

Calculate the half-power beamwidth and angles of a 20-element uniform linear array (ULA) of cosine antenna elements.

Create a `phased.CosineAntennaElement` object with the `'CosinePower'` exponents set to 1.5.

`myAnt = phased.CosineAntennaElement`
```myAnt = phased.CosineAntennaElement with properties: FrequencyRange: [0 1.0000e+20] CosinePower: [1.5000 1.5000] ```

Create a `phased.ULA` object to model a 20-element ULA of cosine antenna elements. These elements are spaced at 0.5 meters on the azimuth plane.

`array = phased.ULA('Element',myAnt,'NumElements',20)`
```array = phased.ULA with properties: Element: [1x1 phased.CosineAntennaElement] NumElements: 20 ElementSpacing: 0.5000 ArrayAxis: 'y' Taper: 1 ```

Compute the beamwidth and angles of the array when it is operating at 3e8 Hz. Specify the beamwidth to be computed along the elevation plane.

`[BW,Ang] = beamwidth(array,3e8,'Cut','Elevation')`
```BW = 74.8200 ```
```Ang = 1×2 -37.4100 37.4100 ```

Create a 4-element ULA of isotropic antenna elements and find the response of each element at boresight. Plot the array response at 1 GHz for azimuth angles between -180 and 180 degrees.

```ha = phased.ULA('NumElements',4); fc = 1e9; ang = [0;0]; resp = step(ha,fc,ang); c = physconst('LightSpeed'); pattern(ha,fc,[-180:180],0,... 'PropagationSpeed',c,... 'CoordinateSystem','rectangular')```

Find the response of a ULA array of 10 omnidirectional microphones spaced 1.5 meters apart. Set the frequency response of the microphone to the range 20 Hz to 20 kHz and choose the signal frequency to be 100 Hz. Using the `step` method, determine the response of each element at boresight: 0 degrees azimuth and 0 degrees elevation.

```mic = phased.OmnidirectionalMicrophoneElement( ... 'FrequencyRange',[20 20e3]); Nelem = 10; array = phased.ULA('NumElements',Nelem, ... 'ElementSpacing',1.5,'Element',mic); fc = 100; ang = [0;0]; resp = array(fc,ang)```
```resp = 10×1 1 1 1 1 1 1 1 1 1 1 ```

Plot the array directivity. Assume the speed of sound in air to be 340 m/s.

```c = 340; pattern(array,fc,[-180:180],0,'PropagationSpeed',c,'CoordinateSystem','polar')```

Simulate two received plane-wave random signals at a 4-element ULA. The signals arrive from 10° and 30° azimuth. Both signals have an elevation angle of 0°. Assume the propagation speed is the speed of light and the carrier frequency of the signal is 100 MHz.

```array = phased.ULA(4); y = collectPlaneWave(array,randn(4,2),[10 30],100e6,physconst('LightSpeed'))```
```y = 4×4 complex 0.7430 - 0.3705i 0.8433 - 0.1314i 0.8433 + 0.1314i 0.7430 + 0.3705i 0.8418 + 0.4308i 0.5632 + 0.1721i 0.5632 - 0.1721i 0.8418 - 0.4308i -2.4817 + 0.9157i -2.6683 + 0.3175i -2.6683 - 0.3175i -2.4817 - 0.9157i 1.0724 - 0.4748i 1.1895 - 0.1671i 1.1895 + 0.1671i 1.0724 + 0.4748i ```

Plot the grating lobe diagram for a 4-element uniform linear array having element spacing less than one-half wavelength. Grating lobes are plotted in u-v coordinates.

Assume the operating frequency of the array is 3 GHz and the spacing between elements is 0.45 of the wavelength. All elements are isotropic antenna elements. Steer the array in the direction 45 degrees in azimuth and 0 degrees in elevation.

```c = physconst('LightSpeed'); f = 3e9; lambda = c/f; sIso = phased.IsotropicAntennaElement; sULA = phased.ULA('Element',sIso,'NumElements',4,... 'ElementSpacing',0.45*lambda); plotGratingLobeDiagram(sULA,f,[45;0],c);```

The main lobe of the array is indicated by a filled black circle. The grating lobes in the visible and nonvisible regions are indicated by empty black circles. The visible region is defined by the direction cosine limits between [-1,1] and is marked by the two vertical black lines. Because the array spacing is less than one-half wavelength, there are no grating lobes in the visible region of space. There are an infinite number of grating lobes in the nonvisible regions, but only those in the range [-3,3] are shown.

The grating-lobe free region, shown in green, is the range of directions of the main lobe for which there are no grating lobes in the visible region. In this case, it coincides with the visible region.

The white area of the diagram indicates a region where no grating lobes are possible.

Plot the grating lobe diagram for a 4-element uniform linear array having element spacing greater than one-half wavelength. Grating lobes are plotted in u-v coordinates.

Assume the operating frequency of the array is 3 GHz and the spacing between elements is 0.65 of a wavelength. All elements are isotropic antenna elements. Steer the array in the direction 45 degrees in azimuth and 0 degrees in elevation.

```c = physconst('LightSpeed'); f = 3e9; lambda = c/f; sIso = phased.IsotropicAntennaElement; sULA = phased.ULA('Element',sIso,'NumElements',4,'ElementSpacing',0.65*lambda); plotGratingLobeDiagram(sULA,f,[45;0],c);```

The main lobe of the array is indicated by a filled black circle. The grating lobes in the visible and nonvisible regions are indicated by empty black circles. The visible region, marked by the two black vertical lines, corresponds to arrival angles between -90 and 90 degrees. The visible region is defined by the direction cosine limits $-1\le u\le 1$. Because the array spacing is greater than one-half wavelength, there is now a grating lobe in the visible region of space. There are an infinite number of grating lobes in the nonvisible regions, but only those for which $-3\le u\le 3$ are shown.

The grating-lobe free region, shown in green, is the range of directions of the main lobe for which there are no grating lobes in the visible region. In this case, it lies inside the visible region.

Plot the grating lobe diagram for a 4-element uniform linear array having element spacing greater than one-half wavelength. Apply a phase-shifter frequency that differs from the signal frequency. Grating lobes are plotted in u-v coordinates.

Assume the signal frequency is 3 GHz and the spacing between elements is 0.65 $\lambda$. All elements are isotropic antenna elements. The phase-shifter frequency is set to 3.5 GHz. Steer the array in the direction $4{5}^{\circ }$ azimuth, ${0}^{\circ }$ elevation.

```c = physconst('LightSpeed'); f = 3e9; f0 = 3.5e9; lambda = c/f; sIso = phased.IsotropicAntennaElement; sULA = phased.ULA('Element',sIso,'NumElements',4,... 'ElementSpacing',0.65*lambda ); plotGratingLobeDiagram(sULA,f,[45;0],c,f0);```

As a result of adding the shifted frequency, the mainlobe shifts right towards larger $u$ values. The beam no longer points toward the actual source arrival angle.

The mainlobe of the array is indicated by a filled black circle. The grating lobes in the visible and nonvisible regions are indicated by empty black circles. The visible region, marked by the two black vertical lines, corresponds to arrival angles between ${\text{-}\text{90}}^{\circ }$ and ${\text{90}}^{\circ }$. The visible region is defined by the direction cosine limits $-1\le u\le 1$. Because the array spacing is greater than one-half wavelength, there is now a grating lobe in the visible region of space. There are an infinite number of grating lobes in the nonvisible regions, but only those for which $-3\le u\le 3$ are shown.

The grating-lobe free region, shown in green, is the range of directions of the main lobe for which there are no grating lobes in the visible region. In this case, it lies inside the visible region.

## References

[1] Brookner, E., ed. Radar Technology. Lexington, MA: LexBook, 1996.

[2] Van Trees, H. Optimum Array Processing. New York: Wiley-Interscience, 2002.

## Version History

Introduced in R2011a