Precoding and Combining (Detailed Documentation)

This page provides the complete documentation of the implemented precoding and combining techniques.

Precoding

class Precoder[source]

The Precoder Abstract Base Class (ABC).

A precoder class is responsible for implementing a precoding strategy and effectively precoding the transmitted signals in the base station.In case of coordinated beamforming, the precoder is responsible for computing the combining matrices for each UT as well! These are then later sent to the UTs.

In addition, the precoder is responsible for computing the equalization coefficients for each data stream. These will be used by the UTs to correctly rescale the received symbols before the decoding process.

abstractmethod static compute(csi: ChannelStateInformation, Pt: float, K: int) tuple[ndarray[tuple[Any, ...], dtype[complexfloating]], ndarray[tuple[Any, ...], dtype[complexfloating]] | None, ndarray[tuple[Any, ...], dtype[complexfloating]]][source]

Compute the compound precoding matrix.In case of coordinated beamforming, the combining matrices for each UT are computed as well.

In addition, the equalization coefficients for each data stream are computed as well. These will be used by the UTs to correctly rescale the received symbols before the decoding process.

Parameters:
  • csi (ChannelStateInformation) – The channel state information (CSI) of the system.

  • Pt (float) – The total transmit power available at the BS.

  • K (int) – The number of user terminals (UTs) in the system.

Returns:

  • F (ComplexArray, shape (Nt, K*Nr)) – The compound precoding matrix for all UTs. It contains the power allocation across the data streams as well.

  • G (ComplexArray, shape (K*Nr, K*Nr) or None) – The compound combining matrix (block diagonal) for all UTs in case of coordinated beamforming. None otherwise.

  • C_eq (ComplexArray, shape (K*Nr,)) – The equalization coefficients for all UTs.

static apply(a: ndarray[tuple[Any, ...], dtype[complexfloating]], F: ndarray[tuple[Any, ...], dtype[complexfloating]], ibr: ndarray[tuple[Any, ...], dtype[integer]]) ndarray[tuple[Any, ...], dtype[complexfloating]][source]

Apply the precoding matrix to the data symbols.

Parameters:
  • a (ComplexArray, shape (Ns_total, M)) – The data symbol streams for all UTs.

  • F (ComplexArray, shape (Nt, K*Nr)) – The compound precoding matrix for all UTs.

  • ibr (IntArray, shape (K*Nr,)) – The number of bits per symbol for each data stream (active and inactve).

Returns:

x – The precoded signal to be transmitted by the BS.

Return type:

ComplexArray, shape (Nt, M)

class NeutralPrecoder[source]

Bases: Precoder

Neutral Precoder.

This precoder acts as a ‘neutral element’ for precoding.It does not perform any precoding and simply passes the data symbols through without any modification.

In addition, the power allocation is uniform across the data streams (so no real power allocation is performed either).

Finally, in case of coordinated beamforming, the combining matrices for each UT are set to the identity matrix (so no real combining is performed either).

static compute(csi: ChannelStateInformation, Pt: float, K: int) tuple[ndarray[tuple[Any, ...], dtype[complexfloating]], ndarray[tuple[Any, ...], dtype[complexfloating]] | None, ndarray[tuple[Any, ...], dtype[complexfloating]]][source]

Compute the compound precoding matrix.In case of coordinated beamforming, the combining matrices for each UT are computed as well.

In addition, the equalization coefficients for each data stream are computed as well. These will be used by the UTs to correctly rescale the received symbols before the decoding process.

Parameters:
  • csi (ChannelStateInformation) – The channel state information (CSI) of the system.

  • Pt (float) – The total transmit power available at the BS.

  • K (int) – The number of user terminals (UTs) in the system.

Returns:

  • F (ComplexArray, shape (Nt, K*Nr)) – The compound precoding matrix for all UTs. It contains the power allocation across the data streams as well.

  • G (ComplexArray, shape (K*Nr, K*Nr) or None) – The compound combining matrix (block diagonal) for all UTs in case of coordinated beamforming. None otherwise.

  • C_eq (ComplexArray, shape (K*Nr,)) – The equalization coefficients for all UTs.

