Estimate direction of signal arrival

Since R2024a

## Syntax

``ang = iaadoa(X,elempos)``
``[ang,spec,azimuthspecang,elevationspecang] = iaadoa(X,elempos)``
``[___] = iaadoa(X,elempos,'NumSignals',nsig)``
``[___] = iaadoa(X,elempos,'AzimuthScanAngles',azimuthscanang)``
``[___] = iaadoa(X,elempos,'ElevationScanAngles',elevationscanang)``
``[___] = iaadoa(X,elempos,...,'NumIterations',niter)``
``[___] = iaadoa(X,elempos,...,'Tolerance',tol)``

## Description

example

````ang = iaadoa(X,elempos)` returns the estimated direction of arrival, `ang`, of the signal `X` at element positions `elempos`. The function uses the Iterative Adaptive Approach (IAA) algorithm,```
````[ang,spec,azimuthspecang,elevationspecang] = iaadoa(X,elempos)` also returns the spatial power spectrum `spec` and the corresponding scan angles `azimuthspecang` along the azimuth direction and `elevationspecang` along the elevation direction.```

example

````[___] = iaadoa(X,elempos,'NumSignals',nsig)` also returns the `nsig` largest peaks of the spatial power spectrum.```
````[___] = iaadoa(X,elempos,'AzimuthScanAngles',azimuthscanang)` searches the azimuth scan angles `azimuthscanang` and returns the `nsig` angles corresponding to the highest peaks in the spatial power spectrum the search region.```
````[___] = iaadoa(X,elempos,'ElevationScanAngles',elevationscanang)` searches the elevation scan angles `elevationscanang` and returns the `nsig` angles corresponding to the highest peaks in the spatial power spectrum in the search region.```
````[___] = iaadoa(X,elempos,...,'NumIterations',niter)` returns the spatial power spectrum and directions of arrival after a maximum of `niter` iterations. In cases where any other stopping criteria are not met, the algorithm terminates after the maximum number of iterations.```
````[___] = iaadoa(X,elempos,...,'Tolerance',tol)` returns the spatial power spectrum and directions of arrival, taking into account the specified stop criteria, `tol`. The `'Tolerance'` Name-value pair sets the criteria for stopping, determined by the relative difference between the estimated spectrum of the current iteration and that of the previous iteration.```

## Examples

collapse all

Calculate the directions of arrival of four uncorrelated signals impinging on a 20-element ULA with half-wavelength spacing. Assume the signals are coming from azimuth 0, -25, 45, and 60 degrees, respectively. The noise is white across all elements and the SNR is 10 dB.

Set up array element positions.

```N = 20; d = 0.5; elementPos = (0:N-1)*d;```

Set up signal directions.

```angles = [0 -25 45 60]; Nsig = 4;```

Create single snapshot of received signal.

```[x,xcov] = sensorsig(elementPos,1,angles,db2pow(-10)); doas = iaadoa(x,elementPos,'NumSignals',Nsig); disp(doas)```
``` 0 45 -25 60 0 0 0 0 ```

Calculate the directions of arrival of four uncorrelated signals impinging on a 20-element ULA with half-wavelength spacing. Assume the signals are coming from azimuth 0, -25, 45, and 60 degrees, respectively. The noise is white across all elements and the SNR is 10 dB.

Set up array element positions.

```N = 20; d = 0.5; elementPos = (0:N-1)*d;```

Set up signal directions.

```angles = [0 -25 45 60]; Nsig = 4;```

Create single snapshot of received signal.

```[x,xcov] = sensorsig(elementPos,1,angles,db2pow(-10)); [doa,spec,specang] = iaadoa(x,elementPos,'NumSignals',Nsig);```

Plot spectrum.

```plot(specang,10*log10(spec)) xlabel('Broadside Angles (degrees)') ylabel('Magnitude Spectrum (dB)') title('IAA Spatial Spectrum')```

Calculate the directions of arrival of 2 uncorrelated signals impinging on a 10-by-10 URA with half-wavelength spacing. Assume the signals are coming from azimuth -37, and 17 degrees, and elevation 0, and 20 degrees, respectively. The noise is white across all elements and the SNR is 10 dB.

