PUSCH DMRS is a special type of physical layer signal which functions as a reference signal for decoding PUSCH. Most of the fundamental paramters of PUSCH DMRS are same as in PDSCH DMRS. I would not explain much of those parameters on this note and strongly suggest you to go through PDSCH DMRS first if you are new to PDSCH/PUSCH DMRS. If frequency hoping is disabled and transform precoding is not enabled, PUSCH DMRS and PDSCH DMRS is almost same. The difference arises when frequency hoping is enabled or transform precoding is enabled.
Another important difference between PDSCH DMRS and PUSCH DMRS arises from the precoding. In PDSCH, there is no Precoding step in channel processing, but there is Precoding stage in PUSCH channel coding process. PUSCH DMRS undergoes this procoding procedure like PUSCH user data.
In this note, I am just trying to collect all the informations about PUSCH DMRS without much of the descriptions assuming that you are familiar to PDSCH DMRS and know how to interprete those parameters and tables in this note by yourselves.
- Basic Questions
- Parameters
- Sequence Generation
- Resource Element Mapping
- Tables
- Table 6.4.1.1.3-1: Parameters for PUSCH DM-RS configuration type 1
- Table 6.4.1.1.3-2: Parameters for PUSCH DM-RS configuration type 2
- Table 6.4.1.1.3-3: PUSCH DM-RS positions l bar within a slot for single-symbol DM-RS and intra-slot frequency hopping disabled.
- Table 6.4.1.1.3-4: PUSCH DM-RS positions l bar within a slot for double-symbol DM-RS and intra-slot frequency hopping disabled.
- Table 6.4.1.1.3-5: PUSCH DM-RS time index l'
- 38.211 - Table 6.4.1.1.3-6: PUSCH DM-RS positions l bar within a slot for single-symbol DM-RS and intra-slot frequency hopping enabled.
- Reference
Basic questions.
DMRS configuration sometimes is pretty confusing unless you have some type of big picture. If you frequently refresh yourself with the following questions, it will be helpful when you read further details in this page.
What is the difference between Mapping Type A and B in terms of resource allocation ?
Type A can start only at symbol 2 or 3 within a slot, meaning that SLIV that start from symbol 4 or higher cannot use this type of DMRS.
Type B starts always at the first symbols of scheduled SLIV.
What is the difference between configuration type 1 and 2 in terms of resource allocation ?
In Configuration type 1, the minimum resource element group in frequency domain is one RE. In Configuration type 2, the minimum resource element group in frequency domain is two consecutive REs. See the pictures in Resource Element Mapping.
What is the effect of port number on DMRS resource element position ?
The port index is not only a label. It picks a row in Tables 6.4.1.1.3-1 and 6.4.1.1.3-2, and that row fixes three things at once: the CDM group, the frequency offset Δ, and the pair of cover codes. Two ports in the same CDM group therefore sit on the same resource elements, and only the cover codes keep them apart.
As antenna port number changes, the location of DMRS position in frequency domain changes. Check out this note for the details.
How many DMRS symbol can be put into a slot ?
Minimum number is 1, but it can be more than 1 depending on dmrs-AdditionalPosition in RRC. Max number is 4. See 38.211 - Table 6.4.1.1.3-3 and 38.211 - Table 6.4.1.1.3-4 for the details.
Reading the single symbol table gives that answer its shape. Take mapping type A with a 14 symbol allocation. The pos0 setting gives one DMRS symbol, at l0, and pos1 gives two, at l0 and 11. The pos2 setting gives three, at l0, 7 and 11, and pos3 gives four, at l0, 5, 8 and 11. A short allocation cannot reach four. At ld = 4 every one of the four columns collapses to l0 on its own, so the setting stops making any difference.
Parameters
The table below pairs the symbols used in 38.211 with the RRC fields that carry them. The left column is the notation from the specification, and the middle column is the name to search for in a configuration dump. Several rows list two names, because the parameter was called something else before 38.331 settled on its current field names. Searching current 38.331 for UL-DMRS-config-type or UL-DMRS-max-len returns nothing.
|
38.211-7.4.1.1 |
Higher Layer Parameter |
Value |
Comment |
|
|
UL-DMRS-Scrambling-ID |
{0,1} |
Sequence Generation |
|
|
DMRS-Scrambling-ID |
{0,1,..,65535} |
Sequence Generation |
|
Configuration Type |
UL-DMRS-config-type dmrs-Type |
type1, type2 |
RE Mapping |
|
|
UL-DMRS-typeA-pos dmrs-TypeA-Position |
pos2, pos3 |
RE Mapping |
|
|
UL-DMRS-add-pos dmrs-AdditionalPosition |
pos0, pos1, pos2, pos3 |
RE Mapping |
|
|
UL-DMRS-max-len |
|
RE Mapping |
|
single or double symbol |
|
|
RE Mapping |
Following is based on
MIB ::= SEQUENCE {
...
dmrs-TypeA-Position ENUMERATED {pos2, pos3},
...
}
Following is based on
PUSCH-TimeDomainResourceAllocation ::= SEQUENCE { k2 INTEGER(0..32) OPTIONAL, -- Need S mappingType ENUMERATED {typeA, typeB}, startSymbolAndLength INTEGER (0..127) }
Following is based on
PUSCH-TimeDomainResourceAllocation-r16 ::= SEQUENCE { k2-r16 INTEGER(0..32) OPTIONAL, -- Need S puschAllocationList-r16 SEQUENCE (SIZE(1..maxNrofMultiplePUSCHs-r16)) OF PUSCH-Allocation-r16, ... }
Following is based on
PUSCH-Allocation-r16 ::= SEQUENCE { mappingType-r16 ENUMERATED {typeA, typeB} OPTIONAL, -- Cond NotFormat01-02-Or-TypeA startSymbolAndLength-r16 INTEGER (0..127) OPTIONAL, -- Cond NotFormat01-02-Or-TypeA startSymbol-r16 INTEGER (0..13) OPTIONAL, -- Cond RepTypeB length-r16 INTEGER (1..14) OPTIONAL, -- Cond RepTypeB numberOfRepetitions-r16 ENUMERATED {n1, n2, n3, n4, n7, n8, n12, n16} OPTIONAL, -- Cond Format01-02 ..., [[ numberOfRepetitionsExt-r17 ENUMERATED {n1, n2, n3, n4, n7, n8, n12, n16, n20, n24, n28, n32, spare4, spare3, spare2, spare1} OPTIONAL, -- Cond Format01-02-For-TypeA numberOfSlotsTBoMS-r17 ENUMERATED {n1, n2, n4, n8, spare4, spare3, spare2, spare1} OPTIONAL, -- Need R extendedK2-r17 INTEGER (0..128) OPTIONAL -- Cond MultiPUSCH ]], [[ ul-MutingIndicator-r19 ENUMERATED {enabled} OPTIONAL, -- Need S occ-Length-r19 ENUMERATED {n2, n4} OPTIONAL -- Need R ]] }
Following is based on
PUSCH-Config ::= SEQUENCE {
...
dmrs-UplinkForPUSCH-MappingTypeA SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
dmrs-UplinkForPUSCH-MappingTypeB SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
...,
[[
-- Start of the parameters for DCI format 0_2 introduced in V16.1.0
...
dmrs-UplinkForPUSCH-MappingTypeA-DCI-0-2-r16 SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
dmrs-UplinkForPUSCH-MappingTypeB-DCI-0-2-r16 SetupRelease { DMRS-UplinkConfig } OPTIONAL, -- Need M
...
]]
}
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 ]] }
It would be almost impossible for you to get the practical meaning of these parameters just by looking into the specification unless you are the person who designed this algorithm or create your own program to implement this specification and plot it in graphics. I am not the person who desgined the algorithm and I don't have my own program to implement it. So it was so difficult for me to get any intuitive understandings on these parameters and algorithm. Fortunately, I got a chance to try with Matlab 5G library. Followings are the examples in graphics that I created using Matlab 5G library. I posted Matlab code and more examples here. The subcarrier spacing used in this example is 30 Khz and for the simplicity I assigned only one RB for the PUSCH.
Sequence Generation
PUSCH DMRS has two sequence generators rather than one, and transform precoding decides which of them runs. With transform precoding disabled the sequence is the pseudo-random sequence that PDSCH also uses. With it enabled the sequence is a low-PAPR sequence instead, because keeping the peak to average power ratio down is the whole reason transform precoding is there.
Transform Precoding Not Enabled
This is the branch that matches PDSCH. The generator is the length 31 Gold sequence, initialised once per OFDM symbol from cinit. The figure traces that initialisation from the scrambling identity at the top down to the symbol that is finally mapped. Start at the top left, because the three cases there decide which identity feeds everything below them.

