5G/NR - Waveform  





A few years ago from now (Jul 2017) when the discussion about 5G was at early phase, the hottest topic was 'what kind of waveform will be used in 5G' and a lot of new idea (new waveform) were proposed (If you want to look into some snapshot on this technical history, take a look at 5G Waveform Candate page). In those discussion, you might have seen many people/many techical documents talking about 'what is the problem of current OFDM based waveform' and 'why we need to redesign the waveform in 5G'. However, in more recent discussion I start sensing that the good old buddy (OFDM) would get more attention and finally as 3GPP specification rolls out, it is decided to go with the old and familiar waveform OFDM. It might be a little bit disappoiting to those who have been expecting a completely new technology (disruptive technology), but those who is working in the area of baseband DSP or FPGA in legacy LTE, this conclusion would sound like a blessing :)

If you are already familiar with the OFDM technolgy and LTE waveform, there would be only a small additional portions that you need to study. If you are new to this technolgy, it would be a good timing for you to start studying a new things (I would recommend you to start from this page : OFDM Introduction).

Overall Procedure for Waveform Generation

Following illustration (based on 38.300 - 5.1) shows overall flow of waveform generation for downlink and uplink. The biggest difference between NR and LTE is that NR can use CP-OFDM for Uplink as well as DFT-s-OFDM depending on use case.

Whether you use CP-OFDM or DFT-s-OFDM can be configurable except msg3 by sepcifying RRC parameters as shown below

38.331 15.3 (2018-10)


