5G/NR - Max Throughput Estimation

 

 

 

Max Throughput Esimation

Throughput estimation is not easy and not as simple as can be calculated by a simple equation. The reason is that the word throughput covers two different questions. The first is the ceiling a UE is allowed to reach, which follows from its reported capability and from a formula in 38.306. The second is what a scheduler actually delivers in a given slot, which depends on the grant, the channel and the overhead at that moment. This page answers the first question, and it says where that answer stops being useful.

Followings are some additional information related to max throughput estimation explained above

Theoretical Estimation of the Max Throughput

However, the rough estimation for a maximum throughput can roughly be estimated by following equation. The equation comes from 38.306, and it produces the peak data rate figures that get quoted for a device. It multiplies together everything the UE said it could handle, and then removes a fixed allowance for overhead. Nothing in it depends on the radio conditions of the moment.

<  38.306 v16.3 - 4.1.2 Supported max data rate for DL/UL >

Meaning of each parameters in this equation is as follows.

The 38.306 max data rate formula with every term annotated: layers, modulation order, scaling factor, LDPC code rate, RB count, symbol duration and overhead

  • J and the (j) superscript : The sum runs over the aggregated component carriers, so every term inside the bracket belongs to one carrier.
  • Max number of Layers : Reported as maxNumberMIMO-LayersPDSCH for downlink, and as maxNumberMIMO-LayersCB-PUSCH or maxNumberMIMO-LayersNonCB-PUSCH for uplink.
  • Max Modulation Order : Bits carried by one modulation symbol, so 8 for 256QAM.
  • ScalingFactor : Reported as 0.4, 0.75 or 0.8, and taken as 1.0 when the UE does not report it at all.
  • Max LDPC Code Rate : Fixed at 948/1024, which is 0.926, and it is the same for every carrier and every UE.
  • Max Number of RBs : Set by the carrier bandwidth and the subcarrier spacing, then multiplied by the 12 subcarriers in one RB.
  • The symbol duration term : 10-3 divided by 14 x 2μ, so a higher subcarrier spacing packs more OFDM symbols into the same millisecond.
  • Overhead : 0.14 for FR1 downlink, 0.18 for FR2 downlink, 0.08 for FR1 uplink and 0.10 for FR2 uplink.

Putting one ordinary case through it is the fastest way to see what the equation does. The case below is a single FR1 carrier, which is the configuration most often quoted for a 5G device.

QuantityValueWhere it comes from
Component carriers, J1single carrier, no aggregation
Subcarrier spacing30 kHz, so μ = 1supportedSubcarrierSpacingDL
Channel bandwidth100 MHzsupportedBandwidthDL
Number of RBs27338.101-1 Table 5.3.2-1, for 100 MHz at 30 kHz
Layers4maxNumberMIMO-LayersPDSCH
Modulation order8, for 256QAMsupportedModulationOrderDL
ScalingFactor1.0field absent, so the default applies
Max code rate948/1024 = 0.926fixed by the formula
Overhead0.14FR1 downlink
Result2337 Mbpsthe arithmetic below

The arithmetic runs in one pass. 273 RB times 12 gives 3276 subcarriers. At 30 kHz there are 28 OFDM symbols in every millisecond, so one carrier carries 91,728,000 resource elements per second. Four layers at 8 bits per symbol take that to 2,935,296,000 bits per second before coding. The code rate removes 7.4 percent, and the overhead allowance removes a further 14 percent. What is left is 2337 Mbps.

That result is a ceiling rather than a prediction. It assumes every slot is a downlink slot, every symbol carries PDSCH, and the UE holds the top modulation and the full layer count without interruption. A TDD carrier removes a large part of it on its own, because the uplink slots in the pattern carry no PDSCH at all.

NOTE : This method would give you the ideal max throughput, but in real operation there would be some more overhead for various reasons like additional DMRS addition, SLIV value, Number of Slots scheduled in a radio frame. If you want to get more practical throughput considering all of these factors, you'd better estimate TBS first and then estimate throughput based on TBS. Refer to Method 2 in this page.

  • The formula is a capability ceiling : Every term is a reported maximum. So the result is what the UE may reach, not what it will see.
  • Only two terms are constants : The code rate of 948/1024 and the overhead allowance are fixed, and everything else arrives in the UE capability.
  • Subcarrier spacing enters twice : It sets the symbol rate through 14 x 2μ, and it also decides how many RBs fit in the channel bandwidth.
  • The TDD pattern is not in the equation : Every symbol is counted as downlink, so a TDD carrier reaches a fraction of the printed figure.
  • One 100 MHz FR1 carrier gives 2337 Mbps : That is 4 layers, 256QAM and 273 RB at 30 kHz. It is a convenient number to check a tool against.

