mf_equalizer#

sionna.phy.mimo.mf_equalizer(y: torch.Tensor, h: torch.Tensor, s: torch.Tensor, precision: Literal['single', 'double'] | None = None) Tuple[torch.Tensor, torch.Tensor][source]#

MIMO Matched Filter (MF) Equalizer.

This function implements matched filter (MF) equalization for a MIMO link, assuming the following model:

\[\mathbf{y} = \mathbf{H}\mathbf{x} + \mathbf{n}\]

where \(\mathbf{y}\in\mathbb{C}^M\) is the received signal vector, \(\mathbf{x}\in\mathbb{C}^K\) is the vector of transmitted symbols, \(\mathbf{H}\in\mathbb{C}^{M\times K}\) is the known channel matrix, and \(\mathbf{n}\in\mathbb{C}^M\) is a noise vector. It is assumed that \(\mathbb{E}\left[\mathbf{x}\right]=\mathbb{E}\left[\mathbf{n}\right]=\mathbf{0}\), \(\mathbb{E}\left[\mathbf{x}\mathbf{x}^{\mathsf{H}}\right]=\mathbf{I}_K\) and \(\mathbb{E}\left[\mathbf{n}\mathbf{n}^{\mathsf{H}}\right]=\mathbf{S}\).

The estimated symbol vector \(\hat{\mathbf{x}}\in\mathbb{C}^K\) is given as (Eq. 4.11) [BHS2017] :

\[\hat{\mathbf{x}} = \mathbf{G}\mathbf{y}\]

where

\[\mathbf{G} = \mathop{\text{diag}}\left(\mathbf{H}^{\mathsf{H}}\mathbf{H}\right)^{-1}\mathbf{H}^{\mathsf{H}}.\]

This leads to the post-equalized per-symbol model:

\[\hat{x}_k = x_k + e_k,\quad k=0,\dots,K-1\]

where the variances \(\sigma^2_k\) of the effective residual noise terms \(e_k\) are given by the diagonal elements of the matrix

\[\mathbb{E}\left[\mathbf{e}\mathbf{e}^{\mathsf{H}}\right] = \left(\mathbf{I}-\mathbf{G}\mathbf{H} \right)\left(\mathbf{I}-\mathbf{G}\mathbf{H} \right)^{\mathsf{H}} + \mathbf{G}\mathbf{S}\mathbf{G}^{\mathsf{H}}.\]

Note that the scaling by \(\mathop{\text{diag}}\left(\mathbf{H}^{\mathsf{H}}\mathbf{H}\right)^{-1}\) in the definition of \(\mathbf{G}\) is important for the Demapper although it does not change the signal-to-noise ratio.

The function returns \(\hat{\mathbf{x}}\) and \(\boldsymbol{\sigma}^2=\left[\sigma^2_0,\dots, \sigma^2_{K-1}\right]^{\mathsf{T}}\).

Parameters:
  • y (torch.Tensor) – Received signals with shape […, M]

  • h (torch.Tensor) – Channel matrices with shape […, M, K]

  • s (torch.Tensor) – Noise covariance matrices with shape […, M, M]

  • precision (Literal['single', 'double'] | None) – Precision used for internal calculations and outputs. If set to None, precision is used.

Outputs:
  • x_hat – […, K], torch.complex. Estimated symbol vectors.

  • no_eff – […, K], torch.float. Effective noise variance for each stream.

Examples

y = torch.complex(torch.randn(8), torch.randn(8))
h = torch.complex(torch.randn(8, 4), torch.randn(8, 4))
s = torch.eye(8, dtype=torch.complex64)
x_hat, no_eff = mf_equalizer(y, h, s)