StreamManagement#

class sionna.phy.mimo.StreamManagement(rx_tx_association: numpy.ndarray, num_streams_per_tx: int)[source]#

Bases: sionna.phy.object.Object

Class for management of streams in multi-cell MIMO networks.

Stream management determines which transmitter is sending which stream to which receiver. Transmitters and receivers can be user terminals or base stations, depending on whether uplink or downlink transmissions are considered. This class has various properties that are needed to recover desired or interfering channel coefficients for precoding and equalization. In order to understand how the various properties can be used, we recommend to have a look at the source code of the LMMSEEqualizer or RZFPrecoder.

Parameters:
  • rx_tx_association (numpy.ndarray) – A binary NumPy array of shape [num_rx, num_tx] where rx_tx_association[i,j]=1 means that receiver i gets one or multiple streams from transmitter j.

  • num_streams_per_tx (int) – Indicates the number of streams that are transmitted by each transmitter.

Notes

Several symmetry constraints on rx_tx_association are imposed to ensure efficient processing. All row sums and all column sums must be equal, i.e., all receivers have the same number of associated transmitters and all transmitters have the same number of associated receivers. It is also assumed that all transmitters send the same number of streams num_streams_per_tx. StreamManagement is independent of the actual number of antennas at the transmitters and receivers.

Examples

The following code snippet shows how to configure StreamManagement for a simple uplink scenario, where four transmitters send each one stream to a receiver:

import numpy as np
from sionna.phy.mimo import StreamManagement

num_tx = 4
num_rx = 1
num_streams_per_tx = 1

# Indicate which transmitter is associated with which receiver
# rx_tx_association[i,j] = 1 means that transmitter j sends one
# or multiple streams to receiver i.
rx_tx_association = np.zeros([num_rx, num_tx])
rx_tx_association[0,0] = 1
rx_tx_association[0,1] = 1
rx_tx_association[0,2] = 1
rx_tx_association[0,3] = 1

sm = StreamManagement(rx_tx_association, num_streams_per_tx)

Attributes

property num_rx: int#

Number of receivers.

property num_tx: int#

Number of transmitters.

property num_streams_per_tx: int#

Number of streams per transmitter.

property num_streams_per_rx: int#

Number of streams transmitted to each receiver.

property num_interfering_streams_per_rx: int#

Number of interfering streams received at each receiver.

property num_tx_per_rx: int#

Number of transmitters communicating with a receiver.

property num_rx_per_tx: int#

Number of receivers communicating with a transmitter.

property precoding_ind: numpy.ndarray#

Indices needed to gather channels for precoding.

A NumPy array of shape [num_tx, num_rx_per_tx], where precoding_ind[i,:] contains the indices of the receivers to which transmitter i is sending streams.

property stream_association: numpy.ndarray#

Association between receivers, transmitters, and streams.

A binary NumPy array of shape [num_rx, num_tx, num_streams_per_tx], where stream_association[i,j,k]=1 means that receiver i gets the k th stream from transmitter j.

property detection_desired_ind: numpy.ndarray#

Indices needed to gather desired channels for receive processing.

A NumPy array of shape [num_rx*num_streams_per_rx] that can be used to gather desired channels from the flattened channel tensor of shape […,num_rx, num_tx, num_streams_per_tx,…]. The result of the gather operation can be reshaped to […,num_rx, num_streams_per_rx,…].

property detection_undesired_ind: numpy.ndarray#

Indices needed to gather undesired channels for receive processing.

A NumPy array of shape [num_rx*num_streams_per_rx] that can be used to gather undesired channels from the flattened channel tensor of shape […,num_rx, num_tx, num_streams_per_tx,…]. The result of the gather operation can be reshaped to […,num_rx, num_interfering_streams_per_rx,…].

property tx_stream_ids: numpy.ndarray#

Mapping of streams to transmitters.

A NumPy array of shape [num_tx, num_streams_per_tx]. Streams are numbered from 0,1,… and assigned to transmitters in increasing order, i.e., transmitter 0 gets the first num_streams_per_tx and so on.

property rx_stream_ids: numpy.ndarray#

Mapping of streams to receivers.

A NumPy array of shape [num_rx, num_streams_per_rx]. This array is obtained from tx_stream_ids together with the rx_tx_association. rx_stream_ids[i,:] contains the indices of streams that are supposed to be decoded by receiver i.

property stream_ind: numpy.ndarray#

Indices needed to gather received streams in the correct order.

A NumPy array of shape [num_rx*num_streams_per_rx] that can be used to gather streams from the flattened tensor of received streams of shape […,num_rx, num_streams_per_rx,…]. The result of the gather operation is then reshaped to […,num_tx, num_streams_per_tx,…].

property rx_tx_association: numpy.ndarray#

Association between receivers and transmitters.

A binary NumPy array of shape [num_rx, num_tx], where rx_tx_association[i,j]=1 means that receiver i gets one or multiple streams from transmitter j.