RRC Parameters

Followings are conveyed by UE Capability Information message. These parameters are used in the formula explained above. Each field below is a maximum that the UE claims for one carrier, and the network cannot schedule past it. The listing is trimmed to the fields the equation needs. The dots stand for everything else in the same SEQUENCE.

Following is based on 38.331 v19.3.0 (Release 19)

FeatureSetDownlink ::= SEQUENCE {

     featureSetListPerDownlinkCC     SEQUENCE (SIZE (1..maxNrofServingCells)) OF FeatureSetDownlinkPerCC-Id,

     intraBandFreqSeparationDL        FreqSeparationClass OPTIONAL,

     scalingFactor                          ENUMERATED {f0p4, f0p75, f0p8} OPTIONAL,

     ....

}

 

FeatureSetUplink ::= SEQUENCE {

    featureSetListPerUplinkCC         SEQUENCE (SIZE (1.. maxNrofServingCells)) OF FeatureSetUplinkPerCC-Id,

    scalingFactor                          ENUMERATED {f0p4, f0p75, f0p8} OPTIONAL,

    ....

}

 

FeatureSetUplinkPerCC ::= SEQUENCE {

    supportedSubcarrierSpacingUL          SubcarrierSpacing,

    supportedBandwidthUL                    SupportedBandwidth,

    channelBW-90mhz                          ENUMERATED {supported} OPTIONAL,

    mimo-CB-PUSCH SEQUENCE {

         maxNumberMIMO-LayersCB-PUSCH        MIMO-LayersUL OPTIONAL,

         maxNumberSRS-ResourcePerSet            INTEGER (1..2)

    } OPTIONAL,

    maxNumberMIMO-LayersNonCB-PUSCH        MIMO-LayersUL OPTIONAL,

    supportedModulationOrderUL                     ModulationOrder OPTIONAL

}

 

FeatureSetDownlinkPerCC ::= SEQUENCE {

    supportedSubcarrierSpacingDL                  SubcarrierSpacing,

    supportedBandwidthDL                            SupportedBandwidth,

    channelBW-90mhz                                  ENUMERATED {supported} OPTIONAL,

    maxNumberMIMO-LayersPDSCH                 MIMO-LayersDL OPTIONAL,

    supportedModulationOrderDL                    ModulationOrder OPTIONAL

}

Every SEQUENCE above is still present in Release 19, and every field in it is still spelled the same way. What changed is that two of those fields can no longer carry every value the equation needs. Later releases therefore add replacement fields beside them, in the extension groups below.

Following is based on 38.331 v19.3.0 (Release 19)

FeatureSetDownlinkPerCC-v1700 ::= SEQUENCE {

    supportedMinBandwidthDL-r17 SupportedBandwidth-v1700 OPTIONAL,

    ....

    supportedBandwidthDL-v1710 SupportedBandwidth-v1700 OPTIONAL,

    ....

}

FeatureSetDownlinkPerCC-v1720 ::= SEQUENCE {

    maxModulationOrderForMulticastDataRateCalculation-r17 ENUMERATED {qam64, qam256, qam1024} OPTIONAL,

    ....

}

FeatureSetDownlinkPerCC-v1780 ::= SEQUENCE {

    supportedBandwidthDL-v1780 SupportedBandwidth-v1700 OPTIONAL

}

FeatureSetDownlinkPerCC-v1840 ::= SEQUENCE {

    supportedBandwidthDL-v1840 SupportedBandwidth-v1840 OPTIONAL,

    supportedMinBandwidthDL-v1840 SupportedBandwidth-v1840 OPTIONAL

}

FeatureSetUplinkPerCC-v1700 ::= SEQUENCE {

    supportedMinBandwidthUL-r17 SupportedBandwidth-v1700 OPTIONAL,

    ....

    supportedBandwidthUL-v1710 SupportedBandwidth-v1700 OPTIONAL

}

FeatureSetUplinkPerCC-v1780 ::= SEQUENCE {

    supportedBandwidthUL-v1780 SupportedBandwidth-v1700 OPTIONAL

}

