There are roughly three different types of UL transmission scheme : not-configured, codebook based and non-codebook based. This scheme is determined by a RRC paramter txConfig.
- Parameters for Transmission Mode Determination
- Determination of W matrix
- Case 1 : txConfig in RRC = Non-codebook
- Case 2 : txConfig in RRC = codebook
- Case 3 : txConfig in RRC Not configured
- NonCodebook based Transmission
- Codebook based Transmission
- Codebook vs Non-Codebook based Transmission
- UE capability report vs applicable codebookSubset
- Number of configurable SRS
- txConfig and DCI type
- RRC Parameters
- Tables / Codebook
- Precoding matrix W for single-layer transmission using two antenna ports.
- Precoding matrix W for single-layer transmission using four antenna ports with transform precoding enabled.
- Precoding matrix W for single-layer transmission using four antenna ports with transform precoding disabled.
- Precoding matrix W for two-layer transmission using two antenna ports with transform precoding disabled
- Precoding matrix W for two-layer transmission using four antenna ports with transform precoding disabled
- Precoding matrix W for three-layer transmission using four antenna ports with transform precoding disabled.
- Precoding matrix W for four-layer transmission using four antenna ports with transform precoding disabled
- What Release 18 and Release 19 added
- Reference
Parameters for Transmission Mode Determination
Followings are the major factors (configuration) to determine the PUSCH Transmission Mode and Precoding Matrix. Depending on the combinations (permutations) of these parameters, a specific transmission mode/precoding matrix is determined, but the detailed procedure is pretty complicated (confusing to me). Basically most of this page is all about how a specific transmission mode/precoding matrix is determined by combination of these three parameters.
Good thing would be that the precoding matrix is always 1 when the number of layer is 1
The port count is the part to watch. A single layer on two antenna ports still picks one of the six matrices in Table 6.3.1.5-1, and a single layer on four ports picks one of twenty eight. Rank 1 removes the choice of how many streams to send, and it does not remove the choice of how to weight them across the ports.

txConfig is the switch : its two values, codebook and nonCodebook, choose which of the two schemes on this page applies, and leaving it out chooses the third.Two of the three are conditional : the figure marks codebookSubset and maxRank asOPTIONAL, -- Cond codebookBased , so neither is present unless txConfig says codebook.codebookSubset narrows the table, maxRank narrows the layer count : together they decide how much of a codebook a given UE is allowed to be sent.The three sit inside pusch-Config : the figure shows them under initialUplinkBWP, so they are configured per bandwidth part rather than per cell.
Determination of W matrix
Basically PUSCH transmission mode is a parameter that determines Precoding matrix during the PUSCH channel processing(See here for the Precoding step in the whole PUSCH transport process) and the transmission mode is determined by several factors in RRC as shown below. Simply put, this is all about determining W matrix in following equation.

According to 38.211 - 6.3.1.5, we can determine W matrix as follows.
Case 1 : txConfig in RRC = Non-codebook
This is the one case where 38.211 gives W without sending you to a table. The rule is a single line, and the note below it records why that line reads oddly. One thing to hold on to while reading both: this W is the matrix applied at the precoding step of 38.211, and that step is not the only place a precoder can enter the transmission.
W = Identity Matrix
Case 2 : txConfig in RRC = codebook
This is the branch where a table is actually consulted. The network sends a TPMI, the UE looks it up in one of the seven tables at the foot of this page, and the matrix it finds there is W. Which table applies is decided by three things, and the summary below the diagram lists them.
When number of layer = 1, number of antenna port = 1
W = 1
When number of layer >= 2 and number of antenna port >=2 (See Codebook based transmission for details)

