Amarisoft

NR SA PUSCH Transform Precoding

The purpose of this tutorial is to show you how to configure and verify PUSCH Transform Precoding. In LTE, we use the different waveform for DL and UL by default in which OFDMA is for DL and SC-FDMA(Single Carrier-FDMA) is used for UL. However in NR, we use the same type of waveform OFDM for both DL and UL in most of the default configuration. The reason why we use SC-FDMA in LTE UL is to decrease PAPR (Peak to Average Power Ratio). It implies that UL PAPR would be larger in NR default configuration comparing to LTE UL. For some specific case where low PAPR is necessary in NR, NR support a specific parameter to use SC-FDMA for UL and it is called 'Transform Precoding'.  You may think of Transform Precoding as another name for SC-FDMA. There are two stages of applying the Transform Precoding in NR as listed below.

You can enable both of them or enable only one of the options as you like.

Table of Contents

Introduction

PUSCH (Physical Uplink Shared Channel) Transform Precoding is a key technique in the 5G New Radio (NR) air interface, designed to optimize uplink transmission characteristics, particularly in scenarios demanding low Peak-to-Average Power Ratio (PAPR). In legacy LTE systems, OFDMA (Orthogonal Frequency Division Multiple Access) is employed in the downlink, while SC-FDMA (Single Carrier Frequency Division Multiple Access) is used in the uplink to address the high PAPR challenge, which is critical for power-limited User Equipment (UE). With 5G NR, OFDM (Orthogonal Frequency Division Multiplexing) is adopted for both downlink and uplink by default, providing increased flexibility, spectral efficiency, and simplified transceiver design. However, OFDM inherently exhibits higher PAPR, which can be detrimental for uplink transmissions—particularly for battery-powered devices. To address this, NR introduces Transform Precoding as an optional feature that effectively reintroduces SC-FDMA-like characteristics into the uplink waveform by applying a Discrete Fourier Transform (DFT) prior to subcarrier mapping. This architectural option allows NR to strike a balance between flexibility and power efficiency, enabling operators and device manufacturers to tailor uplink performance to specific scenarios, such as coverage enhancement or IoT applications. Transform Precoding can be selectively enabled at different stages—such as for initial random access (msg3) or for all subsequent uplink transmissions—via parameters configured in SIB1 or RRC signaling. Its significance lies in providing a standards-compliant method to lower PAPR, ensuring robust uplink performance, extending UE battery life, and supporting diverse deployment requirements within the broader 5G ecosystem.

Summary of the Tutorial

This tutorial demonstrates the procedure for testing transform precoding (SC-FDMA) enabled for both Msg3 and subsequent PUSCH transmissions in a 5G NR Standalone (SA) environment using Amarisoft’s UEsim and Callbox (gNB simulator).

The methodology focuses on aligning UE and gNB configurations, enabling and verifying transform precoding features for initial and subsequent uplink transmissions, and confirming correct operation through configuration checks and log analysis.

Test Setup

Setup A

Test setup for this tutorial is as shown below.

TestSetup Callbox UEsim 1sdr 01

Key Configuration Parameters

Followings are important configuration parameters for this tutorial. You may click on the items for the descriptions from Amarisoft documents.

Test 1 : Transform-Precoding enabled for both Msg3 and PUSCH afterwards

In this test I will show you how to apply transform precoding (SC-FDMA) to Msg3 and all the PUSCH after the msg3.

Configuration

An important thing in using UE sim is to do proper matching between UE sim configuration and Call box configuration In this tutorial, I used the ue.default.cfg and and enb.default.cfg without any change

If you use other Network (e.g, other network simulator or real network), you have to make it sure to configure UE sim according to the settings on network side

I used  ue-nr-sa.cfg. as it is

NR SA PUSCH TP Test 1 Config 01

I used gnb-sa-tf-precode.cfg which is copied from gnb-sa.cfg.

NR SA PUSCH TP Test 1 Config 02

The configuration in gnb-sa-tf-precode.cfg (Callbox) is set as follows. In this test, TDD is used and one of the default TDD config (NR_TDD_CONFIG 2) is applied. And SRS is disabled (USE_SRS 0) for simplicity.

NR SA PUSCH TP Test 1 Config 03

It doesn't matter whatever band and frequency is used for transform precoding. In this test, n78 (band :78) with SCS 30 Khz (subcarrier_spacing 30) is used.

NR SA PUSCH TP Test 1 Config 04

These are the main configuration parameter for transform preconding. Transform Precoding is applied to msg3 by setting msg3_tf_precoding to true and applied to all the PUSCH by setting tf_precoding to true.

NR SA PUSCH TP Test 1 Config 05

The configuration in ue-nr-sa.cfg  (UEsim) is set as follows. TDD is used for UEsim to be aligned to Callbox (gNB) configuration. BANDWIDTH 20 and band :78, subcarrier_spacing:30 are configured to get aligned to gNB configuration.

NR SA PUSCH TP Test 1 Config 06

Perform the Test

check if callbox confgiuration (gNB configuration) is properly set as you intended by the command 'cell phy' and 'cell'.