class SVDPrecoder[source]

Bases: Precoder

Singular Value Decomposition (SVD) Precoder.

The optimal precoding strategy for a single-user MIMO system.This precoding strategy is only available for single-user systems, since it requires combining all data streams.

static compute(csi: ChannelStateInformation, Pt: float, K: int) tuple[ndarray[tuple[Any, ...], dtype[complexfloating]], ndarray[tuple[Any, ...], dtype[complexfloating]] | None, ndarray[tuple[Any, ...], dtype[complexfloating]]][source]

Compute the compound precoding matrix.In case of coordinated beamforming, the combining matrices for each UT are computed as well.

In addition, the equalization coefficients for each data stream are computed as well. These will be used by the UTs to correctly rescale the received symbols before the decoding process.

Parameters:
  • csi (ChannelStateInformation) – The channel state information (CSI) of the system.

  • Pt (float) – The total transmit power available at the BS.

  • K (int) – The number of user terminals (UTs) in the system.

Returns:

  • F (ComplexArray, shape (Nt, K*Nr)) – The compound precoding matrix for all UTs. It contains the power allocation across the data streams as well.

  • G (ComplexArray, shape (K*Nr, K*Nr) or None) – The compound combining matrix (block diagonal) for all UTs in case of coordinated beamforming. None otherwise.

  • C_eq (ComplexArray, shape (K*Nr,)) – The equalization coefficients for all UTs.

class ZFPrecoder[source]

Bases: Precoder

Zero-Forcing (ZF) Precoder.

The precoder aims to completely eliminate all interference at the user terminals.The precoding matrix is therefore computed as the pseudo-inverse of the effective channel matrix H_eff.

In addition, the power allocation across the data streams is optimal in the sense that it maximizes the sum rate of the system under the total power constraint Pt.

static compute(csi: ChannelStateInformation, Pt: float, K: int) tuple[ndarray[tuple[Any, ...], dtype[complexfloating]], ndarray[tuple[Any, ...], dtype[complexfloating]] | None, ndarray[tuple[Any, ...], dtype[complexfloating]]][source]

Compute the compound precoding matrix.In case of coordinated beamforming, the combining matrices for each UT are computed as well.

In addition, the equalization coefficients for each data stream are computed as well. These will be used by the UTs to correctly rescale the received symbols before the decoding process.

Parameters:
  • csi (ChannelStateInformation) – The channel state information (CSI) of the system.

  • Pt (float) – The total transmit power available at the BS.

  • K (int) – The number of user terminals (UTs) in the system.

Returns:

  • F (ComplexArray, shape (Nt, K*Nr)) – The compound precoding matrix for all UTs. It contains the power allocation across the data streams as well.

  • G (ComplexArray, shape (K*Nr, K*Nr) or None) – The compound combining matrix (block diagonal) for all UTs in case of coordinated beamforming. None otherwise.

  • C_eq (ComplexArray, shape (K*Nr,)) – The equalization coefficients for all UTs.

class BDPrecoder[source]

Bases: Precoder

Block Diagonalization (BD) Precoder.

Firstly, the multi-user precoder aims to completely eliminate all inter-user interference at the user terminals. This is achieved by choosing the multi-user precoding matrix of each UT such that it spans the null space of the interfering channel matrix of that UT.

Secondly, the single-user precoder for each UT is computed as the SVD precoder of the effective channel matrix of that UT after applying the multi-user precoding matrix. Analogue to SVD precoding in a SU-MIMO system. Same for the single-user combiner.

static compute(csi: ChannelStateInformation, Pt: float, K: int) tuple[ndarray[tuple[Any, ...], dtype[complexfloating]], ndarray[tuple[Any, ...], dtype[complexfloating]] | None, ndarray[tuple[Any, ...], dtype[complexfloating]]][source]

Compute the compound precoding matrix.In case of coordinated beamforming, the combining matrices for each UT are computed as well.