The Precoding matrix is determined by the number of layers and physical antenna, and Transform Precoding as summarized below.
|
Number of Layers |
Number of Antenna |
Transform Precoding |
Precoding Matrix |
|
1 |
2 |
|
|
|
1 |
4 |
enabled |
|
|
1 |
4 |
disabled |
|
|
2 |
2 |
disabled |
|
|
2 |
4 |
disabled |
|
|
3 |
4 |
disabled |
|
|
4 |
4 |
disabled |
Case 3 : txConfig in RRC : Not configured
Leaving txConfig out is not the same as setting it to either value. The UE falls back to a single antenna port, so there is nothing to weight and no table to consult. This is the state a UE is in before the network has configured PUSCH at all, which is why DCI 0_0 is the only format that works here.
W = 1
NonCodebook based Transmission
Non-codebook based UL transmission in mobile communication refers to a method where the UE determines its transmission strategy without relying on a predefined codebook. The precoder is determined directly from measurements by the UE rather than from an indicated codebook/TPMI index. In this mode, UE calculate Precoder matrix as follows (based on 38.214-6.1.1.2)
-
the UE determines the precoder(s) and rank based on one or two SRI fields in the DCI.
-
These point to one or two SRS resources Sets configured by higher layers.
-
Only one SRS port per SRS resource can be configured.
-
The UE can calculate the SRS precoder based on measurements of an associated NZP CSI-RS resource:
-
For aperiodic SRS, the NZP CSI-RS is indicated in the SRS request field of the DCI. The association between SRS Resource Sets and NZP CSI-RS resources is configured by higher layers.
-
For periodic/semi-persistent SRS, the associated NZP CSI-RS resource is configured by higher layers.
- The UE calculates the precoder for SRS transmission based on the measurement of an associated NZP CSI-RS resource.
- Different configurations (aperiodic, periodic, semi-persistent) dictate how the NZP-CSI-RS resources and SRS resource sets are associated and triggered
-
The UE maps the SRI(s) to DM-RS ports in increasing order and transmits the PUSCH using the same antenna ports as the indicated SRS resources. The UE maps SRIs to DM-RS ports and corresponding PUSCH layers, transmitting PUSCH using the same antenna ports as the SRS ports indicated by SRIs.
i) figure out "SRS Resource Indicator" in DCI_0_0, DCI 0_1 and semistatically ( srs-ResourceIndicator in RRC if configured)
ii) figure out wideband SRI based on step i)
iii) figure out transmission rank and PUSCH Precoder
Codebook based Transmission
Codebook-based UL transmission in mobile communications involves a method where the UE determines its transmission strategy using a predefined set of precoding vectors, known as a codebook. Codebook based UL transmission relies on an indicated SRS resource to determine the codebook, and TPMI values to indicate which precoder to use from that codebook for the transmission. The number of layers is also indicated. In this mode, the precoding matrix is determined as follows (based on 38.214-6.1.1.1).
- Codebook Subset(PUSCH-Config.codebookSubset)
- Number of Antenna Ports
- PUSCH Transform Precoding(PUSCH-Config.transformPrecoder)
- PUSCH Max Rank (PUSCH-Config.maxRank)
- DMRS Config Type (DMRS-UplinkConfig.dmrs-Type)
- UL PTRS Configuration (PUSCH-Config.DMRS-UplinkConfig.PTRS-UplinkConfig)
-
Codebook Subsets:
-
The UE determines its codebook subsets based on TPMIs and the reception of the higher layer parameter codebookSubset in pusch-Config.
-
Transmission Rank and Power Transmission:
-
The maximum transmission rank may be set by the higher layer parameter maxRank in pusch-Config.
-
Different configurations and UE capabilities influence whether the transmission is fullyAndPartialAndNonCoherent, partialAndNonCoherent, or nonCoherent.
-
Antenna Port Usage:
-
The UE transmits PUSCH using the same antenna ports as the SRS ports indicated in the DCI format or configuredGrantConfig as per 38.214-6.1.2.3.
-
DM-RS Antenna Ports:
-
The DM-RS antenna ports are determined according to the ordering of DM-RS ports in 38.212.
i) figure out "SRS Resource Indicator(SRI)" and "Precoding information(TMPI) and number of layers" in DCI 0_1
ii) figure out following settings
iii) Select a specific TPMI table using all the information from step i) and ii), and the mapping tables summarized as below.
iv) Figure out TPMI from the selected table (Further details are as follows)
Codebook vs Non-Codebook based Transmission
The two schemes answer the same question from opposite ends. Codebook based transmission has the gNB choose the precoder and tell the UE which one it picked. Non-codebook based transmission has the UE choose, from its own measurement of a downlink reference signal, and the gNB only confirms the choice by pointing at an SRS resource.
Following is a comparative table between Codebook vs Non-Codebook based UL Transmission
|
Parameter |
Codebook Based |
Non-Codebook Based |
|---|---|---|
|
Precoder Determination |
Based on SRS-ResourceSet configuration which determines codebook, and indicated TPMI index choosing precoder from codebook |
Based on measurements of indicated SRS/CSI-RS resources |
|
Scheduling Options |
DCI formats 0_0, 0_1, 0_2 or semi-static configuration |
DCI formats 0_0, 0_1, 0_2 or semi-static configuration |
|
Rank Determination |
Indicated in number of layers field in DCI |
Determined from measurements by UE |
|
Number of Configured SRS Resources |
Up to 2 (4 in fullpowerMode2) |
Up to 4 |
|
DCI Contents |
SRS Resource Indicator (SRI) and Precoding and Number of Layers (TPMI + rank) |
SRS Resource Indicator (SRI) only |
|
UE Processing |
Applies configured codebook subset; uses TPMI to select precoder |
Calculates precoder from measurements |
|
Transmission Ports |
Same ports as indicated SRS resource |
Same ports as indicated SRS resource |
|
Codebook Configuration |
Codebook subset configuration based on UE capabilities |
No codebook configuration |
|
CSI-RS Association |
Periodic/semi-persistent SRS associated with configured NZP CSI-RS |
Aperiodic SRS associated with triggered NZP CSI-RS, periodic/semi-persistent SRS associated with configured NZP CSI-RS |
UE capability report vs applicable codebookSubset
A codebook subset is a restriction, not a feature. The three values name how coherently the UE can drive its own transmit chains. A UE that cannot hold a stable phase relationship between two power amplifiers must not be handed a precoder that assumes one. The network therefore has to keep its configuration inside what the UE reported.
Depending on UE capability, there are restrictions on the type of applicable codebookSubset as specified in 38.214-6.1.1.1.
- When UE capability report 'partialAndNonCoherent', 'fullyAndPartialAndNonCoherent' cannot be used. '
- When UE capability report 'NonCoherent', fullyAndPartialAndNonCoherent' or with 'partialAndNonCoherent' cannot be used
The reason for the restriction is visible in the codebook itself. Look at Table 6.3.1.5-1, which holds the six matrices for one layer on two ports. The first two are 1/√2 [1;0] and 1/√2 [0;1], and each of them drives one port and leaves the other silent. The remaining four drive both ports at once, with a relative phase of 1, −1, j or −j.
Driving both ports with a fixed relative phase only works if the UE can hold that phase between two separate power amplifiers. A UE that cannot is a nonCoherent UE, and the only entries it can honour are the first two. The three enumeration values name nested sets for that reason, and the names say so: fullyAndPartialAndNonCoherent contains partialAndNonCoherent, which contains nonCoherent.
The restriction therefore runs one way. A UE may always be configured with a subset smaller than it reported, because a coherent UE can still transmit on one port at a time. It must never be configured with a larger one, because the matrices in the larger set assume hardware the UE does not have.
The three values are nested, not parallel : each one contains the ones named after it, which is why the rule reads as a ceiling rather than a match.Non-coherent means antenna selection : the usable entries are the ones that excite a single port, and Table 6.3.1.5-1 puts those first.The capability is hardware, the configuration is policy : the UE reports what its transmit chains can do, and the network chooses anything at or below it.A wrong configuration is a specification violation : 38.214-6.1.1.1 says the UE shall not expect it, rather than describing what the UE should do about it.
Number of configurable SRS
The SRS resource count is where the two schemes differ most sharply in configuration. Codebook based transmission needs the gNB to measure one uplink beam and then select from a fixed table, so a small number of resources is enough. Non-codebook based transmission needs the UE to try several candidate precoders, so it needs more.
The number of SRS that can be configured is described as follows in 38.214-6.1.1.1 and 6.1.1.2
For codebook based (38.214-6.1.1.1)
-
A UE shall not expect to be configured with the higher layer parameter codebookSubset set to 'partialAndNonCoherent' when higher layer parameter nrofSRS-Ports in an SRS-ResourceSet with usage set to 'codebook' indicates that
two SRS antenna ports are configured. -
For codebook based transmission, the UE may be configured with a single SRS-ResourceSet set to 'codebook' and only one SRS resource can be indicated based on the SRI from within the SRS resource set.
The maximum number of configured SRS resources for codebook based transmission is 2 . If aperiodic SRS is configured for a UE, the SRS request field in DCI triggers the transmission of aperiodidc SRS resources. - When multiple SRS resources are configured by SRS-ResourceSet with usage set to 'codebook', the UE shall expect that higher layer parameters nrofSRS-Ports in SRS-Resource in SRS-ResourceSet shall be configured with the same value for all these SRS resources.
For non-codebook based (38.214-6.1.1.2)
-
The UE shall use one or multiple SRS resources for SRS transmission, where the number of SRS resources which can be configured to the UE for simultaneously transmission in the same RBs is a UE capability. Only one SRS port for each SRS resource is configured. Only one SRS resource set can be configured with higher layer parameter usage in SRS-ResourceSet set to 'nonCodebook'.
The maximum number of SRS resources that can be configured for non-codebook based uplink transmission is 4
txConfig and DCI type
The DCI format and the transmission scheme are not independent choices. A DCI carries the fields the scheme needs, so a format without a precoding field cannot schedule a precoded transmission. The rules below are the consequence of that, rather than four separate decisions taken by 3GPP.
According to 38.214-6.1.1, there is some relationship between applicable DCI 0_x type and txConfig as summarized below.
- When txConfig is not configured, only DCI 0_0 can be used (6.1.1).
- When txConfig is configured, DCI format 0_0, DCI format 0_1 or semi-static configuration can be used (6.1.1.1,6.1.1.2)
- If DCI 0_0 is used, PUSCH transmission is based on single antenna port(6.1.1)
- In FR2, DCI 0_0 cannot be used in a component carrier without configured PUCCH resource with PUCCH-SpatialRelationInfo(6.1.1)
One pattern runs through all four rules. DCI format 0_0 is the fallback format, and it carries neither an SRS resource indicator nor a precoding information field. A transmission scheduled by it therefore has nothing to select a precoder with, which is why the specification pins it to a single antenna port instead of leaving the matrix undefined.
DCI 0_0 cannot carry a precoder : it has no SRI and no precoding information field, so single port is the only transmission it can describe.txConfig absent means DCI 0_0 only : with no scheme configured there is nothing for the larger format to indicate.DCI 0_1 is where both schemes live : it carries the SRI for non-codebook based transmission and the SRI plus TPMI for codebook based.FR2 adds a beam condition : without a PUCCH resource carrying PUCCH-SpatialRelationInfo on the carrier, the UE has no spatial reference to transmit against.
RRC Parameters
Every listing below is quoted from
Following is based on
PUSCH-Config ::= SEQUENCE { dataScramblingIdentityPUSCH INTEGER (0..1023) OPTIONAL, -- Need StxConfig ENUMERATED {codebook, nonCodebook} OPTIONAL, -- Need S dmrs-UplinkForPUSCH-MappingTypeA SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M dmrs-UplinkForPUSCH-MappingTypeB SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M pusch-PowerControl PUSCH-PowerControl OPTIONAL, -- Need M frequencyHopping ENUMERATED {intraSlot, interSlot} OPTIONAL, -- Need S frequencyHoppingOffsetLists SEQUENCE (SIZE (1..4)) OF INTEGER (1.. maxNrofPhysicalResourceBlocks-1) OPTIONAL, -- Need M resourceAllocation ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch}, pusch-TimeDomainAllocationList SetupRelease { PUSCH-TimeDomainResourceAllocationList } OPTIONAL, -- Need M pusch-AggregationFactor ENUMERATED { n2, n4, n8 } OPTIONAL, -- Need S mcs-Table ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S mcs-TableTransformPrecoder ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S transformPrecoder ENUMERATED {enabled, disabled} OPTIONAL, -- Need ScodebookSubset ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent} OPTIONAL, -- Cond codebookBased maxRank INTEGER (1..4) OPTIONAL, -- Cond codebookBased rbg-Size ENUMERATED { config2} OPTIONAL, -- Need S uci-OnPUSCH SetupRelease { UCI-OnPUSCH} OPTIONAL, -- Need M tp-pi2BPSK ENUMERATED {enabled} OPTIONAL, -- Need S ..., [[ -- Release 16, the DCI format 0_2 counterparts of the two fields above ... codebookSubsetDCI-0-2-r16 ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent} OPTIONAL, -- Cond codebookBased maxRankDCI-0-2-r16 INTEGER (1..4) OPTIONAL, -- Cond codebookBased ... ul-FullPowerTransmission-r16 ENUMERATED {fullpower, fullpowerMode1, fullpowerMode2} OPTIONAL, -- Need R ... ]], [[ -- Release 17 ... mappingPattern-r17 ENUMERATED {cyclicMapping, sequentialMapping} OPTIONAL, -- Cond SRSsets ... ]], [[ -- Release 18, where the uplink rank passes four maxRank-v1810 INTEGER (5..8) OPTIONAL, -- Need R sTx-2Panel-r18 ENUMERATED {enabled} OPTIONAL, -- Need R multipanelSchemeSDM-r18 SDM-Scheme-r18 OPTIONAL, -- Need R multipanelSchemeSFN-r18 SFN-Scheme-r18 OPTIONAL, -- Need R codebookTypeUL-r18 SetupRelease { CodebookTypeUL-r18 } OPTIONAL, -- Need M ... ]], [[ -- Release 19 ... ]] } CodebookTypeUL-r18 ::= CHOICE { codebook1-r18 ENUMERATED {ng1n4n1, ng1n2n2}, codebook2-r18 ENUMERATED {ng2}, codebook3-r18 ENUMERATED {ng4}, codebook4-r18 ENUMERATED {ng8} }
Following is based on
UCI-OnPUSCH ::= SEQUENCE { betaOffsets CHOICE { dynamic SEQUENCE (SIZE (4)) OF BetaOffsets, semiStatic BetaOffsets } OPTIONAL, -- Need M scaling ENUMERATED { f0p5, f0p65, f0p8, f1 } }
Following is based on
SRS-Config ::= SEQUENCE {
srs-ResourceSetToReleaseList SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId OPTIONAL, -- Need N
srs-ResourceSetToAddModList SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet OPTIONAL, -- Need N
srs-ResourceToReleaseList SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-ResourceId OPTIONAL, -- Need N
srs-ResourceToAddModList SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-Resource OPTIONAL, -- Need N
tpc-Accumulation ENUMERATED {disabled} OPTIONAL, -- Need S
...,
[[
srs-RequestDCI-1-2-r16 INTEGER (1..2) OPTIONAL, -- Need S
srs-RequestDCI-0-2-r16 INTEGER (1..2) OPTIONAL, -- Need S
srs-ResourceSetToAddModListDCI-0-2-r16 SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet OPTIONAL, -- Need N
srs-ResourceSetToReleaseListDCI-0-2-r16 SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId OPTIONAL, -- Need N
... -- the positioning SRS members are omitted here
]],
[[
dci-TriggeringPosResourceSetLink-r18 ENUMERATED { enabled } OPTIONAL -- Need R
]],
[[
srs-TwoSeparatePowerControlAdjustmentStates-r19 ENUMERATED {enabled} OPTIONAL, -- Need R
tpc-OfSRS-ClosedLoopIndexInDCI-1-1-r19 ENUMERATED {enabled} OPTIONAL, -- Need R
srs-ClosedLoopIndexIndicatorInDCI-1-1-r19 ENUMERATED {enabled} OPTIONAL -- Need R
]]
}
Following is based on
SRS-ResourceSet ::= SEQUENCE {
srs-ResourceSetId SRS-ResourceSetId,
srs-ResourceIdList SEQUENCE (SIZE(1..maxNrofSRS-ResourcesPerSet)) OF SRS-ResourceId OPTIONAL, -- Cond Setup
resourceType CHOICE {
aperiodic SEQUENCE {
aperiodicSRS-ResourceTrigger INTEGER (1..maxNrofSRS-TriggerStates-1),
csi-RS NZP-CSI-RS-ResourceId OPTIONAL, -- Cond NonCodebook
slotOffset INTEGER (1..32) OPTIONAL, -- Need S
...,
[[
aperiodicSRS-ResourceTriggerList SEQUENCE (SIZE(1..maxNrofSRS-TriggerStates-2))
OF INTEGER (1..maxNrofSRS-TriggerStates-1) OPTIONAL -- Need M
]]
},
semi-persistent SEQUENCE {
associatedCSI-RS NZP-CSI-RS-ResourceId OPTIONAL, -- Cond NonCodebook
...
},
periodic SEQUENCE {
associatedCSI-RS NZP-CSI-RS-ResourceId OPTIONAL, -- Cond NonCodebook
...
}
},
usage ENUMERATED {beamManagement, codebook, nonCodebook, antennaSwitching},
alpha Alpha OPTIONAL, -- Need S
p0 INTEGER (-202..24) OPTIONAL, -- Cond Setup
pathlossReferenceRS PathlossReferenceRS-Config OPTIONAL, -- Need M
srs-PowerControlAdjustmentStates ENUMERATED { sameAsFci2, separateClosedLoop} OPTIONAL, -- Need S
...,
[[
pathlossReferenceRSList-r16 SetupRelease { PathlossReferenceRSList-r16} OPTIONAL -- Need M
]],
[[
usagePDC-r17 ENUMERATED {true} OPTIONAL, -- Need R
availableSlotOffsetList-r17 SEQUENCE (SIZE(1..4)) OF AvailableSlotOffset-r17 OPTIONAL, -- Need R
followUnifiedTCI-StateSRS-r17 ENUMERATED {enabled} OPTIONAL -- Need R
]],
[[
applyIndicatedTCI-State-r18 ENUMERATED {first, second} OPTIONAL -- Cond FollowUTCI
]],
[[
symbolType-r19 ENUMERATED {sbfd, non-sbfd} OPTIONAL, -- Need R
associatedCSI-RS-Set-r19 NZP-CSI-RS-ResourceSetId OPTIONAL, -- Need R
srs-PortGrouping-r19 ENUMERATED {enabled} OPTIONAL, -- Need R
fourPortSRS-3Tx-r19 ENUMERATED {enabled} OPTIONAL -- Need R
]]
}
Following is based on
SRS-ResourceSetId ::= INTEGER (0..maxNrofSRS-ResourceSets-1)
Following is based on
SRS-Resource ::= SEQUENCE {
srs-ResourceId SRS-ResourceId,
nrofSRS-Ports ENUMERATED {port1, ports2, ports4},
ptrs-PortIndex ENUMERATED {n0, n1 } OPTIONAL, -- Need R
transmissionComb CHOICE {
n2 SEQUENCE {
combOffset-n2 INTEGER (0..1),
cyclicShift-n2 INTEGER (0..7)
},
n4 SEQUENCE {
combOffset-n4 INTEGER (0..3),
cyclicShift-n4 INTEGER (0..11)
}
},
resourceMapping SEQUENCE {
startPosition INTEGER (0..5),
nrofSymbols ENUMERATED {n1, n2, n4},
repetitionFactor ENUMERATED {n1, n2, n4}
},
freqDomainPosition INTEGER (0..67),
freqDomainShift INTEGER (0..268),
freqHopping SEQUENCE {
c-SRS INTEGER (0..63),
b-SRS INTEGER (0..3),
b-hop INTEGER (0..3)
},
groupOrSequenceHopping ENUMERATED { neither, groupHopping, sequenceHopping },
resourceType CHOICE {
aperiodic SEQUENCE {
...
},
semi-persistent SEQUENCE {
periodicityAndOffset-sp SRS-PeriodicityAndOffset,
...
},
periodic SEQUENCE {
periodicityAndOffset-p SRS-PeriodicityAndOffset,
...
}
},
sequenceId INTEGER (0..1023),
spatialRelationInfo SRS-SpatialRelationInfo OPTIONAL, -- Need R
...,
[[
resourceMapping-r16 SEQUENCE {
startPosition-r16 INTEGER (0..13),
nrofSymbols-r16 ENUMERATED {n1, n2, n4},
repetitionFactor-r16 ENUMERATED {n1, n2, n4}
} OPTIONAL -- Need R
]],
[[
-- Release 17 and later members are omitted here
...
]]
}
Following is based on
SRS-SpatialRelationInfo ::= SEQUENCE {
servingCellId ServCellIndex OPTIONAL, -- Need S
referenceSignal CHOICE {
ssb-Index SSB-Index,
csi-RS-Index NZP-CSI-RS-ResourceId,
srs SEQUENCE {
resourceId SRS-ResourceId,
uplinkBWP BWP-Id
}
}
}
Following is based on
SRS-ResourceId ::= INTEGER (0..maxNrofSRS-Resources-1)
Following is based on
SRS-PeriodicityAndOffset ::= CHOICE {
sl1 NULL,
sl2 INTEGER(0..1),
sl4 INTEGER(0..3),
sl5 INTEGER(0..4),
sl8 INTEGER(0..7),
sl10 INTEGER(0..9),
sl16 INTEGER(0..15),
sl20 INTEGER(0..19),
sl32 INTEGER(0..31),
sl40 INTEGER(0..39),
sl64 INTEGER(0..63),
sl80 INTEGER(0..79),
sl160 INTEGER(0..159),
sl320 INTEGER(0..319),
sl640 INTEGER(0..639),
sl1280 INTEGER(0..1279),
sl2560 INTEGER(0..2559)
}
Following is based on
ConfiguredGrantConfig ::= SEQUENCE {
frequencyHopping ENUMERATED {intraSlot, interSlot} OPTIONAL, -- Need S
cg-DMRS-Configuration DMRS-UplinkConfig,
mcs-Table ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
mcs-TableTransformPrecoder ENUMERATED {qam256, qam64LowSE} OPTIONAL, -- Need S
uci-OnPUSCH SetupRelease { CG-UCI-OnPUSCH } OPTIONAL, -- Need M
resourceAllocation ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch },
rbg-Size ENUMERATED {config2} OPTIONAL, -- Need S
powerControlLoopToUse ENUMERATED {n0, n1},
p0-PUSCH-Alpha P0-PUSCH-AlphaSetId,
transformPrecoder ENUMERATED {enabled, disabled} OPTIONAL, -- Need S
nrofHARQ-Processes INTEGER(1..16),
repK ENUMERATED {n1, n2, n4, n8},
repK-RV ENUMERATED {s1-0231, s2-0303, s3-0000} OPTIONAL, -- Need R
periodicity ENUMERATED { ... },
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) OPTIONAL, -- Need R
precodingAndNumberOfLayers INTEGER (0..63),
srs-ResourceIndicator INTEGER (0..15) OPTIONAL, -- Need R
mcsAndTBS INTEGER (0..31),
frequencyHoppingOffset INTEGER (1.. maxNrofPhysicalResourceBlocks-1) OPTIONAL, -- Need R
pathlossReferenceIndex INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1),
...
} OPTIONAL, -- Need R
... -- the release extension groups are omitted here
}
Following is based on
DMRS-UplinkConfig ::= SEQUENCE { dmrs-Type ENUMERATED {type2} OPTIONAL, -- Need S dmrs-AdditionalPosition ENUMERATED {pos0, pos1, pos3} OPTIONAL, -- Need S phaseTrackingRS SetupRelease { PTRS-UplinkConfig } OPTIONAL, -- Need M maxLength ENUMERATED {len2} OPTIONAL, -- Need S transformPrecodingDisabled SEQUENCE { scramblingID0 INTEGER (0..65535) OPTIONAL, -- Need S scramblingID1 INTEGER (0..65535) OPTIONAL, -- Need S ..., [[ dmrs-Uplink-r16 ENUMERATED {enabled} OPTIONAL -- Need R ]] } OPTIONAL, -- Need R transformPrecodingEnabled SEQUENCE { nPUSCH-Identity INTEGER(0..1007) OPTIONAL, -- Need S sequenceGroupHopping ENUMERATED {disabled} OPTIONAL, -- Need S sequenceHopping ENUMERATED {enabled} OPTIONAL, -- Need S ..., [[ dmrs-UplinkTransformPrecoding-r16 SetupRelease {DMRS-UplinkTransformPrecoding-r16} OPTIONAL -- Need M ]] } OPTIONAL, -- Need R ..., [[ dmrs-TypeEnh-r18 ENUMERATED {enabled} OPTIONAL -- Need R ]] }
Following is based on
DMRS-UplinkTransformPrecoding-r16 ::= SEQUENCE { pi2BPSK-ScramblingID0 INTEGER(0..65535) OPTIONAL, -- Need S pi2BPSK-ScramblingID1 INTEGER(0..65535) OPTIONAL -- Need S }
Following is based on
PTRS-UplinkConfig ::= SEQUENCE { transformPrecoderDisabled SEQUENCE { frequencyDensity SEQUENCE (SIZE (2)) OF INTEGER (1..276) OPTIONAL, -- Need S timeDensity SEQUENCE (SIZE (3)) OF INTEGER (0..29) OPTIONAL, -- Need S maxNrofPorts ENUMERATED {n1, n2}, resourceElementOffset ENUMERATED {offset01, offset10, offset11 } OPTIONAL, -- Need S ptrs-Power ENUMERATED {p00, p01, p10, p11} } OPTIONAL, -- Need R transformPrecoderEnabled SEQUENCE { sampleDensity SEQUENCE (SIZE (5)) OF INTEGER (1..276), timeDensityTransformPrecoding ENUMERATED {d2} OPTIONAL -- Need S } OPTIONAL, -- Need R ..., [[ maxNrofPorts-SDM-r18 ENUMERATED {n1, n2} OPTIONAL -- Need R ]] }
Tables
These seven tables are the codebook itself. Every entry is one W, and the TPMI carried in DCI is simply the index into the row. Reading them once in order shows the pattern. The entry count falls as the layer count rises, because a matrix that fills more layers has fewer useful shapes to take.
< 38.211 v15.5 - Table 6.3.1.5-1: Precoding matrix W for single-layer transmission using two antenna ports. >

