LMMSEInterpolator1D#

class sionna.phy.ofdm.LMMSEInterpolator1D(pilot_mask: numpy.ndarray, cov_mat: torch.Tensor, last_step: bool)[source]#

Bases: sionna.phy.object.Object

LMMSE interpolation across the inner dimension of the input.

The two inner dimensions of the input h_hat form a matrix \(\hat{\mathbf{H}} \in \mathbb{C}^{N \times M}\). LMMSE interpolation is performed across the inner dimension as follows:

\[\tilde{\mathbf{h}}_n = \mathbf{A}_n \hat{\mathbf{h}}_n\]

where \(1 \leq n \leq N\) and \(\hat{\mathbf{h}}_n\) is the \(n^{\text{th}}\) (transposed) row of \(\hat{\mathbf{H}}\). \(\mathbf{A}_n\) is the \(M \times M\) interpolation LMMSE matrix:

\[\mathbf{A}_n = \mathbf{R} \mathbf{\Pi}_n \left( \mathbf{\Pi}_n^\intercal \mathbf{R} \mathbf{\Pi}_n + \tilde{\mathbf{\Sigma}}_n \right)^{-1} \mathbf{\Pi}_n^\intercal.\]

where \(\mathbf{R}\) is the \(M \times M\) covariance matrix across the inner dimension of the quantity which is estimated, \(\mathbf{\Pi}_n\) the \(M \times K_n\) matrix that spreads \(K_n\) values to a vector of size \(M\) according to the pilot_mask for the \(n^{\text{th}}\) row, and \(\tilde{\mathbf{\Sigma}}_n \in \mathbb{R}^{K_n \times K_n}\) is the regularized channel estimation error covariance. The \(i^{\text{th}}\) diagonal element of \(\tilde{\mathbf{\Sigma}}_n\) is such that:

\[\left[ \tilde{\mathbf{\Sigma}}_n \right]_{i,i} = \max \left\{ \left[ \mathbf{\Sigma}_n \right]_{i,i},\; 0 \right\}\]

built from err_var and assumed to be diagonal.

The returned channel estimates are

\[\begin{split}\begin{bmatrix} {\tilde{\mathbf{h}}_1}^\intercal\\ \vdots\\ {\tilde{\mathbf{h}}_N}^\intercal \end{bmatrix}.\end{split}\]

The returned channel estimation error variances are the diagonal coefficients of

\[\text{diag} \left( \mathbf{R} - \mathbf{A}_n \mathbf{\Xi}_n \mathbf{R} \right), 1 \leq n \leq N\]

where \(\mathbf{\Xi}_n\) is the diagonal matrix of size \(M \times M\) that zeros the columns corresponding to rows not carrying any pilots. Note that interpolation is not performed for rows not carrying any pilots.

Remark: The interpolation matrix differs across rows as different rows may carry pilots on different elements and/or have different estimation error variances.

Parameters:
  • pilot_mask (numpy.ndarray) – Mask indicating the allocation of resource elements. 0: Data, 1: Pilot, 2: Not used.

  • cov_mat (torch.Tensor) – Covariance matrix of the channel across the inner dimension

  • last_step (bool) – Set to True if this is the last interpolation step. Otherwise, set to False. If True, the output is scaled to ensure its variance is as expected by the following interpolation step.

Inputs:
  • h_hat – [batch_size, num_rx, num_rx_ant, num_tx, \(N\), \(M\)], torch.complex. Channel estimates.

  • err_var – [batch_size, num_rx, num_rx_ant, num_tx, \(N\), \(M\)], torch.float. Channel estimation error variances.

Outputs:
  • h_hat – [batch_size, num_rx, num_rx_ant, num_tx, num_streams_per_tx, \(N\), \(M\)], torch.complex. Channel estimates interpolated across the inner dimension.

  • err_var – Same shape as h_hat, torch.float. The channel estimation error variances of the interpolated channel estimates.