zf_equalizer#
- sionna.phy.mimo.zf_equalizer(y: torch.Tensor, h: torch.Tensor, s: torch.Tensor, precision: Literal['single', 'double'] | None = None) Tuple[torch.Tensor, torch.Tensor][source]#
MIMO ZF Equalizer.
This function implements zero-forcing (ZF) 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.10) [BHS2017] :
\[\hat{\mathbf{x}} = \mathbf{G}\mathbf{y}\]where
\[\mathbf{G} = \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] = \mathbf{G}\mathbf{S}\mathbf{G}^{\mathsf{H}}.\]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,
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(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 = zf_equalizer(y, h, s)