The bandwidth field is the clearest case. SupportedBandwidth was fixed in Release 15, and it stops at 100 MHz in FR1 and at 400 MHz in FR2. The Release 17 version reaches further in both ranges, and two later versions add narrow channels.

SupportedBandwidth ::= CHOICE {

    fr1 ENUMERATED {mhz5, mhz10, mhz15, mhz20, mhz25, mhz30, mhz40, mhz50, mhz60, mhz80, mhz100},

    fr2 ENUMERATED {mhz50, mhz100, mhz200, mhz400}

}

SupportedBandwidth-v1700 ::= CHOICE {

    fr1-r17 ENUMERATED {mhz5, mhz10, mhz15, mhz20, mhz25, mhz30, mhz35, mhz40, mhz45, mhz50, mhz60, mhz70, mhz80, mhz90, mhz100},

    fr2-r17 ENUMERATED {mhz50, mhz100, mhz200, mhz400, mhz800, mhz1600, mhz2000}

}

SupportedBandwidth-v1840 ::= ENUMERATED {mhz3}

SupportedBandwidth-v1900 ::= ENUMERATED {mhz7}

So a UE on a 90 MHz FR1 carrier, or on an 800 MHz carrier in FR2-2, reports that width in supportedBandwidthDL-v1710. The Release 15 field beside it holds a smaller value, because it has no way to express the real one. A tool that reads only the Release 15 field takes that smaller number into the RB count. The whole estimate is then too small.

The modulation field is the second case, and it stops at 256QAM.

ModulationOrder ::= ENUMERATED {bpsk-halfpi, bpsk, qpsk, qam16, qam64, qam256}

MIMO-LayersDL ::= ENUMERATED {twoLayers, fourLayers, eightLayers}

1024QAM for PDSCH in FR1 arrived in Release 17, and this field cannot express it. A UE declares that capability per band instead, as pdsch-1024QAM-FR1-r17 inside BandNR. So the modulation order of a 1024QAM capable device is not found in supportedModulationOrderDL at all.

Release 17 also added one field named for this calculation directly. The field maxModulationOrderForMulticastDataRateCalculation-r17 sits in FeatureSetDownlinkPerCC-v1720 and offers qam64, qam256 and qam1024. It applies to the multicast data rate rather than the unicast one, so it does not replace the field above.

One small mismatch appears between the annotated equation higher up this page and the listing here. The drawing gives four scaling factor values. The ASN.1 enumerates only three. Both are correct. The value 1.0 is not something the UE can send. It is what applies when the UE sends nothing.

  • The base SEQUENCEs are unchanged in Release 19 : Every field quoted at the top of this section is still present, and still spelled the same way, in 38.331 v19.3.0.
  • The Release 15 bandwidth field has a ceiling : SupportedBandwidth stops at 100 MHz in FR1 and 400 MHz in FR2, and wider carriers arrive in supportedBandwidthDL-v1710.
  • Reading only the Release 15 field under-reports : The wider carrier is never seen, so the RB count is too small and the estimate with it.
  • ModulationOrder stops at qam256 : 1024QAM for FR1 is declared per band as pdsch-1024QAM-FR1-r17 inside BandNR, and not in the feature set.
  • scalingFactor carries three values, not four : The ASN.1 enumerates f0p4, f0p75 and f0p8, and 1.0 is what applies when the field is absent.

