PUSCHReceiver#

class sionna.phy.nr.PUSCHReceiver(pusch_transmitter, channel_estimator=None, mimo_detector=None, tb_decoder=None, return_tb_crc_status: bool = False, stream_management=None, input_domain: str = 'freq', l_min: int | None = None, precision: str | None = None, device: str | None = None, **kwargs)[source]#

Bases: sionna.phy.block.Block

This block implements a full receiver for batches of 5G NR PUSCH slots sent by multiple transmitters. Inputs can be in the time or frequency domain. Perfect channel state information can be optionally provided. Different channel estimators, MIMO detectors, and transport decoders can be configured.

The block combines multiple processing blocks into a single block. Blocks with dashed lines are optional and depend on the configuration.

If the input_domain equals “time”, the inputs \(\mathbf{y}\) are first transformed to resource grids with the OFDMDemodulator. Then channel estimation is performed, e.g., with the help of the PUSCHLSChannelEstimator. If channel_estimator is chosen to be “perfect”, this step is skipped and the input \(\mathbf{h}\) is used instead. Next, MIMO detection is carried out with an arbitrary OFDMDetector. The resulting LLRs for each layer are then combined to transport blocks with the help of the LayerDemapper. Finally, the transport blocks are decoded with the TBDecoder.

Parameters:
  • pusch_transmitter – Transmitter used for the generation of the transmit signals.

  • channel_estimator – Channel estimator to be used. If None, the PUSCHLSChannelEstimator with linear interpolation is used. If “perfect”, no channel estimation is performed and the channel state information h must be provided as additional input. Defaults to None.

  • mimo_detector – MIMO detector to be used. If None, the LinearDetector with LMMSE detection is used. Defaults to None.

  • tb_decoder – Transport block decoder to be used. If None, the TBDecoder with its default settings is used. Defaults to None.

  • return_tb_crc_status (bool) – If True, the status of the transport block CRC is returned as additional output. Defaults to False.

  • stream_management – Stream management configuration to be used. If None, it is assumed that there is a single receiver which decodes all streams of all transmitters. Defaults to None.

  • input_domain (str) – Domain of the input signal. Defaults to “freq”.

  • l_min (int | None) – Smallest time-lag for the discrete complex baseband channel. Only needed if input_domain equals “time”. Defaults to None.

  • precision (str | None) – Precision used for internal calculations and outputs. If set to None, precision is used.

  • device (str | None) – Device for computation. If None, the default device is used.

Inputs:
  • y – [batch size, num_rx, num_rx_ant, num_ofdm_symbols, fft_size], torch.complex or [batch size, num_rx, num_rx_ant, num_time_samples + l_max - l_min], torch.complex. Frequency- or time-domain input signal.

  • no – [batch_size, num_rx, num_rx_ant] or only the first n>=0 dims, torch.float. Variance of the AWGN.

  • h – [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_ofdm_symbols, num_subcarriers], torch.complex or [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_time_samples + l_max - l_min, l_max - l_min + 1], torch.complex. Perfect channel state information in either frequency or time domain (depending on input_domain) to be used for detection. Only required if channel_estimator equals “perfect”.

Outputs:
  • b_hat – [batch_size, num_tx, tb_size], torch.float. Decoded information bits.

  • tb_crc_status – [batch_size, num_tx], torch.bool. Transport block CRC status.

Examples

>>> pusch_config = PUSCHConfig()
>>> pusch_transmitter = PUSCHTransmitter(pusch_config)
>>> pusch_receiver = PUSCHReceiver(pusch_transmitter)
>>> channel = AWGN()
>>> x, b = pusch_transmitter(16)
>>> no = 0.1
>>> y = channel([x, no])
>>> b_hat = pusch_receiver(y, no)

Attributes

property resource_grid#

OFDM resource grid underlying the PUSCH transmissions