ESPRIT based DoA Estimation

This module implements a method for estimating the delays using Estimation of Signal Parameters via Rotational Invariance Techniques (ESPRIT) method.


Code example

# Ntx, Nty, dtx, dty will be taken from antenna arrays propoerties
# Hk is estimated at the receiver.
# However, for perfect CSI, it can be directly taken from channel.OFDM.
Lpath      = 5 # Returns DoAs for 5 strongest paths
espritDoa  = ESPRIT_DoA(Ntx, Nty, Hk.shape[1]) # Create a ESPRIT DoA Object
xoA_est    = espritDoa(Hk, Lpath, dtx, dty)    # Return 2 x 5 DoA matrix
# row-0 is azimuth angles for each path
# row-1 is elevation angles for each path

class toolkit5G.Positioning.ESPRIT_DoA(Nr_x, Nr_y, Nobservation)[source]

This module provides an API to estimate the 2D \((\) azimuth (\(\theta\)) and elevation (\(\phi\)) \()\) direction of Arrival using ESPRIT(Estimation of signal parameters via rotational invariant techniques). The module expects OFDM channel estimates (\(\text{H}_\text{k}\)) as an input and exploits the structure in this channel using number of antennas placed in columns (\(\text{N}_\text{r,x}\)), number of antennas placed in rows (\(\text{N}_\text{r,y}\)), spacing between antennas placed in columns (\(\text{d}_\text{r,x}\)) and spacing between antennas placed in rows (\(\text{d}_\text{r,y}\)) to estimate the 2D (\(\{(\theta_{l},\phi_{l})\}_{l=0}^{L-1}\)) angle of arrival traced by multi-paths (\(L\)) while propagating over the wireless channel.

Tip

  • \(\text{N}_\text{r,x}\) and \(\text{N}_\text{r,y}\) are inputted using Nr_x and Nr_y to __init__ method.

  • \(\text{d}_\text{r,x}\) and \(\text{d}_\text{r,y}\) are inputted using d_spcgx_Rx and d_spcgy_Rx to __call__ method.

  • \(L\) is inputted as numPaths.

  • \(\{(\theta_{l},\phi_{l})\}_{l=0}^{L-1}\) is \(2 \times L\) vector returned by the class.

Parameters:
  • Nr_x (int) – Defines the Number of Antenna in the receiver side along the x-axis.Should be a positive integer greater than 2.

  • Nr_y (int) – Defines the Number of Antenna in the receiver side along the y-axis.Should be a positive integer greater than 2.

  • Nobservation (int) – Defines the number of time samples. They may be fft size or fft size*numSymbols etc. Should be a positive non-zero integer.

Important

Nr_x and Nr_x must be even integers to estimate 2D direction of arrivals.

Input:
  • Hk ((Nr_x``*``Nr_y, :) np.ndarray) – Defines the channel matrix. It should have a size (Nr_x*Nr_y, Nobservation).

  • numPaths (int) – Defines the number of propagation paths.

  • d_spcgx_Rx (number) – Defines the spacing between antennas along x-axis. It should be >0.

  • d_spcgy_Rx (number) – Defines the spacing between antenna along y-axis. It should be >0.

Output:

(2, numPaths), float – 2D angles of arrival of numPaths strongest multi-paths in the channel. Row-0 is azimuth angles for each path and row-1 is elevation angles for each path.

Raises:
  • ValueError – [Error-ESPRIT_DoA]: ‘Hk’ should be a 2D NumPy array!

  • ValueError – [Error-ESPRIT_DoA]: Input Dimensions mismatch!n Hk.shape[0] should equal Nr_x*Nr_y and Hk.shape[1] should equal Nobservation.

  • ValueError – [Error-ESPRIT-DoA]: ‘Nr_x’ must be positive even integer, greater than or equal to 2

  • ValueError – [Error-ESPRIT-DoA]: ‘Nr_y’ must be positive even integer, greater than or equal to 2

  • ValueError – [Error-ESPRIT-DoA]: ‘Nobservation’ must be a positive integer

  • ValueError – [Error-ESPRIT-DoA]: ‘d_spcgx_Rx’ must be a positive number > 0!

  • ValueError – [Error-ESPRIT-DoA]: ‘d_spcgy_Rx’ must be a positive number > 0!