lmmse_equalizer#
- sionna.phy.mimo.lmmse_equalizer(y: torch.Tensor, h: torch.Tensor, s: torch.Tensor, whiten_interference: bool = True, precision: Literal['single', 'double'] | None = None) Tuple[torch.Tensor, torch.Tensor][source]#
MIMO LMMSE Equalizer.
This function implements LMMSE 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 (Lemma B.19) [BHS2017] :
\[\hat{\mathbf{x}} = \mathop{\text{diag}}\left(\mathbf{G}\mathbf{H}\right)^{-1}\mathbf{G}\mathbf{y}\]where
\[\mathbf{G} = \mathbf{H}^{\mathsf{H}} \left(\mathbf{H}\mathbf{H}^{\mathsf{H}} + \mathbf{S}\right)^{-1}.\]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
\[\mathop{\text{diag}}\left(\mathbb{E}\left[\mathbf{e}\mathbf{e}^{\mathsf{H}}\right]\right) = \mathop{\text{diag}}\left(\mathbf{G}\mathbf{H} \right)^{-1} - \mathbf{I}.\]Note that the scaling by \(\mathop{\text{diag}}\left(\mathbf{G}\mathbf{H}\right)^{-1}\) is important for the
Demapperalthough 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]
whiten_interference (bool) – If True, the interference is first whitened before equalization. In this case, an alternative expression for the receive filter is used that can be numerically more stable.
precision (Literal['single', 'double'] | None) – Precision used for internal calculations and outputs. If set to None,
precisionis 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(4), torch.randn(4)) h = torch.complex(torch.randn(4, 2), torch.randn(4, 2)) s = torch.eye(4, dtype=torch.complex64) x_hat, no_eff = lmmse_equalizer(y, h, s)