Main Content

nrPUSCHConfig

PUSCH configuration parameters

Since R2020a

Description

The nrPUSCHConfig object sets physical uplink shared channel (PUSCH) configuration parameters, as defined in TS 38.211 Sections 6.3.1, 6.4.1.1, and 6.4.1.2 [1].This object bundles all the properties involved in the PUSCH processing chain, including scrambling, symbol modulation, layer mapping, transform precoding, MIMO precoding, and resource element mapping. The object also contains properties to determine the number of resources for the uplink control information (UCI) multiplexing and associated physical reference signals, such as demodulation reference signal (DM-RS) and phase tracking reference signal (PT-RS).

The default nrPUSCHConfig object configures a single-layer PUSCH with cyclic-prefix orthogonal frequency division multiplexing (CP-OFDM), mapping type A, QPSK modulation, a resource allocation of 52 resource blocks and 14 OFDM symbols in a slot, and single-symbol DM-RS type 1. This configuration corresponds to a full resource allocation with respect to the default nrCarrierConfig object.

For operation with shared spectrum channel access for frequency range 1 (FR1), set the Interlacing property to true, then use the RBSetIndex and InterlaceIndex object properties to specify the allocated frequency resources. (since R2023b)

Creation

Description

pusch = nrPUSCHConfig creates a PUSCH configuration object with default properties.

example

pusch = nrPUSCHConfig(Name,Value) specifies properties using one or more name-value pair arguments. Enclose each property in quotes. For example, 'NSizeBWP',200,'NumLayers',4 specifies 200 physical resource blocks (PRB) in the bandwidth part (BWP) and 4 transmission layers. Unspecified properties take their default values.

Properties

expand all

Channel Configuration

Number of PRBs in bandwidth part (BWP), specified as an integer from 1 to 275. Use [] to set this property to the NSizeGrid property of the nrCarrierConfig object.

Data Types: double

Starting PRB index of BWP relative to common resource block 0 (CRB 0), specified as an integer from 0 to 2473. Use [] to set this property to the NStartGrid property of the nrCarrierConfig object.

Data Types: double

Modulation scheme, specified as 'QPSK', 'pi/2-BPSK', '16QAM', '64QAM', or '256QAM', a string scalar, a string array, or a cell array of character vectors. This modulation scheme specifies the modulation type of the codewords and the number of bits used per modulation symbol. For one codeword, specify the modulation scheme as a character vector or string scalar. If two codewords are present (NumLayers > 4), the same modulation scheme applies to both codewords or you can specify different modulation schemes for each codeword by using a string array or a cell array of character vectors.

Modulation SchemeNumber of Bits Per Symbol
'pi/2-BPSK'1
'QPSK'2
'16QAM'4
'64QAM'6
'256QAM'8

Example: {'QPSK','16QAM'} or ["QPSK","16QAM"] specifies different modulation schemes for two codewords.

Data Types: char | string | cell

Number of transmission layers, specified as an integer from 1 to 8.

  • For one codeword, specify an integer from 1 to 4.

  • For two codewords, specify an integer from 5 to 8. (since R2024a)

Data Types: double

Mapping type of the physical shared channel, specified as 'A' or 'B'.

Data Types: char | string

OFDM symbol allocation of the physical shared channel, specified as a two-element vector of nonnegative integers. The first element of this property represents the start of symbol allocation (0-based). The second element represents the number of allocated OFDM symbols.

When you set this property to [] or the second element of the vector to 0, no symbol is allocated for the channel.

Data Types: double

Physical resource block (PRB) allocation of the PUSCH within the BWP, specified as a vector of integers from 0 to 274.

Dependencies

To enable this property, set the Interlacing property to 0 (false).

Data Types: double

Transform precoding, specified as one of these values.

  • 0 (false) — Disable transform precoding. The waveform type is cyclic-prefix orthogonal frequency division multiplexing (CP-OFDM).

  • 1 (true) — Enable transform precoding. The waveform type is discrete Fourier transform spread orthogonal frequency division multiplexing (DFT-s-OFDM).

