PDSCH: Lower Physical layer Chain Decoder

This module implements receiver side of PDSCH lower physical downlink shared channel. It consists of channel estimation, symbol equalization, layer demapping, symbol demapping and descrambling.

Alternative text

An Example of how to initialize and call PDSCH Lower Phy Decoder

modOrder          = 2
isChannelPerfect  = True
isEqualized       = False

pdschDecoderLowerPhyChain = PDSCHDecoderLowerPhy(modOrder,isChannelPerfect,isEqualized)

#resourceGrid: A numpy array of size (numBatches x numRx x numRxAntennas x numSymbols x numSubcarriers)
#pdschIndices: A tuple of size (numBatches, numBSs, portIndices, subcarrierIndices, symbolsIndices)
rnti              = np.array([32015, 50374, 36064])
nID               = np.array([831, 798, 382])
snr               = 10**3
#channelEstimates: A numpy array of size (numBatches x numRx x numRxAntennas x numTx x numTxAntennas x numSymbols x numSubcarriers)
numTBs            =  1
demappingMethod   = "app"
constellationType = "qam"
hard_out          = False
LLRs              = pdschDecoderLowerPhyChain(resourceGrid,pdschIndices,rnti,nID,snr,channelEstimates,numTBs,demappingMethod,constellationType,hard_out)

The details of the input-output interface for lower physical layer decoder is provided below.

class toolkit5G.PhysicalChannels.PDSCHDecoderLowerPhy(modOrder, isChannelPerfect=True, isEqualized=False)[source]

Generates the QPSK symbols processed by PBCH chain as per Section of [3GPPTS38211pdsch]. The PBCH symbols generated by the chain can be directly inserted into SSB Grid.

  • modOrder (int) – Defines the modulation order (number of bits per symbol). It must be a multiple of 2.

  • isChannelPerfect (bool) – Defines whether the PDSCH payload is decoded based on the perfect channel information. The Default value is True which necessitates that channelEstimates are passed.

  • isEqualized (bool) – It is set to true if the transmit grid is passed through AWGN channel (Only AWGN Noise is added based on SNR). The Default value is False.


The size of controlResourceSet0, searchSpace0, ssbIndex and ssbSubCarrierOffset must be consistent.

  • rxGrid ((numBatches x numRx x numRxAntennas x numSymbols x numSubcarriers), np.complex64) – Defines the received OFDM resource grid.

  • pdschIndices (tuple (numBatches, numBSs, portIndices, subcarrierIndices, symbolsIndices)) – Defines the indices where the PDSCH symbols are located in equalized time-frequency grid.Derived from PDSCH Lower Phy

  • rnti ((int or NumPy array, np.int)) – Defines rnti - It defines the radio network temporary identifier (RNTI) \(\in \{1,2,..,65519\}\).

  • nID ((int or NumPy array, np.int)) – Defines nID - It defines dataScramblingIdentityPDSCH(2), \(\text{n}_{\text{ID}} \in \{0,1,2,..,65535\}\).

  • snr (float) – Defines Signal to Noise ratio.

  • channelEstimates (np.ndarray) – Defines the Channel Estimates for equalizing the received symbols.

  • numTBs (int) – Defines the number of transport blocks received for PDSCH.

  • demapping_method (str) – Defines the demapping method \(\in \{\)“app”, “maxlog”}.

  • constellationType = “qam” – Defines symbol modulation/mapping type \(\in \{\)“qam”,”bpsk”,”pi/2-bpsk”\(\}\).

  • hard_out (bool) – Defines the type of output demapper will return. Default value is False.

  • Accessed using

  • ``<PDSCH Lower PHY Decoder Object name>.<Attribute name>``

  • uncodedBits (np.array) – The Hard-decoded scrambled bits


  • LLRs ([numTBs,], list)

  • The log likelihood ratio of the descrambled bits. The length of the list depends on the number of TBs numTBs

  • i.e one array of LLRs when the number of TBs is one and two arrays of LLRs when the number of TBs is two


It is to be taken into consideration that the Lower Phy Decoder arguments should be consistent with the corresponding transmitter side Upper Phy and Lower Phy or else the implementation may collapse