RACH-ConfigCommon ::=   SEQUENCE {

    rach-ConfigGeneric              RACH-ConfigGeneric,

    totalNumberOfRA-Preambles       INTEGER (1..63)      OPTIONAL,   -- Need S

    ssb-perRACH-OccasionAndCB-PreamblesPerSSB   CHOICE {

        oneEighth    ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},

        oneFourth    ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},

        oneHalf      ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},

        one          ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},

        two          ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},

        four         INTEGER (1..16),

        eight        INTEGER (1..8),

        sixteen      INTEGER (1..4)

    }                  OPTIONAL, - Need M 

   groupBconfigured                    SEQUENCE {

        ra-Msg3SizeGroupA                   ENUMERATED {b56, b144, b208, b256, b282, b480,

                                                        b640, b800, b1000, spare7, spare6, spare5,

                                                        spare4, spare3, spare2, spare1},

        messagePowerOffsetGroupB            ENUMERATED { minusinfinity, dB0, dB5, dB8, dB10,

                                                        dB12, dB15, dB18},

        numberOfRA-PreamblesGroupA          INTEGER (1..64)

    }                                     OPTIONAL,   -- Need R


    ra-ContentionResolutionTimer            ENUMERATED { sf8, sf16, sf24, sf32, sf40, sf48,

                                                         sf56, sf64},

    rsrp-ThresholdSSB                       RSRP-Range         OPTIONAL,   -- Need R

    rsrp-ThresholdSSB-SUL                   RSRP-Range         OPTIONAL,   -- Need R

    prach-RootSequenceIndex                 CHOICE {

        l839                                    INTEGER (0..837),

        l139                                    INTEGER (0..137)


    msg1-SubcarrierSpacing                  SubcarrierSpacing,

    msg3-transformPrecoding               ENUMERATED {enabled}    OPTIONAL,   -- Need R  





    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,



    pusch-TimeDomainAllocationList              SetupRelease {



    pusch-AggregationFactor                     ENUMERATED { n2, n4, n8 }

    mcs-Table                                   ENUMERATED {qam256, qam64LowSE}

    mcs-TableTransformPrecoder                  ENUMERATED {qam256, qam64LowSE}

    transformPrecoder                           ENUMERATED {enabled, disabled}  

    codebookSubset                              ENUMERATED {fullyAndPartialAndNonCoherent,



    maxRank                                     INTEGER (1..4)

    rbg-Size                                    ENUMERATED { config2}

    uci-OnPUSCH                                 SetupRelease { UCI-OnPUSCH }

    tp-pi2BPSK                                  ENUMERATED {enabled}




ConfiguredGrantConfig ::= SEQUENCE {

   frequencyHopping ENUMERATED                 {intraSlot, interSlot} ,

    cg-DMRS-Configuration                       DMRS-UplinkConfig,

    mcs-Table                                   ENUMERATED {qam256, qam64LowSE}

    mcs-TableTransformPrecoder                  ENUMERATED {qam256, qam64LowSE}

    uci-OnPUSCH SetupRelease                    { CG-UCI-OnPUSCH } OPTIONAL,

    resourceAllocation                          ENUMERATED { resourceAllocationType0,


                                                             dynamicSwitch },

    rbg-Size                                    ENUMERATED {config2},

    powerControlLoopToUse                       ENUMERATED {n0, n1},

    p0-PUSCH-Alpha                              P0-PUSCH-AlphaSetId,

    transformPrecoder                           ENUMERATED {enabled, disabled},  

    nrofHARQ-Processes                          INTEGER(1..16),

    repK                                        ENUMERATED {n1, n2, n4, n8},

    repK-RV                                     ENUMERATED {s1-0231, s2-0303, s3-0000},

    periodicity                                 ENUMERATED {

                                                    sym2, sym7, sym1x14, sym2x14, sym4x14,

                                                    sym5x14, sym8x14, sym10x14, sym16x14,

                                                    sym20x14,sym32x14, sym40x14, sym64x14,

                                                    sym80x14, sym128x14, sym160x14, sym256x14,

                                                    sym320x14, sym512x14,sym640x14, sym1024x14,

                                                    sym1280x14, sym2560x14, sym5120x14,sym6,

                                                    sym1x12, sym2x12, sym4x12, sym5x12,

                                                    sym8x12, sym10x12, sym16x12, sym20x12,

                                                    sym32x12,sym40x12, sym64x12, sym80x12,

                                                    sym128x12, sym160x12, sym256x12, sym320x12,

                                                    sym512x12, sym640x12,sym1280x12, sym2560x12


    configuredGrantTimer                        INTEGER (1..64) OPTIONAL, -- Need R

    rrc-ConfiguredUplinkGrant                   SEQUENCE {

                                                   timeDomainOffset          INTEGER (0..5119),

                                                   timeDomainAllocation      INTEGER (0..15),

                                                   frequencyDomainAllocation BIT STRING (SIZE(18)),

                                                   antennaPort               INTEGER (0..31),

                                                   dmrs-SeqInitialization    INTEGER (0..1),

                                                   precodingAndNumberOfLayers  INTEGER (0..63),

                                                   srs-ResourceIndicator       INTEGER (0..15),

                                                   mcsAndTBS                   INTEGER (0..31),


                                                                INTEGER (1.. maxNrofPhysicalResourceBlocks-1)


                                                                INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1)


                                               } OPTIONAL, -- Need R



CP OFDM Sequence Generation

When 3GPP 38.211 was released, the first thing I checked was waveform equation since I have been waiting so long for the final conclusion to come out. Following is the waveform equation specified in 38.211 and I put the waveform equation of the legacy LTE from 36.211 for comparison.

What is your first impression ? You may think NR(5G) waveform is much simpler than the LTE waveform. Even though these two equation look very differently but if you take a closer look you would notice the difference is very small. In LTE, the waveform generation equation (basically IFFT equation) is split into two parts just to remove the point located at DC location (i.e, at frequency = 0 in baseband). In NR(5G), this DC removal is not required any more and the full IFFT equation is combine into one.


Is that all ?  NR waveform generation is simpler than LTE waveform generation (at least mathematically) ?

It is not all. As you see in Frame Structure page, in NR(5G) several difference numerology (i.e, different subcarrier spacing and symbol length) are supported whearas in LTE there is only one numerology. Those different numerology are not completely new waveform on its own. All of them can be derived from a common mathematical equation by scaling up and down a couple of paramters as illustrated below.

Transform Precoding

As mentioned above, unlike LTE NR has two options for UL Waveform. One is CP-OFDM (same as DL Waveform) and the other one is DFT-s-OFDM which is same as LTE UL waveform. Transform Precoding is the first step to create DFT-s-OFDM waveform as highlighed below.  Whether UE need to use CP-OFDM or DFT-s-OFDM is determined by following RRC Parameter.

  • RACH-ConfigCommon.msg3-transformPrecoding(msg3-tp)
  • PUSCH-Config.transformPrecoding(PUSCH-tp)


In term of functionality, Transform Precoding is to spread UL data in a special way to reduce PAPR(Peak-to-Average Power Ratio) of the waveform. In terms of mathematics, Transform Precoding is just a form of DFT(Discrete Fourier Transform) as you see in the equation shown below.

If UE is to use multi-layer (UL MIMO) the equation is as below (this is the original form described in 38.211 -

If UE is to use single layer, the equation can be simplified as below. I would look more obvious that Transform Precoding is basically DFT.


[1] 38.211 NR;Physical channels and modulation(Release 15)