|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MCS / TBS / Code Rate in DetailThe concept of MCS (Modulation Coding Scheme), Code Rate, TB (Transport Block) and TBS (Transport Block Size) are same as LTE MCS, Code Rate, TBS.
Overall Steps to determin Qm, Code Rate, RV and TBSStep 1 : Read MCS from DCI and determin Qm (Modulation Scheme) and R(Code Rate) from following tables
NOTE : The problem is to figure out which of the above tables to be applied. This is a pretty complicated and confusing procedure to pick up a specific table. I summerized this table picking criteria here. Step 2 : Read RV(Redundancy Version) from DCI Step 3 : Determine TBS (Transport block Size) based on following factors PDSCH Transport Block Size DeterminationNR MCS and Code Rate are determined by a predefined table as in 38.214 - Table 5.1.3.1-1 and 38.214 - Table 5.1.3.1-2, which is pretty straight forward. However, determining TBS (Transport block size) in NR is more complicated than the one in LTE. In case of LTE, all the possibility of RBS are precalculated and listed as a big table. However, in NR the TBS determination process is described as a sequence of algorithm as summarized below (I think it will take a while to get familiar with this process). < Calculate N_info >As you see in the process illustrated above, the initial input for this algorithm is Ninfo. However, to figure out this Ninfo also requires long calculation process as below.
< 38.214 - Table 5.1.3.1-1: MCS index table 1 for PDSCH >
< 38.214 - Table 5.1.3.1-2: MCS index table 2 for PDSCH >
< 38.214 - Table 5.1.3.1-3: MCS index table 3 for PDSCH >
< 38.214 - Table 5.1.3.2-1: TBS for N_info <= 3824 >
< 38.214 v16.9 - Table 5.1.3.2-2: Scaling factor of Ninfo for P-RNTI, RA-RNTI and MSGB-RNTI > < Calculate TBS from N_info >This is an illustration based on 38.214 - 5.1.3.2 Transport block size determination. PUSCH Transport Block Size DeterminationPUSCH Transport block size is influenced by RRC Parameters at the stage of determining Modulation Order and Code Rate and this makes it so difficult and complicated to understand the whole process of TBS(Transport Size) Determination. The RRC parameters involved in this process is highlighted in red as shown below. 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} ... }
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, resourceAllocationType1, 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), frequencyHoppingOffset INTEGER (1.. maxNrofPhysicalResourceBlocks-1) pathlossReferenceIndex INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1) ... } OPTIONAL, -- Need R ... } < Modulation order and target code rate determination >I created following table based on the descriptions in 28.214-6.1.4.1(v15.3 - Oct 2018).
< Transport block size determination >I created following summary based on the descriptions in 28.214-6.1.4.2 (v15.3 - Oct 2018). NOTE : The condition for this case is described in 28.214-6.1.4.2 (v15.3 - Oct 2018) as follows. At first, it looks very confusing. It looked like three different 'if statement' with conflicting condition. But looking more closely, I realized all of these three lines makes up a single 'if statement'. You see all of these three lines are combined by 'or'. - 0 <= I_MCS <≤ 27 and transform precoding is disabled and Table 5.1.3.1-2 is used, or - 0 <≤ I_MCS <≤ 28 and transform precoding is disabled and a table other than Table 5.1.3.1-2 is used, or - 0 <≤ I_MCS <≤ 27 and transform precoding is enabled First Calculate N'_RE using following formula Next Calculate the total number of REs for PUSCH as follows. Next Calculate Ninfo as follows : Next step is same as downlink TBS determination process as shown below.
Max Throughput EstimationThere are roughly two approaches to estimate the max throughput. One of the most popular or best known method is to use the formula specified in 38.306-4.1.2. But this method would tend to give much higher value than you normally achieve in real life testing since it is hard to take into consider various overhead that you face. In my opinion, more accurate method is to estimate TBS for each slot within a radio frame and multiply the number with the number of radio frames per second. Method 1 : based on 38.306This method is explained in a different page here. Method 2 : based on TBSThis is based on the transport block size (TBS) estimation explained in this page. As you see in this page, this method goes through a little bit complicated process, so I wrote a Octave script to estimate the throughput as shown below. NOTE : This is not the perfect/complete script. For simplicity, I only implemented the high throughput path as indicated by red arrow below. I used Code Rate (R) value from 38.214 -Table 5.1.3.1-1 and Table 5.1.3.1-2, but real code rate can vary a little bit from the value in the table... but you can use the table value as a rough estimator.
Following is the result of an example run
Reference[1]
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||