```N = 10; % Elements in array d = 0.5; % sensor spacing half wavelength array = phased.URA(N); % generate 2D URA doa1 = [-37;0]; doa2 = [17;20]; elementPos = getElementPosition(array); Nsig = 2;```

Generate 10 snapshots of received single.

`x = sensorsig(elementPos,10,[doa1,doa2],db2pow(-10));`

Solve for the directions of arrival.

```[doas,spec,azimuthSpecAng,elevationSpecAng] = iaadoa(x,elementPos, ... "AzimuthScanAngles", -60:60, ... "ElevationScanAngles", -60:60, 'NumSignals',Nsig); imagesc(azimuthSpecAng,elevationSpecAng,spec) xlabel('Azimuth (degrees)') ylabel('Elevation (degrees)') title('IAA Spatial Spectrum') axis equal axis tight```

## Input Arguments

collapse all

Received signal, specified as an Ns-by-N complex-valued matrix representing Ns snapshots of a signal at the N-elements of a sensor array.

Data Types: `single` | `double`
Complex Number Support: Yes

Array sensor element positions, specified as a real-valued 1-by-N vector, a real-valued 2-by-N matrix, or a real-valued 3-by-N matrix where N is the number of elements in the sensor array.

• A 1-by-N vector represents the y-coordinates of the elements of a linear array along the yaxis.

• A 2-by-N matrix represents an array lying in the yz-plane. Each column of `elempos` represents the `[y;z]` coordinates of an array element.

• A 3-by-N matrix represents an array of arbitrary shape. A each column of `elempos` represents the `[x;y;z]` coordinates of an array element.

Units are wavelength.

Data Types: `single` | `double`

Number of largest peaks to find of the spatial power spectrum, specified as a positive integer. `nsig` must be less than the number of array elements N. Use this argument with the `'NumSignals'` Name-value pair.

Example: `5`

Data Types: `single` | `double`

Azimuth scan angles, specified as a real-valued row vector. Azimuth scan angles must lie in the range `[-180,180]`. The `nsig` peaks of the power spectrum are located at the angles `azimuthspecang`. Use this argument with the `'AzimuthScanAngles'` Name-value pair.

Example: `[0:20]`

Data Types: `single` | `double`

Elevation scan angles, specified as a real-valued row vector. Elevation scan angles must lie in the range `[-90,90]`. The `nsig` peaks of the power spectrum are located at the angles `elevationspecang`. Use this argument with the `'ElevationScanAngles'` Name-value pair.

Example: `[-40:40]`

Data Types: `single` | `double`

Maximum number of iterations, specified as a positive integer. Computation stops when number of iterations reaches the maximum number. When other stopping criteria are not met, the algorithm will terminate after `niter` iterations.

Example: `10`

Data Types: `single` | `double`

Tolerance, specified as a positive scalar in the range (0,1]. Use this argument with the `'Tolerance'` Name-value pair to set the criteria for stopping, determined by the relative difference between the estimated spectrum of the current iteration and the previous iteration. Use this argument with the `'Tolerance'` Name-value pair.

Example: `1e-3`

Data Types: `single` | `double`

## Output Arguments

collapse all

Estimated signal direction angles, returned as a 2-row real-valued matrix where the first row represents the estimated azimuth angles and the second row represents the estimated elevation angle. Units are in degrees.

Data Types: `single` | `double`

Spatial power spectrum, returned as a row vector.

Data Types: `single` | `double`

Azimuth spec angles, returned as a row vector.

Data Types: `single` | `double`

Elevation spec angles, returned as a row vector.

Data Types: `single` | `double`

## References

[1] Tarik Yardibi, Jian Li, Petre Stoica, Ming Xue and Arthur B. Baggeroer, "Source Localization and Sensing: A Nonparametric Iterative Adaptive Approach Based on Weighted Least Squares", IEEE Transactions on Aerospace and Electronic Systems, Vol. 46, No. 1, pp. 425-443, Jan. 2010.

[2] Yanqin Xu, Xiaoling Zhang, Shunjun Wei, Jun Shi, Xu Zhan, and Tianwen Zhang, "3D Super-resolution Imaging Method for Distributed Millimeter-wave Automotive Radar Systems". arXiv:2209. 11037, 2022.

## Version History

Introduced in R2024a