The identity has three sources : scramblingID0 and scramblingID1 in DMRS-UplinkConfig, the msgA-ScramblingID0 and msgA-ScramblingID1 pair in msgA-DMRS-Configuration for a msgA PUSCH, and the physical cell identity when none of them is configured.The second identity needs a Release 16 field : the figure takesn barSCID as nSCID for CDM group 0 or 2 and as 1 − nSCID for group 1, but only when dmrs-Uplink is provided. That field is dmrs-Uplink-r16 in the listing above. Without it the figure uses its last line, in which the CDM group index does not appear.cinit is rebuilt every symbol : the slot number and the symbol index l both enter it, so no two OFDM symbols in a slot carry the same sequence.The last line is where the tables enter : wf(k’) and wt(l’) are read from Tables 6.4.1.1.3-1 and 6.4.1.1.3-2, and that is what ties one sequence to one antenna port.
Transform Precoding Enabled
No figure covers this branch, and the reason is that it does not reduce to a single chain of equations. 38.211 sends it to clause 6.4.1.1.1.2, which builds the DMRS from a low-PAPR sequence of clause 5.2.2 rather than from the Gold sequence above. A low-PAPR sequence is a base sequence with a cyclic shift applied to it, so the reference signal is a rotation of a known waveform instead of a random looking one.
Two hopping mechanisms sit on top of that base sequence, and the RRC fields for both are already in the DMRS-UplinkConfig listing above. Group hopping changes which sequence group is drawn from as the slot advances. Sequence hopping changes which sequence inside the group is used. 38.211 rules out running them together, and states it directly:
Which mechanism applies depends on how the grant arrived. For a PUSCH scheduled by a RAR uplink grant, or by DCI format 0_0 with the CRC scrambled by TC-RNTI, 38.211 fixes sequence hopping to disabled and lets groupHoppingEnabledTransformPrecoding decide group hopping. For all other transmissions the two are set by sequenceHopping and sequenceGroupHopping, and when neither parameter is provided the UE uses the same hopping mode as for Msg3.
The third field in that branch of DMRS-UplinkConfig is nPUSCH-Identity, an INTEGER (0..1007). It gives the sequence a root that is configured rather than derived from the physical cell identity, which is the equivalent of what scramblingID0 does on the disabled branch.
Transform precoding switches the generator : the Gold sequence is replaced by a low-PAPR sequence from 38.211 clause 5.2.2, which is a base sequence with a cyclic shift.Only one hopping mode runs at a time : the specification says the UE is not expected to handle group hopping and sequence hopping in combination.The grant decides the rule : a RAR grant, or DCI format 0_0 with TC-RNTI, disables sequence hopping and leaves group hopping to groupHoppingEnabledTransformPrecoding.Msg3 is the fallback : when neither sequenceHopping nor sequenceGroupHopping is provided, the UE uses the hopping mode it used for Msg3.nPUSCH-Identity replaces the cell identity : the sequence root becomes a configured value between 0 and 1007.
Resource Element Mapping
Resource Mapping of PUSCH DMRS is done as following equation. For simplicity, let's think of the location of resource element only (i.e, let's think only of k and l). k represents frequency domain location and l represents time domain location.
With this in mind, the first thing you can notice would be
- Configuration type changes the location pattern in frequency domain
- Configurataion Type 1 : 3 pairs(6 Resource Elements:RE) of DMRS are dispersed in one OFDM symbol/one RB at the interval of 4 REs (4n). The two RE in each pare are apart at the interval of 2 RE(2k'). In short, 6 REs of DMRS symbols are dispersed at every other REs in frequency domain. This supports 8 DMRS ports in case of double-symbol DMRS(port 0~7) and 4 DMRS ports in case of single symbol DMRS(port 0~3). See Table 6.4.1.1.3-1 and Table 6.4.1.1.3-2 for further details.
- Configuration Type 2 : 2 pairs(4 Resource Elements:RE) of DMRS are dispersed in one OFDM symbol/one RB at the interval of 6 REs (6n). The two RE in each pare are apart at the interval of 1 RE(k'), meaning that the two REs in each pair are contiguous. This supports 12 DMRS ports in case of double-symbol DMRS(port 0~11) and 6 DMRS ports in case of single symbol DMRS(port 0~5). See Table 6.4.1.1.3-1 and Table 6.4.1.1.3-2 for further details for further details.
- PUSCH mapping type changes the location pattern in time domain
- PUSCH Mapping Type A : In this type, the DMRS symbol can start only at symbol 2 or 3 regardless of PUSCH start and length. It implies this cannot be used when PUSCH start symbol is greater than 3. This is related to the row 'Type A' in PUSCH SLIV table. This type is used for slot based scheduling.
- PUSCH Mapping Type B : In this type, the DMRS symbol can start at the first PUSCH symbol regardless of PUSCH start. This is related to the row 'Type B' in PUSCH SLIV table. This type is used for mini-slot based scheduling
Another points you would notice would be
- frequency domain location(k) is determined by equation(formula) as shown below
- time domain location(l) is determined by a predefined table and predefined value.
When Transform Preconding is not enabled
The equation below is the general case, with both configuration types and more than one layer. Two details are worth holding on to before reading the enabled case. The port index p~j runs from 0 to υ−1, and k has two lines, one for each configuration type.

When Transform Preconding is enabled
Compare this equation against the one above rather than reading it fresh. Two things have gone from it. Only one port is left, p~0, and only one line for k is left, the configuration type 1 line. Transform precoding therefore fixes the transmission to a single layer and to configuration type 1.

Resource Element Mapping after Precoding
Regardless of whether Transformed Precoding is enabled or not, the DMRS goes through scaling and Precoding procedure as below. W is precoding matrix which is same matrix for PUSCH data. This Procoding step itself is a pretty complicated process and explained in a separate note here.

Tables
Six tables carry most of the detail on this page, and they divide into three jobs. Two of them map an antenna port onto a CDM group, a frequency offset and a pair of orthogonal cover codes. Three of them give the symbol positions, for the single symbol case, the double symbol case and the frequency hopping case. The last one is a two row summary that is easier to remember than any of the others.
Followings are various tables that are used in Sequence Generation and Resource Element Mappaing shown above.
< 38.211 - Table 6.4.1.1.3-1: Parameters for PUSCH DM-RS configuration type 1.>

< 38.211 - Table 6.4.1.1.3-2: Parameters for PUSCH DM-RS configuration type 2. >

< 38.211 - Table 6.4.1.1.3-3: PUSCH DM-RS positions
within a slot for single-symbol DM-RS and intra-slot frequency hopping disabled.>

< 38.211 - Table 6.4.1.1.3-4: PUSCH DM-RS positions
within a slot for double-symbol DM-RS and intra-slot frequency hopping disabled. >

< 38.211 - Table 6.4.1.1.3-5: PUSCH DM-RS time index l' >

< 38.211 - Table 6.4.1.1.3-6: PUSCH DM-RS positions
within a slot for single-symbol DM-RS and intra-slot frequency hopping enabled. >

Tables -1 and -2 answer where in frequency : they give the CDM group, the offset Δ and the two cover codes for each port, and Δ is what separates one CDM group from the next.Tables -3, -4 and -6 answer where in time : single symbol with hopping disabled, double symbol with hopping disabled, and single symbol with hopping enabled.Table -5 is the one to remember : single-symbol DMRS supports ports 0 to 3 on configuration type 1 and 0 to 5 on type 2. Double-symbol DMRS doubles both, to 0 to 7 and to 0 to 11.Frequency hopping has no double symbol table : Table 6.4.1.1.3-6 covers the single symbol case only, and its rows stop at ld = 7 because each hop is half a slot.A short allocation rules out mapping type A : the first row of Tables 6.4.1.1.3-3 and 6.4.1.1.3-4 is a dash under mapping type A, so fewer than four symbols cannot carry type A DMRS.
Reference
[1] Wireless Technology Evolution - Transition from 4G to 5G : 5G Americas
[2] 38.211 v19.4.0 : NR - Physical channels and modulation. Clause 6.4.1.1 defines PUSCH DMRS, and clause 5.2.2 defines the low-PAPR sequence used when transform precoding is enabled.
[3] 38.331 v19.3.0 : NR - Radio Resource Control (RRC) protocol specification. Every ASN.1 listing on this page is quoted from it.