Data Types: double | logical

PUSCH transmission scheme, specified as 'nonCodebook' or 'codebook'.

Data Types: char | string

Number of antenna ports, specified as 1, 2, 4, or 8. This value must be greater than or equal to the NumLayers property.

Dependencies

To enable this property, set TransmissionScheme to 'codebook'.

Data Types: double

Transmitted precoding matrix indicator, specified as an integer from 0 to 304 (since R2024a). Set this property based on the NumLayers, NumAntennaPorts, and CodebookType property values, as defined in TS 38.211 Tables 6.3.1.5-1 to 6.3.1.5-47.

Dependencies

To enable this property, set the TransmissionScheme property to 'codebook'.

Data Types: double

Since R2024a

Codebook type, specified as 'codebook1_ng1n4n1', 'codebook1_ng1n2n2', 'codebook2', 'codebook3', or 'codebook4'. This property together with the NumLayers and TPMI object properties specify the precoding matrix W from TS 38.211 Tables 6.3.1.5-9 to 6.3.1.5-47 for codebook transmissions with 8 antenna ports.

Use this table to identify which codebook type to use for a specific number of antenna groups (Ng) and a specific table from TS 38.211. For a single antenna group (Ng=1), the table also shows the geometrical distribution of the antenna ports in each antenna group [N1 N2]. N1 is the number of antenna ports in the horizontal direction and N2 is the number of antenna ports in the vertical direction.

CodebookType Ng

[N1 N2]

Tables from TS 38.211
'codebook1_ng1n4n1'1

[4 1]

Tables 6.3.1.5-9 to 6.3.1.5-16
'codebook1_ng1n2n2'1

[2 2]

Tables 6.3.1.5-17 to 6.3.1.5-24
'codebook2'2N/ATables 6.3.1.5-25 to 6.3.1.5-36
'codebook3'4N/ATables 6.3.1.5-37 to 6.3.1.5-46
'codebook4'8N/ATable 6.3.1.5-47

Data Types: char | string

Frequency hopping for the physical uplink shared channel, specified as 'neither', 'intraSlot', or 'interSlot'.

Dependencies

To enable this property, set the Interlacing property to 0 (false).

Data Types: char | string

Starting PRB index of the second hop relative to the BWP, specified as an integer from 0 to 274.

Dependencies

To enable this property, set the FrequencyHopping property to 'intraSlot' or 'interSlot' and set the Interlacing property to 0 (false).

Data Types: double

Since R2023b

Interlaced resource allocation, specified as one of these values.

  • 0 (false) — Disable interlaced resource allocation.

  • 1 (true) — Enable interlaced resource allocation. Use the RBSetIndex and InterlaceIndex properties to configure the frequency resource allocation.

This property implements the useInterlacePUCCH-PUSCH higher-layer parameter.

Data Types: double | logical

Since R2023b

Indices of RB sets between intracell guard bands (0-based), specified as a vector of nonnegative integers. Use this property to specify the indices of the RB sets in an interlaced resource allocation.

Dependencies

To enable this property, set the Interlacing property to 1 (true).

Data Types: double

Since R2023b

Interlace indices in the interlaced resource allocation, specified as a vector of nonnegative integers with up to M elements. The vector element must be in the range [0, M – 1). M = 10 for 15 kHz subcarrier spacing and M = 5 for 30 kHz subcarrier spacing.

Dependencies

To enable this property, set the Interlacing property to 1 (true).

Data Types: double

PUSCH scrambling identity, specified as [] or an integer from 0 to 1023.

  • If the higher layer parameter dataScramblingIdentityPUSCH is configured, NID must be an integer from 0 to 1023.

  • If the higher layer parameter dataScramblingIdentityPUSCH is not configured, NID must be an integer from 0 to 1007.

When you specify this property as [], the object sets the PUSCH scrambling identity to the physical layer cell identity, specified by the NCellID property of the carrier.

Data Types: double

Radio network temporary identifier of the user equipment (UE), specified as an integer from 0 to 65,535.