NR SA PUSCH TP Test 1 Run 01

If gNB configuration is done as you desire, power on UE on UEsim.

NR SA 2step RACH Test 1 Run 02

Make it sure that call setup is properly established using 't' command.

NR SA PUSCH TP Test 1 Run 03

Log Analysis

Sample Log

You can confirm that msg3 transform precoding is enabled by checking out msg3-transformPrecoder IE in SIB1.

NR SA PUSCH TP Test 1 Log 01

Transform Precoding for PUSCH after msg3 can be confirmed by checking out transformPrecodingEnabled in RRC Setup. If transformPrecodingEnabled exists, it indicates transform precoding is enabled.

NR SA PUSCH TP Test 1 Log 02

Make it sure that all the PUSCH are properly received and decoded by gNB. PUSCH log print itself does not print any specific information about transform precoding.

NR SA PUSCH TP Test 1 Log 03

RRC / NAS Signaling

SIB1 (SA)

: This is the SIB1 message sent by gNB  to enable transform precoding for msg1. (NOTE : You would see some IEs that has a specific assigned vale here, but consider it as just an example value. Those values should vary depending on test requirement)

{

  message c1: systemInformationBlockType1: {

    cellSelectionInfo {

      ...

    },

    cellAccessRelatedInfo {

      ...

    },

    connEstFailureControl {

      ...

    },

    servingCellConfigCommon {

      downlinkConfigCommon {

        frequencyInfoDL {

          ...

        },

        initialDownlinkBWP {

          genericParameters {

            locationAndBandwidth 13750,

            subcarrierSpacing kHz30

          },

          pdcch-ConfigCommon setup: {

            ...

          },

          pdsch-ConfigCommon setup: {

            ...

          }

        },

        bcch-Config {

          ...

        },

        pcch-Config {

          ...

        }

      },

      uplinkConfigCommon {

        frequencyInfoUL {

          scs-SpecificCarrierList {

            {

              offsetToCarrier 0,

              subcarrierSpacing kHz30,

              carrierBandwidth 51

            }

          }

        },

        initialUplinkBWP {

          genericParameters {

            locationAndBandwidth 13750,

            subcarrierSpacing kHz30

          },

          rach-ConfigCommon setup: {

            rach-ConfigGeneric {

              prach-ConfigurationIndex 160,

              msg1-FDM one,

              msg1-FrequencyStart 3,

              zeroCorrelationZoneConfig 15,

              preambleReceivedTargetPower -110,

              preambleTransMax n7,

              powerRampingStep dB4,

              ra-ResponseWindow sl20

            },

            ssb-perRACH-OccasionAndCB-PreamblesPerSSB one: n8,

            ra-ContentionResolutionTimer sf64,

            prach-RootSequenceIndex l139: 1,

            msg1-SubcarrierSpacing kHz30,

            restrictedSetConfig unrestrictedSet,

            msg3-transformPrecoder enabled

          },

          pusch-ConfigCommon setup: {

            ...

          },

          pucch-ConfigCommon setup: {

            ...

          }

        },

        timeAlignmentTimerCommon infinity

      },

      ssb-PositionsInBurst {

        ...

      },

      ssb-PeriodicityServingCell ms20,

      tdd-UL-DL-ConfigurationCommon {

        ...

      },

      ...

    },

    ue-TimersAndConstants {

      ...

RrcSetup (SA)

: This is the RrcSetup message sent by gNB  to enable transform precoding for PUSCH after msg1. (NOTE : You would see some IEs that has a specific assigned vale here, but consider it as just an example value. Those values should vary depending on test requirement)

{

  message c1: rrcSetup: {

    rrc-TransactionIdentifier 0,

    criticalExtensions rrcSetup: {

      radioBearerConfig {

        ...

      },

      masterCellGroup {

        ...

        },

        physicalCellGroupConfig {

          ...

        },

        spCellConfig {

          spCellConfigDedicated {

            initialDownlinkBWP {

              pdcch-Config setup: {

                ...

              },

              pdsch-Config setup: {

                ...

            },

            firstActiveDownlinkBWP-Id 0,

            uplinkConfig {

              initialUplinkBWP {

                pucch-Config setup: {

                  ...

                },

                pusch-Config setup: {

                  txConfig codebook,

                  dmrs-UplinkForPUSCH-MappingTypeA setup: {

                    dmrs-AdditionalPosition pos1,

                    transformPrecodingEnabled {

                    }

                  },

                  pusch-PowerControl {

                    ...

                  },

                  resourceAllocation resourceAllocationType1,

                  codebookSubset nonCoherent,

                  maxRank 1,

                  uci-OnPUSCH setup: {

                    ...

                  }

                },

                srs-Config setup: {

                  ...

                }

              },

              firstActiveUplinkBWP-Id 0,

              pusch-ServingCellConfig setup: {

              }

            },

            pdcch-ServingCellConfig setup: {

            },

            pdsch-ServingCellConfig setup: {

              ...

            },

            csi-MeasConfig setup: {

              ...