Main Content

iaadoa

Estimate direction of signal arrival

Since R2024a

    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.

    Extended Capabilities

    C/C++ Code Generation
    Generate C and C++ code using MATLAB® Coder™.

    Version History

    Introduced in R2024a