Transmitter Chain
Transmitter chain of Upper Physical Layer Processing of Physical Uplink Shared Channel.
the transmitting chain of Upper Physical Layer Processing of Physical Uplink Shared Channel which involves the following algorithms.
Transport Block Size computation
The size of the transport block is computed with reference to the concept specified in the Section 6.1.4.2 of [3GPPTS38214_pusch]
Transport Block Processing (CRC Attachment) to the Transport Block
Attachment of CRC bits to the transport block as described in the Section 6.2.1 of [3GPPTS38212_pusch]
Code Block Segmentation
Then the transport block involves segmentation wherein the block is divided into number of code blocks as described in the Section 6.2.3 of [3GPPTS38212_pusch]
Channel Encoding (LDPC)
The segmented blocks are then LDPC coded as described in the Section 6.2.4 of [3GPPTS38212_pusch]
Rate Matching
Rate matching of LDPC coded blocks involves two process as described in the Section 6.2.5 of [3GPPTS38212_pusch]
Bit Selection
Bit Interleaver
Code Block Concatenation
The code blocks after rate matching is then concatenated according to the description given in the Section 6.2.6 of [3GPPTS38212_pusch]
Symbol Mapping
The codeword is then modulated based on the modulation order specified in the Section 6.3.1.2 of [3GPPTS38211_pusch]
Example : Transmission of Transport Block wherein the transport block not given as an input.
symbolsPerSlot = 10 #Number of Symbols per slot
numRB = 50 #Number of Resource Blocks
scalingField = '00' #Scaling field
mcsIndex = 5 #Modulation Coding scheme index
additionalOverhead = 12 #Additional Overheads
numlayers = [4, 0] #Number of layers
numTBs = 1 #Number of Transport Blocks
enableLBRM = 0 #enable / disable Limited Buffer Rate Matching
rvid1 = 1 #Redundancy Version ID for transport block 1
numBatch = 5 #Number of User equipments
tbLen1 = None #Transport Block Size 1
tblock1 = None # Generate the bits for transport block1
verbose = False ##Disabling from displaying information about the progress in the execution of the modules.
puschTx = PUSCHUpperPhy(symbolsPerSlot, numRB, mcsIndex, numlayers, scalingField, additionalOverhead, numTBs, verbose ) #Object processing the transmitter chain of Upper Physial Layer processing of PUSCH
puschData = puschTx(enableLBRM, rvid1, numBatch) # Returns the Modulated Symbols
Example : Transmission of Transport Block where the transport block is also inputed.
symbolsPerSlot = 8 #Number of Symbols per slot
numRB = 20 #Number of Resource Blocks
scalingField = '01' #Scaling field
mcsIndex = 14 #Modulation Coding scheme index
additionalOverhead = 0 #Additional Overheads
numlayers = [2, 3] #Number of layers
numTBs = 2 #Number of Transport Blocks
enableLBRM = 0 #enable / disable Limited Buffer Rate Matching
rvid1 = 1 #Redundancy Version ID
numBatch = 3 #Number of User equipments
tbLen1 = 213176 #Transport Block Size 1
tblock1 = np.random.randint(2,
size = (numBatch, tbLen1),
dtype = int) # Generate the bits for transport block1
verbose = False ##Disabling from displaying information about the progress in the execution of the modules.
puschTx = PUSCHUpperPhy(symbolsPerSlot, numRB, mcsIndex, numlayers, scalingField, additionalOverhead, numTBs, verbose ) #Object processing the transmitter chain of Upper Physial Layer processing of PUSCH
puschData = puschTx(enableLBRM, rvid1, numBatch, tblock1) # Returns the Modulated Symbols
- class toolkit5G.PhysicalChannels.PUSCHUpperPhy(symbolsPerSlot, numRB, mcsIndex, numlayers, scalingField, additionalOverhead, numTBs=1, verbose=False)[source]
This class performs the transmitting chain of Upper Physical Layer Processing of Physical Uplink Shared Channel
- Parameters:
symbolsPerSlot (int) – Number of symbols allocated per Slot. It takes a scalar or numpy integer. It can take values between 1 and 14.
numRB (int) – Number of Physical Resource Blocks allocated. It takes a positive scalar or numpy integer.
mcsIndex (int) – Modulation and Coding Scheme (MCS) Index. It takes a scalar or numpy integer. It can take any values between 0 and 28.
numlayers (numpy array) – Number of MIMO layers (the number of layers is equal to the number of allocated DMRS Ports). It takes numpy array containing integers of length 2. If the number of Transport Blocks processed is 2, then it can take values between 1 and 8. Otherwise, it can take value between 1 and 4.
scalingField (str) – Transport Block Scaling Field. It accepts a string. Valid Strings are ‘00’, ‘01’, ‘10’.
additionalOverhead (int) – Additional Overheads that results in reduced number of available Resource Elements for data transfer. It takes a scalar or numpy integer. Valid values are 0, 6, 12 or 18.
numTBs (int) – The Physical layer processes 1 Transport Block for each resource allocation in the uplink direction. It represents number of Transport Blocks to be processed.
verbose (bool) – By enabling verbose, it displays information about the progress in the execution of the modules. Such as size of the input/output vectors inputed to the modules and parameters being passed. By default, set to ‘False’.
- Input:
enableLBRM (bool) – Enable / Disable Limited Buffer Rate Matching. The concept of LBRM to help reduce the requirement for buffering large code blocks, thus minimalizing the memory required.
rvid1 (int) – Redundancy Version ID which selects the starting position for the extracting the bits from the buffer.
numBatch (int) – Number of User Equipments
tblock1 (numpy array) –
An array of Transport Block, if provided when
numTBs
is equal to 1.Size of the array, [Number of user equipments, Transport Block Size]. By default it is set to ‘None’. If ‘None’, the transport block is computed internally else can be inputed.
- Attributes:
Transport Block Size – : scalar or numpy integer
Transport Block Transmitter Processing –
: numpy ndarray […, \(\text{Tb}_\text{size}\) + \(\text{N}_\text{crc}\)], np.float32
where, \(\text{Tb}_\text{size}\) is the transport block size and \(\text{N}_\text{crc}\) is number of CRC bits
Code Block Segmentation –
- : numpy ndarray [\(\dots, \text{N}_\text{cb}, \text{K}_\text{cb}\)], np.float32
Returns \(\text{N}_\text{cb}\) code-blocks each of size \(\text{K}_\text{cb}\) where \(\text{K}_\text{cb}\) is the number of information bits after segmentation.
LDPC Channel Coded Bits –
- : Tensor […, \(\text{N}_\text{LPDC}\)], tf.float32
2+D tensor of same shape as Code block segmentation module besides last dimension has changed to \(\text{N}_\text{LPDC}\) containing the encoded codeword bits.
Bit Selection of Rate Matching for LDPC –
- :[k,], list where k is 1, np.float32
Returns a list of rate matched codewords. The list can have either 1 or 2 codeword-segments based on the condition specified in 3GPP TS 38.212 version 16 Section 5.4.2.1. The dimension of codeword-segments-i is […, \(\text{N}_\text{G}^\text{i}\), \(\text{E}_\text{i}\)] where \(\text{N}_\text{cb} = \sum_{\text{i}=0}^{\text{k}} \text{N}_\text{G}^\text{i}\) and \(\text{E}_\text{i}\) is number of rate-matched bits for codeword-segments-i. The details of computation of \(\text{N}_\text{G}^\text{i}\) and \(\text{E}_\text{i}\) are provided in section 5.4.2.1 of [3GPPTS38212pusch]
Bit Interleaver of Rate Matching for LDPC –
- :[k,], list where k is 1, np.float32
The shape of each codeword-segments in the output matches the shape of each codeword-segments as the output of Bit Selection list.
Code Block Concatenation –
- :[k,], list where k is 1, np.float32
Return an array of concatenated code block segments dimension, […, G], where G is number of target bits.
- Output:
Symbol Mapping –
- :[k, ], list where k is 1, tf.complex64
Return a list of modulated symbols corresponding to the User Equipments. The dimension is […, \(\text{N}_\text{symb}\)] where \(\text{N}_\text{symb}\) is the number modulated symbols which is equal to \(\frac {G} {modOrder}\), where modOrder is the modulation order
References
[1]. 5G NR in Bullets, edition 1, Chris Jhonson.
[2]. 3GPP TS 38.212 version 16 Section 6.2
[3]. 3GPP TS 38.212 version 16 Section 6.3.1.2