5G/NR - PUSCH                                           Home : www.sharetechnote.com

 

 

 

 

 

PUSCH

 

This page is mainly for transport and physical layer process for PUSCH transmission. The overall procedure of the process are listed as below.  

 

 

 

 

PUSCH Transport Process

 

 

 

 

 

(1) Transport block CRC attachment

 

 

 

 

 

(2) LDPC base graph selection

 

 

 

 

 

(3) Code block segmentation And Code Block CRC Attachment

 

 

 

 

 

i) Determine the max size of the code block (Kcb)

: The max size of the code block depends on LDPC base graph type as follows.

  • For LDPC base graph type 1 : Kcb = 8448
  • For LDPC base graph type 2 : Kcb = 3840

 

 

ii) Determine the number of Codeblocks

 

    if B(Transport block size) < Kcb(Max Codeblock size)

        L = 0

        C (number of codeblocks) = 1

        B' = B   // this mean 'No Segmentation'.

    else

        L = 24

        C = Ceiling(B/(Kcb - L))

        B' = B + C * L     

 

 

iii) Determine the number of bits in each code block

 

    K'(the number of bits in each code block) = B'/C

 

 

iv) Determine Kb

 

    For LDPC base graph type 1

      Kb = 22

     

    For LDPC base graph type 2

      if B (Transport blocksize) > 640

        Kb = 10

      else if B (Transport blocksize) > 560

        Kb = 9   

      else if B (Transport blocksize) > 192

        Kb = 8

      else

        Kb = 6

 

 

v) find the minimum value of  Z in all sets of lifting sizes in [38.212-Table 5.3.2-1: Sets of LDPC lifting size]

vi) denote Zc such that (Kb * Zc) >= K'

vii) set K = 22 Zc for LDPC base graph 1

          K = 10 Zc for LDPC base graph 2

 

 