Example 01 >

    featureSets {

      featureSetsDownlink {

        {

          featureSetListPerDownlinkCC {

            1

          },

          ue-SpecificUL-DL-Assignment supported

        },

        {

          featureSetListPerDownlinkCC {

            2

          },

          ue-SpecificUL-DL-Assignment supported

        },

        {

          featureSetListPerDownlinkCC {

            3

          },

          ue-SpecificUL-DL-Assignment supported

        },

        {

          featureSetListPerDownlinkCC {

            4

          },

          ue-SpecificUL-DL-Assignment supported

        },

        {

          featureSetListPerDownlinkCC {

            5

          },

          ue-SpecificUL-DL-Assignment supported

        },

        {

          featureSetListPerDownlinkCC {

            6

          },

          ue-SpecificUL-DL-Assignment supported

        },

        {

          featureSetListPerDownlinkCC {

            7

          },

          ue-SpecificUL-DL-Assignment supported

        }

      },

      featureSetsDownlinkPerCC {

        {

          supportedSubcarrierSpacingDL kHz30,

          supportedBandwidthDL fr1: mhz100,

          channelBW-90mhz supported,

          maxNumberMIMO-LayersPDSCH fourLayers,

          supportedModulationOrderDL qam256

        },

        {

          supportedSubcarrierSpacingDL kHz30,

          supportedBandwidthDL fr1: mhz100,

          maxNumberMIMO-LayersPDSCH fourLayers,

          supportedModulationOrderDL qam256

        },

        {

          supportedSubcarrierSpacingDL kHz15,

          supportedBandwidthDL fr1: mhz30,

          maxNumberMIMO-LayersPDSCH twoLayers,

          supportedModulationOrderDL qam256

        },

        {

          supportedSubcarrierSpacingDL kHz15,

          supportedBandwidthDL fr1: mhz20,

          maxNumberMIMO-LayersPDSCH fourLayers,

          supportedModulationOrderDL qam256

        },

        {

          supportedSubcarrierSpacingDL kHz15,

          supportedBandwidthDL fr1: mhz40,

          maxNumberMIMO-LayersPDSCH fourLayers,

          supportedModulationOrderDL qam256

        },

        {

          supportedSubcarrierSpacingDL kHz30,

          supportedBandwidthDL fr1: mhz100,

          maxNumberMIMO-LayersPDSCH twoLayers,

          supportedModulationOrderDL qam256

        },

        {

          supportedSubcarrierSpacingDL kHz15,

          supportedBandwidthDL fr1: mhz20,

          maxNumberMIMO-LayersPDSCH twoLayers,

          supportedModulationOrderDL qam256

        }

      },

      featureSetsUplink {

        {

          featureSetListPerUplinkCC {

            1

          },

          supportedSRS-Resources {

            maxNumberAperiodicSRS-PerBWP n16,

            maxNumberAperiodicSRS-PerBWP-PerSlot 6,

            maxNumberPeriodicSRS-PerBWP n16,

            maxNumberPeriodicSRS-PerBWP-PerSlot 6,

            maxNumberSemiPersistentSRS-PerBWP n2,

            maxNumberSemiPersistentSRS-PerBWP-PerSlot 2,

            maxNumberSRS-Ports-PerResource n1

          }

        },

        {

          featureSetListPerUplinkCC {

            2

          },

          supportedSRS-Resources {

            maxNumberAperiodicSRS-PerBWP n16,

            maxNumberAperiodicSRS-PerBWP-PerSlot 6,

            maxNumberPeriodicSRS-PerBWP n16,

            maxNumberPeriodicSRS-PerBWP-PerSlot 6,

            maxNumberSemiPersistentSRS-PerBWP n2,

            maxNumberSemiPersistentSRS-PerBWP-PerSlot 2,

            maxNumberSRS-Ports-PerResource n1

          }

        },

        {

          featureSetListPerUplinkCC {

            3

          },

          supportedSRS-Resources {

            maxNumberAperiodicSRS-PerBWP n16,

            maxNumberAperiodicSRS-PerBWP-PerSlot 6,

            maxNumberPeriodicSRS-PerBWP n16,

            maxNumberPeriodicSRS-PerBWP-PerSlot 6,

            maxNumberSemiPersistentSRS-PerBWP n2,

            maxNumberSemiPersistentSRS-PerBWP-PerSlot 2,

            maxNumberSRS-Ports-PerResource n1

          }

        },

        {

          featureSetListPerUplinkCC {

            4

          },

          supportedSRS-Resources {

            maxNumberAperiodicSRS-PerBWP n16,

            maxNumberAperiodicSRS-PerBWP-PerSlot 6,

            maxNumberPeriodicSRS-PerBWP n16,

            maxNumberPeriodicSRS-PerBWP-PerSlot 6,

            maxNumberSemiPersistentSRS-PerBWP n2,

            maxNumberSemiPersistentSRS-PerBWP-PerSlot 2,

            maxNumberSRS-Ports-PerResource n1

          }

        },

        {

          featureSetListPerUplinkCC {

            5

          },

          supportedSRS-Resources {

            maxNumberAperiodicSRS-PerBWP n16,

            maxNumberAperiodicSRS-PerBWP-PerSlot 6,

            maxNumberPeriodicSRS-PerBWP n16,

            maxNumberPeriodicSRS-PerBWP-PerSlot 6,

            maxNumberSemiPersistentSRS-PerBWP n2,

            maxNumberSemiPersistentSRS-PerBWP-PerSlot 2,

            maxNumberSRS-Ports-PerResource n1

          }

        },

        {

          featureSetListPerUplinkCC {

            2

          },

          supportedSRS-Resources {

            maxNumberAperiodicSRS-PerBWP n1,

            maxNumberAperiodicSRS-PerBWP-PerSlot 6,

            maxNumberPeriodicSRS-PerBWP n16,

            maxNumberPeriodicSRS-PerBWP-PerSlot 6,

            maxNumberSemiPersistentSRS-PerBWP n2,

            maxNumberSemiPersistentSRS-PerBWP-PerSlot 2,

            maxNumberSRS-Ports-PerResource n1

          }

        }

      },

      featureSetsUplinkPerCC {

        {

          supportedSubcarrierSpacingUL kHz30,

          supportedBandwidthUL fr1: mhz100,

          channelBW-90mhz supported,

          mimo-CB-PUSCH {

            maxNumberMIMO-LayersCB-PUSCH oneLayer,

            maxNumberSRS-ResourcePerSet 1

          },

          supportedModulationOrderUL qam256

        },

        {

          supportedSubcarrierSpacingUL kHz30,

          supportedBandwidthUL fr1: mhz100,

          mimo-CB-PUSCH {

            maxNumberMIMO-LayersCB-PUSCH oneLayer,

            maxNumberSRS-ResourcePerSet 1

          },

          supportedModulationOrderUL qam256

        },

        {

          supportedSubcarrierSpacingUL kHz15,

          supportedBandwidthUL fr1: mhz30,

          mimo-CB-PUSCH {

            maxNumberMIMO-LayersCB-PUSCH oneLayer,

            maxNumberSRS-ResourcePerSet 1

          },

          supportedModulationOrderUL qam256

        },

        {

          supportedSubcarrierSpacingUL kHz15,

          supportedBandwidthUL fr1: mhz20,

          mimo-CB-PUSCH {

            maxNumberMIMO-LayersCB-PUSCH oneLayer,

            maxNumberSRS-ResourcePerSet 1

          },

          supportedModulationOrderUL qam256

        },

        {

          supportedSubcarrierSpacingUL kHz15,

          supportedBandwidthUL fr1: mhz40,

          mimo-CB-PUSCH {

            maxNumberMIMO-LayersCB-PUSCH oneLayer,

            maxNumberSRS-ResourcePerSet 1

          },

          supportedModulationOrderUL qam256

        }

      },

Max Throughput Calculators

I found a couple of examples of the max throughput calculator as listed below. These are what I found in internet.. not my tool, but I think all of these tools are based on the fornula in 3GPP as summerized above.

A calculator is only as current as the tables behind it. Four things should be checked before trusting one.

The first is which release the bandwidth table comes from. A tool built on the Release 15 list has no 35, 45, 70 or 90 MHz entry for FR1, and nothing above 400 MHz for FR2. Such a tool cannot describe a Release 17 carrier at all.

The second is what it does with the scaling factor. That field is optional, and a UE that omits it is asking for 1.0. A tool that defaults to 0.4 without saying so returns under half of the right answer.

The third is whether the overhead follows the case. There are four allowances, one for each combination of frequency range and direction. A single allowance applied everywhere is wrong for three of the four.

The fourth is how it combines carriers. The equation is a sum of per carrier terms. So an aggregated result equals the single carrier result times the carrier count only when every carrier is configured the same way.

The worked example higher up this page is a convenient test input. A tool given one 100 MHz FR1 carrier at 30 kHz, with 4 layers and 256QAM, should return 2337 Mbps.

  • Check the release behind the bandwidth table : A Release 15 table has no 90 MHz entry for FR1 and nothing above 400 MHz for FR2.
  • Check the scaling factor default : An absent field means 1.0, and a tool that assumes 0.4 reports far too little.
  • Check that the overhead follows the case : The allowance differs between FR1 and FR2, and between downlink and uplink.
  • Check how the carriers are combined : The equation sums per carrier terms, so unequal carriers cannot be handled by multiplication.
  • Keep one known result as a test : One 100 MHz FR1 carrier at 30 kHz with 4 layers and 256QAM gives 2337 Mbps.

Reference

  • 5G UE Data Rate
  • 38.331 v19.3.0 : NR - Radio Resource Control (RRC) protocol specification. The ASN.1 on this page was checked against this version.