Main Content


Beamscan spatial spectrum estimator for ULA


The phased.BeamscanEstimator System object™ calculates a beamscan spatial spectrum estimate for a uniform linear array (ULA). The object estimates the incoming signal spatial spectrum using a narrowband conventional beamformer.

To estimate the spatial spectrum:

  1. Create the phased.BeamscanEstimator object and set its properties.

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

To learn more about how System objects work, see What Are System Objects?



estimator = phased.BeamscanEstimator creates a beamscan spatial spectrum estimator System object.


estimator = phased.BeamscanEstimator(Name,Value) creates an object, estimator, 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).


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.

For more information on changing property values, see System Design in MATLAB Using System Objects.

ULA sensor array, specified as a phased.ULA System object. If you do not specify any name-value pair properties for the ULA sensor array, the default properties of the array are used.

Signal propagation speed, specified as a real-valued positive scalar. Units are in meters per second. The default propagation speed is the value returned by physconst('LightSpeed').

Example: 3e8

Data Types: single | double

Operating frequency, specified as a positive scalar. Units are in Hz.

Example: 1e9

Data Types: single | double

The number of bits used to quantize the phase shift component of beamformer or steering vector weights, specified as a non-negative integer. A value of zero indicates that no quantization is performed.

Example: 5

Data Types: single | double

Enable forward-backward averaging, specified as false or true. Set this property to true to use forward-backward averaging to estimate the covariance matrix for sensor arrays with a conjugate symmetric array manifold.

Data Types: logical

Option to enable spatial smoothing, specified as a nonnegative integer. Use spatial smoothing to compute the arrival directions of coherent signals. A value of zero specifies no spatial smoothing. A positive value represents the number of subarrays used to compute the smoothed (averaged) source covariance matrix. Each increment in this value lets you handle one additional coherent source, but reduces the effective number of array elements by one. The length of the smoothing aperture, L, depends on the array length, M, and the averaging number, K, by L = M – K + 1. The maximum value of K is M – 2.

Example: 5

Data Types: double

Broadside scan angles, specified as a real-valued vector. Units are in degrees. Broadside angles are between the search direction and the ULA array axis. The angles lie between –90° and 90°, inclusive. Specify the angles in increasing value.

Example: [-20:20]

Data Types: single | double

Option to enable directions-of-arrival (DOA) output, specified as false or true. To obtain the DOA of signals, set this property to true. The DOAs are returned in the second output argument when the object is executed.

Data Types: logical

Number of arriving signals for DOA estimation, specified as a positive integer.

Example: 3


To enable this property, set the DOAOutputPort property to true.

Data Types: single | double



Y = estimator(X) estimates the spatial spectrum from data X.

The size of the first dimension of the input matrix can vary to simulate a changing signal length. A size change can occur, for example, in the case of a pulse waveform with variable pulse repetition frequency.


[Y,ANG] = estimator(X) returns the directions of arrival, ANG, of the signals. To enable this syntax, set the DOAOutputPort property to true. ANG is a row vector of the estimated broadside angles (in degrees). You can specify ANG as single or double precision. If the object cannot identify a signal direction, it will return NaN.


The object performs an initialization the first time the object is executed. This initialization locks nontunable properties and input specifications, such as dimensions, complexity, and data type of the input data. If you change a nontunable property or an input specification, the System object issues an error. To change nontunable properties or inputs, you must first call the release method to unlock the object.

Input Arguments

expand all

Channel data, specified as a complex-valued matrix. Columns of the data matrix correspond to channels.

Data Types: single | double
Complex Number Support: Yes

Output Arguments

expand all

Magnitude of the estimated spatial spectrum, returned as a real-valued 1-by-L column vector. L is the number of scan angles specified by the ScanAngles property.

Data Types: single | double

Estimated broadside angles of signal arrivals, returned as a real-valued 1-by-K row vector. Units are in degrees. The NaN value in any vector element indicates that an estimate could not be found.

Data Types: single | double

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:


expand all

plotSpectrumPlot spatial spectrum
stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object


collapse all

Estimate the DOA's of two signals received by a 10-element ULA with element spacing of 1 meter. The antenna operating frequency is 150 MHz. The actual direction of the first signal is 10° in azimuth and 20° in elevation. The direction of the second signal is 60° in azimuth and -5° in elevation.

Create the signals and array.

fs = 8000;
t = (0:1/fs:1).';
x1 = cos(2*pi*t*300);
x2 = cos(2*pi*t*400);
antenna = phased.IsotropicAntennaElement('FrequencyRange',[100e6 300e6]);
array = phased.ULA('Element',antenna,'NumElements',10,'ElementSpacing',1);
fc = 150e6;
x = collectPlaneWave(array,[x1 x2],[10 20;60 -5]',fc);
noise = 0.1*(randn(size(x)) + 1i*randn(size(x)));

Solve for the DOAs.

estimator = phased.BeamscanEstimator('SensorArray',array, ...
[~,doas] = estimator(x + noise);
doas = broadside2az(sort(doas),[20 -5]);
    9.5829   60.3813

Because the default values for the ScanAngles property has a granularity of 1, the DOA estimates are not accurate. Improve the accuracy by choosing a finer grid.

estimator2 = phased.BeamscanEstimator('SensorArray',array, ...
    'OperatingFrequency',fc,'ScanAngles',-60:0.1:60, ...
[~,doas] = estimator2(x + noise);
doas = broadside2az(sort(doas),[20 -5]);
   10.0093   59.9751

Plot the beamscan spectrum



expand all


[1] Van Trees, H. Optimum Array Processing. New York: Wiley-Interscience, 2002, pp. 1142–1143.

Extended Capabilities

Version History

Introduced in R2011a