Data Types: double

Random access preamble index, specified as one of these values.

  • [] — Use this value to specify that the scrambling initialization does not consider msgA on PUSCH.

  • Integer from 0 to 63 — Use this value to initialize the scrambling sequence for msgA on PUSCH, as defined in Release 16 of TS 38.211 Section 6.3.1.1.

Data Types: double

UCI on PUSCH Configuration

Beta offset factor of the HARQ-ACK, specified as a positive real-valued scalar. This property determines the number of resources for multiplexing HARQ-ACK. The nominal value is one of the entry from the Table 9.3-1 of TS 38.213.

Data Types: double

Beta offset factor of the channel state information (CSI) part 1, specified as a positive real-valued scalar. This property determines the number of resources for multiplexing CSI part 1. The nominal value is one of the entry from the Table 9.3-2 of TS 38.213.

Data Types: double

Beta offset factor of the CSI part 2, specified as a positive real-valued scalar. This property determines the number of resources for multiplexing CSI part 2. The nominal value is one of the entry from the Table 9.3-2 of TS 38.213.

Data Types: double

Scaling factor to limit the number of the resource elements allocated for the UCI on the PUSCH, specified as a scalar between 0 and 1. The nominal value is 0.5, 0.65, 0.8, or 1.

Data Types: double

Reference Signals Configuration

PUSCH DM-RS configuration parameters, specified as an nrPUSCHDMRSConfig configuration object.

Enable the PT-RS, specified as one of these values.

  • 0 (false) — Disable the PT-RS configuration.

  • 1 (true) — Enable the PT-RS configuration.

Data Types: double | logical

PUSCH phase tracking reference signal (PT-RS) configuration, specified as an nrPUSCHPTRSConfig configuration object.

Read-Only Properties

Since R2024a

This property is read-only.

Number of codewords, returned as one of these values:

  • 1 — If NumLayers is an integer from 1 to 4

  • 2 — If NumLayers is an integer from 5 to 8

Data Types: double

Examples

collapse all

Create a physical uplink shared channel configuration object with 'codebook' transmission scheme.

Specify the size of the bandwidth part as 52, scrambling identity as 750, frequency hopping as 'interslot', and number of antenna ports as 2. Enable transform precoding and PT-RS configuration.

pusch = nrPUSCHConfig;
pusch.NSizeBWP = 52;
pusch.NID = 750;
pusch.TransmissionScheme = 'codebook';
pusch.FrequencyHopping = 'interslot';
pusch.NumAntennaPorts = 2;
pusch.TransformPrecoding = 1;
pusch.EnablePTRS = 1;
disp(pusch)
  nrPUSCHConfig with properties:

              NSizeBWP: 52
             NStartBWP: []
            Modulation: 'QPSK'
             NumLayers: 1
           MappingType: 'A'
      SymbolAllocation: [0 14]
                PRBSet: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51]
    TransformPrecoding: 1
    TransmissionScheme: 'codebook'
       NumAntennaPorts: 2
                  TPMI: 0
          CodebookType: 'codebook1_ng1n4n1'
      FrequencyHopping: 'interSlot'
     SecondHopStartPRB: 1
           Interlacing: 0
         BetaOffsetACK: 20
        BetaOffsetCSI1: 6.2500
        BetaOffsetCSI2: 6.2500
            UCIScaling: 1
                   NID: 750
                  RNTI: 1
                NRAPID: []
                  DMRS: [1x1 nrPUSCHDMRSConfig]
            EnablePTRS: 1
                  PTRS: [1x1 nrPUSCHPTRSConfig]

   Read-only properties:
          NumCodewords: 1

Create a carrier configuration object with default properties. This object corresponds to a 10 MHz carrier with 15 kHz subcarrier spacing.

carrier = nrCarrierConfig;

Create a PUSCH configuration object with codebook-based transmission. Set the number of antenna ports to 4, modulation scheme to pi/2-BPSK, transmitted precoding matrix indicator to 10, and transform precoding to 0. When transform precoding is 0, the waveform type is cyclic-prefix orthogonal frequency division multiplexing (CP-OFDM). Enable phase tracking reference signal (PT-RS).

