comnum.mimo_detect#

comnum.mimo_detect(h, y, constellation, noise_var, method='mmse', *, k=Ellipsis, iterations=Ellipsis)#

Detect the transmitted symbols of a MIMO link y = H x + w.

Methods: "mr" (matched filter), "zf", "mmse" (linear, unbiased), "zf_sic", "mmse_sic" (ordered successive interference cancellation, V-BLAST), "ml" (exhaustive search), "sphere" (exact ML by the Schnorr–Euchner sphere decoder), "kbest" (K-best tree search keeping k paths), "amp" (LAMA, the complex Bayesian AMP of Jeon et al.) and "oamp" (OAMP-LMMSE of Ma & Ping), both for large systems.

Parameters:
  • h (array_like) – the channel, (n_rx, n_tx) for every vector or (n, n_rx, n_tx).

  • y (array_like) – the received streams, (n_rx, n) (or one vector (n_rx,)).

  • constellation (Constellation) – the alphabet of every stream.

  • noise_var (float) – noise variance per receive antenna E|w_i|².

  • method (str) – the detector.

  • k (int) – paths kept by "kbest" (8, as the mimo_rx block).

  • iterations (int) – iterations of "amp" and "oamp".

Returns:

the labels of the decided points, (n_tx, n) (or (n_tx,)).

Return type:

numpy.ndarray

Raises:

ValueError – for an invalid parameter or input (the message names it).

Examples

>>> import comnum, numpy as np
>>> c = comnum.Constellation("qam", 4).normalized()
>>> h = comnum.mimo_channel(4, 2, comnum.Rng(3))
>>> x = c.points[[1, 2]]
>>> comnum.mimo_detect(h, h @ x, c, 1e-3, "sphere").tolist()
[1, 2]