comnum.adaptive_equalizer#

comnum.adaptive_equalizer(x, constellation, *, algorithm=None, n_taps=Ellipsis, sps=Ellipsis, mu=None, passes=Ellipsis, reference=None, kikuchi=None, update_rule=None)#

The n×n butterfly adaptive equaliser (OptiCommPy mimoAdaptEqualizer).

Output symbol k of mode m is Σ_N Σ_t h_{m,N}[t] x_N[k·sps + t] (input padded with ⌊n_taps/2⌋ zeros at both ends, diagonal centre taps initialised at 1); the taps follow h ← h + μ e x* with the error of the current algorithm: CMA (R - |y|²) y, RDE (R̂² - |y|²) y, NLMS (s - y)/‖x‖² (needs reference), DD-LMS ŝ - y.

Parameters:
  • x (array_like) – input of shape (modes, samples) (a 1-D array is one mode).

  • constellation (Constellation) – the alphabet (normalised inside).

  • algorithm (str | list[tuple[str, int]] | None) – one algorithm ("cma" by default), or a schedule of (algorithm, output symbols) whose last entry runs to the end of every pass.

  • n_taps (int) – taps per filter.

  • sps (int) – input samples per symbol (the output is at 1 sample per symbol).

  • mu (float | list[float] | None) – step size, or one per stage of the schedule (the last one holds for the following stages); 1e-3 by default.

  • passes (int) – passes over the block (the taps carry over).

  • reference (array_like, optional) – transmitted symbols (modes, symbols).

  • kikuchi (int, optional) – Kikuchi’s two-stage initialisation of a 2 × 2 equaliser against the singularity: output 0 adapts alone during this number of symbols, then output 1 starts as its unitary complement.

  • update_rule (str, optional) – the update rule of every stage instead of that of its algorithm: "lms", "nlms" or "sign" (the sign of the error).

Returns:

the symbols (modes, symbols), the final taps (modes², n_taps) with row m + N·modes the filter from input N to output m, and the squared errors (modes, symbols).

Return type:

tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]

Raises:

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