pusch = nrPUSCHConfig;
pusch.TransformPrecoding = 0;
pusch.Modulation = 'pi/2-BPSK';
pusch.TransmissionScheme = 'codebook';
pusch.NumAntennaPorts = 4;
pusch.TPMI = 10;
pusch.EnablePTRS = 1;

Generate PUSCH indices and PT-RS indices in subscript form.

[ind,info,ptrsInd] = nrPUSCHIndices(carrier,pusch,'IndexStyle','subscript')
ind = 31096x3 uint32 matrix

    1    1    1
    2    1    1
    3    1    1
    4    1    1
    5    1    1
    6    1    1
    7    1    1
    8    1    1
    9    1    1
   10    1    1
      ⋮

info = struct with fields:
                G: 7774
               Gd: 7774
        NREPerPRB: 156
    DMRSSymbolSet: 2
    PTRSSymbolSet: [0 1 3 4 5 6 7 8 9 10 11 12 13]
           PRBSet: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51]

ptrsInd = 1352x3 uint32 matrix

    13     1     1
    37     1     1
    61     1     1
    85     1     1
   109     1     1
   133     1     1
   157     1     1
   181     1     1
   205     1     1
   229     1     1
      ⋮

Create a carrier configuration object with default properties. This object corresponds to 30 kHz of subcarrier spacing and 20 MHz transmission bandwidth.

carrier = nrCarrierConfig;
carrier.SubcarrierSpacing = 30;
carrier.NSizeGrid = 51;

Create a PUSCH configuration object with specified properties. When transform precoding is 1, the waveform type is discrete fourier transform spread orthogonal frequency division multiplexing (DFT-s-OFDM).

pusch = nrPUSCHConfig;
pusch.NStartBWP = 10;
pusch.NSizeBWP = 41;
pusch.Modulation = '16QAM';
pusch.NID = []; % Set NID equal to the NCellID property of carrier.
pusch.PRBSet = 0:5;
pusch.TransformPrecoding = 1;
pusch.FrequencyHopping = 'intraSlot';
pusch.SecondHopStartPRB = 3;

Generate PUSCH indices, setting the index orientation with respect to the carrier grid.

[ind,info] = nrPUSCHIndices(carrier,pusch,'IndexOrientation','carrier')
ind = 864x1 uint32 column vector

   121
   122
   123
   124
   125
   126
   127
   128
   129
   130
      ⋮

info = struct with fields:
                G: 3456
               Gd: 864
        NREPerPRB: 144
    DMRSSymbolSet: [2 7]
    PTRSSymbolSet: [1x0 double]
           PRBSet: [0 1 2 3 4 5]

Generate PUSCH symbols of data type single.

numDataBits = info.G;
cws = randi([0 1],numDataBits,1);
sym = nrPUSCH(carrier,pusch,cws,'OutputDataType','single')
sym = 864x1 single column vector

  -0.7454 + 0.2981i
   0.3406 - 0.2312i
  -0.1153 + 0.2756i
   1.1921 - 0.3658i
  -0.3968 - 0.0277i
  -0.8788 - 0.6493i
  -0.8737 + 0.8318i
  -0.5764 + 0.0269i
  -1.6638 + 0.0482i
  -1.0270 - 0.1347i
      ⋮

Plot the generated symbols and indices on the carrier resource grid.

grid = complex(zeros([carrier.NSizeGrid*12 carrier.SymbolsPerSlot pusch.NumLayers]));
grid(ind) = sym;
imagesc(abs(grid(:,:,1)));
axis xy;
xlabel('OFDM Symbols');
ylabel('Subcarriers');
title('PUSCH Resource Elements in Carrier Resource Grid');

References

[1] 3GPP TS 38.211. “NR; Physical channels and modulation.” 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

[2] 3GPP TS 38.213. “NR; Physical layer procedures for control.” 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

Extended Capabilities

C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.

Version History

Introduced in R2020a

expand all