viii) perform segmentation and add CRC bits

    s = 0  // s = bit position in B (transport block)

     

    for r = 0 to C-1

      for k = 0 to K'-L-1

        crk = bs

        s = s + 1

      end for

       

      if C > 1  // Do this if the number of the code block is more than 1

        Calculate pr0,pr1,pr2,...,pr(L-1) using the sequence cr0,cr1,cr2,...,cr(K'-L-1) and g_CRC24B(D)

        for k = K'-L to K'-1  // Append CRC bit

          crk = pr(k+L-K')

        end for

      end if

      for k = K' to K-1  // Insertion of filler bis

        crk = < NULL >

      end for

    end for

 

 

 

(4) Channel Coding

 

Perform LDPC as described in 38.212 - 5.3.2

 

 

 

(5) Rate Matching

 

 

 

 

 

(6) Code Block Concatenation

 

 

 

 

 

(7) Data and control multiplexing

 

 

 

(8) Scrambling

 

 

 

 

 

(9) Modulation

 

 

 

 

 

(10) Layer Mapping

 

 

 

 

 

(11) Transform Precoding

 

 

This is to convert the PUSCH data into the form of DFT-s-OFDM (a kind of SC-FDMA as in LTE PUSCH). This step is performed only transformprecoder in PUSCH-Config or msg3-transformPrecoding in RACH-ConfigCommon.  

 

 

 

(12) Precoding

 

Mathemaically this step is pretty simple. Just mutiplying a matrix called Precoding matrix to the data from the previous step. But the problem is how to figure out the precoding matrix itself (i.e, how to determine the precoding matrix) is extremely complicated. Since this precoding matrix determination process is such a complicated, I had to create another page for the process. Refer to this page for the details of the process.

 

Just for the high level view, the precoding matrix is determined by two different method : codebook and non-codebook based.

 

In codebook based method, the matrix is determined by the information specified in DCI and some additional configurations in RRC message as follows.

 

 

There are many difference types of tables to be applied for the precoding. Which table should be used for a specific case ? As shown below, depending on the number of layers, the number of antenna ports and on waveform type (transform precoding enabled or disabled), a specific precoding table is selected.

 

# of Layers

# of Antenna Ports

Transform Precoding

Precoding Matrix (38.211)

1

2

 

Table 6.3.1.5-1

4

enabled

Table 6.3.1.5-2

disabled

Table 6.3.1.5-3

2

2

disabled

Table 6.3.1.5-4

4

disabled

Table 6.3.1.5-5

3

4

disabled

Table 6.3.1.5-6

4

4

disabled

Table 6.3.1.5-7

 

 

In Non-codebook based method, the precoding matrix is determined by the measurement result of NZP-CSI-RS resource.

 

NOTE 1 : As illustrated above, simply put this step is a mater of selecting a specific matrix(W) and transform PUSCH data with the matrix. It would sound simple, but in reality it would not be as simple as it sound because the mechanism of selecting a specific matrix from huge tables of matrix sets. There are many factors and additional procedure involved in the matrix selection and this process is explained in a separate page here.

 

NOTE 2 : Once you understand the process of selecting(determining) a precoding matrix, the next step is to understand the exact meaning of those matrix. For this, you need to understand the mathemtical meaning of Precoding and the mathematical meaning of each elements in the matrix. I know not so many people (including me) likes math -:). But this is necessary step if you realy want to understand the exact meaning. For the meaning of Precoding itself, refer to Precoding page (LTE DL Precoding and 5G Downlink CSI RS Codebook) and my visual note www.slide4math.com (Go to [Engineering]->[1]->Matrix Complex).

 

 

 

(13) Mapping to VRB

 

 

 

 

 

(14) Mapping from VRB to PRB

 

 

< Non-Interleaved >

 

 

< Interleaved >

 

 

 

RRC Parameters

 

 

38.331 15.3 (2018-10)

 

PUSCH-Config ::= SEQUENCE {

    dataScramblingIdentityPUSCH                 INTEGER (0..1023) OPTIONAL,

    txConfig                                    ENUMERATED {codebook, nonCodebook}

    dmrs-UplinkForPUSCH-MappingTypeA            SetupRelease { DMRS-UplinkConfig }

    dmrs-UplinkForPUSCH-MappingTypeB            SetupRelease { DMRS-UplinkConfig }

    pusch-PowerControl                          PUSCH-PowerControl

    frequencyHopping                            ENUMERATED {intraSlot, interSlot}

    frequencyHoppingOffsetLists                 SEQUENCE (SIZE (1..4)) OF

                                                     INTEGER (1.. maxNrofPhysicalResourceBlocks-1)

    resourceAllocation                          ENUMERATED { resourceAllocationType0,

                                                             resourceAllocationType1,

                                                             dynamicSwitch},

    pusch-TimeDomainAllocationList              SetupRelease {

                                                         PUSCH-TimeDomainResourceAllocationList

                                                }

    pusch-AggregationFactor                     ENUMERATED { n2, n4, n8 }

    mcs-Table                                   ENUMERATED {qam256, qam64LowSE}

    mcs-TableTransformPrecoder                  ENUMERATED {qam256, qam64LowSE}

    transformPrecoder                           ENUMERATED {enabled, disabled}

    codebookSubset                              ENUMERATED {fullyAndPartialAndNonCoherent,

                                                            partialAndNonCoherent,

                                                            nonCoherent}

    maxRank                                     INTEGER (1..4)

    rbg-Size                                    ENUMERATED { config2}

    uci-OnPUSCH                                 SetupRelease { UCI-OnPUSCH }

    tp-pi2BPSK                                  ENUMERATED {enabled}

    ...

}

 

UCI-OnPUSCH ::= SEQUENCE {

    betaOffsets CHOICE {

        dynamic                                 SEQUENCE (SIZE (4)) OF BetaOffsets,

        semiStatic                              BetaOffsets

    } OPTIONAL, -- Need M

    scaling                                     ENUMERATED { f0p5, f0p65, f0p8, f1 }

}

 

 

dataScramblingIdentityPUSCH  : Identifer used to initalite data scrambling (c_init) for both PUSCH. Corresponds to L1 parameter 'Data-scrambling-Identity'

 

txConfig  : Whether UE uses codebook based or non-codebook based transmission. Corresponds to L1 parameter 'ulTxConfig'

 

dmrs-UplinkForPUSCH-MappingTypeA  : DMRS configuration for PUSCH transmissions using PUSCH mapping type A (chosen dynamically via PUSCH-TimeDomainResourceAllocation)

 

dmrs-UplinkForPUSCH-MappingTypeB  :  DMRS configuration for PUSCH transmissions using PUSCH mapping type B (chosen dynamically via PUSCH-TimeDomainResourceAllocation)

 

pusch-PowerControl  :

 

frequencyHopping  : Configured one of two supported frequency hopping mode. If not configured frequency hopping is not configured. Corresponds to L1 parameter 'Frequency-hopping-PUSCH'. When the field is absent the UE applies the value Not configured

 

frequencyHoppingOffsetLists  : Set of frequency hopping offsets used when frequency hopping is enabled for granted transmission (not msg3) and type 2. Corresponds to L1 parameter 'Frequency-hopping-offsets-set'

 

resourceAllocation  :  Configuration of resource allocation type 0 and resource allocation type 1 for non-fallback DCI. Corresponds to L1 parameter 'Resouce-allocation-config'   

 

pusch-TimedomainAllocationList  :  List of PUSCH-TimeDomainResourceAllocation. If configured, the values provided herein override the values received in corresponding PDSCH-ConfigCommon. This information elements has an array structure as sown below. For each PUSCH scheduling, Time domain resource assignment of DCI 0_0 or DCI 0_1 specify a specific row number (row index) of the following table as stated in 38.214 - 6.1.2.1.   

    When the UE is scheduled to transmit a transport block and no CSI report, or the UE is scheduled to transmit a transport block and a CSI report on PUSCH by a DCI, the Time domain resource assignment field of the DCI provides a row index of a higher layer configured table pusch-symbolAllocation, where the indexed row defines the slot offset K2, the start and length indicator SLIV, and the PUSCH mapping type to be applied in the PUSCH transmission.

    pusch-AllocationList

    row 0

    PUSCH-TimeDomainResourceAllocation ::=  SEQUENCE {

        k2                                  INTEGER (0..7)                          

        mappingType                         ENUMERATED {typeA, typeB},

        startSymbolAndLength                BIT STRING (SIZE (7)) // SLIV

    }

    row 1

    PUSCH-TimeDomainResourceAllocation ::=  SEQUENCE {

        k2                                  INTEGER (0..7)                          

        mappingType                         ENUMERATED {typeA, typeB},

        startSymbolAndLength                BIT STRING (SIZE (7)) // SLIV

    }

    ...

    ...

    row N

    PUSCH-TimeDomainResourceAllocation ::=  SEQUENCE {

        k2                                  INTEGER (0..7)                          

        mappingType                         ENUMERATED {typeA, typeB},

        startSymbolAndLength                BIT STRING (SIZE (7)) // SLIV

    }

  

 

pusch-AggregationFactor  : Number of repetitions for data. Corresponds to L1 parameter 'aggregation-factor-UL' . When the field is absent the UE applies the value 1

 

mcs-Table  : Indicates which MCS table the UE shall use for PUSCH without transform precoder. Corresponds to L1 parameter 'MCS-Table-PUSCH'. When the field is absent the UE applies the value 64QAM

 

mcs-TableTransformPrecoder  :  Indicates which MCS table the UE shall use for PUSCH with transform precoding. Corresponds to L1 parameter 'MCS-Table-PUSCH-transform-precoding'. When the field is absent the UE applies the value 64QAM

 

transformPrecoder  :  The UE specific selection of transformer precoder for PUSCH. When the field is absent the UE applies the value msg3-tp. Corresponds to L1 parameter 'PUSCH-tp'

 

codebookSubset  : Subset of PMIs addressed by TPMI, where PMIs are those supported by UEs with maximum coherence capabilities. Corresponds to L1 parameter 'ULCodebookSubset'   

 

maxRank  : Subset of PMIs addressed by TRIs from 1 to ULmaxRank. Corresponds to L1 parameter 'ULmaxRank'  

 

rbg-Size  : Selection between config 1 and config 2 for RBG size for PUSCH. When the field is absent the UE applies the value config1. Corresponds to L1 parameter 'RBG-size-PUSCH'

 

uci-OnPUSCH  : Selection between and configuration of dynamic and semi-static beta-offset. If the field is absent or released, the UE applies the value 'semiStatic'. Corresponds to L1 parameter 'UCI-on-PUSCH'   

 

vrb-ToPRB-Interleaver  : Interleaving unit configurable between 2 and 4 PRBs. Corresponds to L1 parameter 'VRB-to-PRB-interleaver'

 

 

 

PUSCH-ConfigCommon ::=                  SEQUENCE {

    groupHoppingEnabledTransformPrecoding   ENUMERATED {enabled}      OPTIONAL,   -- Need R

    pusch-AllocationList       SEQUENCE (SIZE(1..maxNrofUL-Allocations))

                                     OF  PUSCH-TimeDomainResourceAllocation OPTIONAL,   -- Need R

    msg3-DeltaPreamble         INTEGER (-1..6)           OPTIONAL,   -- Need R

    p0-NominalWithGrant        INTEGER (-202..24)        OPTIONAL,   -- Need R

    ...

}

 

msg3-DeltaPreamble : Power offset between msg3 and RACH preamble transmission in steps of 1dB. Corresponds to L1 parameter 'Delta-preamble-msg3'    

 

 

 

Reference

 

[1]