In addition, the equalization coefficients for each data stream are computed as well. These will be used by the UTs to correctly rescale the received symbols before the decoding process.

Parameters:
  • csi (ChannelStateInformation) – The channel state information (CSI) of the system.

  • Pt (float) – The total transmit power available at the BS.

  • K (int) – The number of user terminals (UTs) in the system.

Returns:

  • F (ComplexArray, shape (Nt, K*Nr)) – The compound precoding matrix for all UTs. It contains the power allocation across the data streams as well.

  • G (ComplexArray, shape (K*Nr, K*Nr) or None) – The compound combining matrix (block diagonal) for all UTs in case of coordinated beamforming. None otherwise.

  • C_eq (ComplexArray, shape (K*Nr,)) – The equalization coefficients for all UTs.

class WMMSEPrecoder[source]

Bases: Precoder

Combining

class Combiner[source]

The Combiner Abstract Base Class (ABC).

This class is responsible for implementing a combining strategy and effectively combining the received signals in each user terminal.

abstractmethod static compute(H_k: ndarray[tuple[Any, ...], dtype[complexfloating]]) ndarray[tuple[Any, ...], dtype[complexfloating]][source]

Compute the combining matrix for a given user terminal.

In case of coordinated beamforming, the combiner matrix is computed in the BS and sent to the user terminal. Then, the identity matrix is returned by this method.

Parameters:

H_k (ComplexArray, shape (Nr, Nt)) – The channel matrix for the this UT.

Returns:

G_k – The computed combining matrix for the this UT.

Return type:

ComplexArray, shape (Nr, Nr)

static apply(y_k: ndarray[tuple[Any, ...], dtype[complexfloating]], G_k: ndarray[tuple[Any, ...], dtype[complexfloating]], ibr_k: ndarray[tuple[Any, ...], dtype[integer]]) ndarray[tuple[Any, ...], dtype[complexfloating]][source]

Apply the combining matrix to the received signal.

Parameters:
  • y_k (ComplexArray, shape (Nr, M)) – The received signal for the this UT.

  • G_k (ComplexArray, shape (Nr, Nr)) – The combining matrix for the this UT.

  • ibr_k (IntArray, shape (Nr,)) – The information bit rate for each data stream of the this UT.

Returns:

z_k – The combined signal for the this UT.

Return type:

ComplexArray, shape (Ns_k, M)

class NeutralCombiner[source]

Bases: Combiner

Neutral Combiner.

This combiner acts as a ‘neutral element’ for combining.It does not perform any combining and simply passes the received signal through without any modification.

static compute(H_k: ndarray[tuple[Any, ...], dtype[complexfloating]]) ndarray[tuple[Any, ...], dtype[complexfloating]][source]

Compute the combining matrix for a given user terminal.

In case of coordinated beamforming, the combiner matrix is computed in the BS and sent to the user terminal. Then, the identity matrix is returned by this method.

Parameters:

H_k (ComplexArray, shape (Nr, Nt)) – The channel matrix for the this UT.

Returns:

G_k – The computed combining matrix for the this UT.

Return type:

ComplexArray, shape (Nr, Nr)

class LSVCombiner[source]

Bases: Combiner

Left Singular Vector (LSV) Combiner.

The rows of the combining matrix are computed as the conjugate-transposed left singular vectors of the channel matrix H_k. The order of the singular vectors is determined by the descending order of the corresponding singular values. In that way, the strongest singular modes of the channel are used when effectively applying the combining matrix to the Ns_k data streams.

static compute(H_k: ndarray[tuple[Any, ...], dtype[complexfloating]]) ndarray[tuple[Any, ...], dtype[complexfloating]][source]

Compute the combining matrix for a given user terminal.

In case of coordinated beamforming, the combiner matrix is computed in the BS and sent to the user terminal. Then, the identity matrix is returned by this method.

Parameters:

H_k (ComplexArray, shape (Nr, Nt)) – The channel matrix for the this UT.

Returns:

G_k – The computed combining matrix for the this UT.

Return type:

ComplexArray, shape (Nr, Nr)