< 38.211 v15.5 - Table 6.3.1.5-2: Precoding matrix W for single-layer transmission using four antenna ports with transform precoding enabled. >

< 38.211 v15.5 - Table 6.3.1.5-3: Precoding matrix W for single-layer transmission using four antenna ports with transform precoding disabled. >

< 38.211 v15.5 - Table 6.3.1.5-4: Precoding matrix W for two-layer transmission using two antenna ports with transform precoding disabled. >

< 38.211 v15.5 - Table 6.3.1.5-5: Precoding matrix W for two-layer transmission using four antenna ports with transform precoding disabled. >

< 38.211 v15.5 - Table 6.3.1.5-6: Precoding matrix W for three-layer transmission using four antenna ports with transform precoding disabled. >

< 38.211 v15.5 - Table 6.3.1.5-7: Precoding matrix W for four-layer transmission using four antenna ports with transform precoding disabled. >

The entry count falls as the layer count rises : on four ports it runs 28 for one layer, 22 for two, 7 for three and 5 for four. A matrix that fills more layers has fewer useful shapes to take.Transform precoding gets its own single-layer table : Tables 6.3.1.5-2 and 6.3.1.5-3 cover the same four ports and the same 28 TPMI values, and they are separate because the entries differ.Two ports have only two tables : six matrices for one layer and three for two, which is the whole codebook a two port UE ever sees.The v15.5 label is not a staleness warning : the seven table titles are word for word the same in 38.211 v19.4.0, so these screenshots still match the current release.
What Release 18 and Release 19 added
The seven tables above are the whole codebook as Release 15 defined it, and they were enough while the uplink stayed at four ports and four layers. Release 18 moved both ceilings. Clause 6.3.1.5 of 38.211 now runs to fifty tables rather than seven, and the RRC that chooses between them is new as well.
The rank ceiling moved in a way worth noticing. PUSCH-Config still carries
Eight antenna ports need more than one codebook, and Release 18 defined four of them. The choice is carried by codebookTypeUL-r18, and its four alternatives line up one for one with blocks of tables in 38.211.
codebookTypeUL-r18 |
Value |
38.211 tables |
|---|---|---|
codebook1-r18 |
ng1n4n1 |
6.3.1.5-9 to 6.3.1.5-16 |
codebook1-r18 |
ng1n2n2 |
6.3.1.5-17 to 6.3.1.5-24 |
codebook2-r18 |
ng2 |
6.3.1.5-29 to 6.3.1.5-36, with submatrices in 6.3.1.5-25 to 6.3.1.5-28 |
codebook3-r18 |
ng4 |
6.3.1.5-39 to 6.3.1.5-46, with submatrices in 6.3.1.5-37 and 6.3.1.5-38 |
codebook4-r18 |
ng8 |
6.3.1.5-47 |
Each of the first three blocks holds eight tables, one per layer count from one to eight. Table 6.3.1.5-47 is the exception, because codebook4 fits in a single table. 38.211 describes it as supporting
Release 19 then added a case that is about fewer chains rather than more ports. Tables 6.3.1.5-48 to 6.3.1.5-50 give W for one, two and three layers on
Two other fields belong in the same picture. The first is ul-FullPowerTransmission-r16, which takes fullpower, fullpowerMode1 or fullpowerMode2. It decides whether the UE may reach its full power budget when the chosen precoder does not drive every port. The second is sTx-2Panel-r18, which extends the scheme to a UE transmitting from two panels at once, and it works with multipanelSchemeSDM-r18 and multipanelSchemeSFN-r18.
The uplink rank ceiling is now eight : maxRank still stops at 4, and maxRank-v1810 carries 5 to 8 in a later extension group.Four uplink codebooks, not one : codebookTypeUL-r18 is a CHOICE between codebook1, codebook2, codebook3 and codebook4, and each owns its own block of tables.Clause 6.3.1.5 grew from seven tables to fifty : the seven on this page are the two and four port cases, and everything from 6.3.1.5-8 onward is eight port or three port.codebook4 is the compact one : one table covers up to eight layers with transform precoding disabled, and one layer with it enabled.Release 19 handles three transmit chains : fourPortSRS-3Tx-r19 selects Tables 6.3.1.5-48 to 6.3.1.5-50.The path described above is unchanged : a UE with two or four ports still uses Tables 6.3.1.5-1 to 6.3.1.5-7, and none of this replaces that.
Reference
[1] 5G NR Physical Layer | Chapter 12| Uplink Transmission Schemes | Codebook & Non-Codebook Based
[2] Ericsson 5G New Radio (NR) MIMO Key Features
[3] 38.211 v19.4.0 : NR - Physical channels and modulation. Clause 6.3.1.5 holds every precoding matrix quoted on this page, and it now runs to fifty tables.
[4] 38.331 v19.3.0 : NR - Radio Resource Control (RRC) protocol specification. Every listing in the RRC Parameters section is quoted from it.