Main Content

nrPUSCHIndices

Generate PUSCH resource element indices

Since R2020a

Description

[ind,info,ptrsInd] = nrPUSCHIndices(carrier,pusch) returns ind in matrix form, which contains 1-based physical uplink shared channel (PUSCH) resource element (RE) indices, as defined in TS 38.211 Sections 6.3.1.6 and 6.3.1.7 [1]. The number of columns in ind is equal to the number of configured antenna ports. carrier specifies the carrier configuration parameters for a specific OFDM numerology and pusch specifies the PUSCH configuration. When you enable transform precoding, the output ind contains the combined locations of the data and the phase tracking reference signal (PT-RS). The function also returns the structural information, info, and PT-RS RE indices, ptrsInd. The output info contains information about the associated physical reference signals, bit capacity, and symbol capacity. ptrsInd is a matrix of PT-RS REs within the carrier resource grid. When you enable transform precoding, the output ptrsInd represents the projections of PT-RS locations prior to transform precoding onto the carrier resource grid.

example

[ind,info,ptrsInd] = nrPUSCHIndices(carrier,pusch,Name,Value) specifies output formatting options using one or more name-value pair arguments. Unspecified options take default values.

example

Examples

collapse all

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');

Figure contains an axes object. The axes object with title PUSCH Resource Elements in Carrier Resource Grid, xlabel OFDM Symbols, ylabel Subcarriers contains an object of type image.

Input Arguments

collapse all

Carrier configuration parameters for a specific OFDM numerology, specified as an nrCarrierConfig object. This function uses only these properties of the nrCarrierConfig object.

PUSCH configuration parameters for a specific OFDM numerology, specified as an nrPUSCHConfig object. This function uses only these properties of the nrPUSCHConfig 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)

Name-Value Arguments

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Before R2021a, use commas to separate each name and value, and enclose Name in quotes.

Example: 'IndexStyle','subscript','IndexBase','0based' specifies the RE indexing form and base, respectively, of the output.

RE indexing form, specified as one of these values:

  • 'index' — The indices are in linear index form.

  • 'subscript' — The indices are in [subcarrier, symbol, antenna] subscript row form.

Data Types: char | string

RE indexing base, specified as one of these values:

  • '1based' — The index counting starts from 1.

  • '0based' — The index counting starts from 0.

Data Types: char | string

Resource element indexing orientation, specified as the comma-separated pair consisting of 'IndexOrientation' and one of these values:

  • 'carrier' — Indices are referenced with respect to the carrier grid.

  • 'bwp' — Indices are referenced with respect to the BWP.

Dependencies

This property is applicable only when TransformPrecoding property of nrPUSCHConfig object is set to 0.

Data Types: char | string

Output Arguments

collapse all

PUSCH RE indices, returned as one of these values.

  • N-by-P matrix — The function returns this type of value when you set 'IndexStyle' to 'index'. The number of columns depends on the TransmissionScheme property of the nrPUSCHConfig object and is returned as one of these values.

    • Number of transmission layers — When the transmission scheme is noncodebook

    • Number of antenna ports configured — When the transmission scheme is codebook

  • M-by-3 matrix — The function returns this type of value when you set 'IndexStyle' to 'subscript'. The matrix rows correspond to the [subcarrier, symbol, antenna] subscripts based on the number of subcarriers, OFDM symbols, and number of antennas, respectively.

Depending on the value of 'IndexBase', the function returns either 1-based or 0-based indices. Depending on the value of 'IndexOrientation', the function returns either carrier-oriented indices or BWP-oriented indices.

Data Types: uint32

PUSCH resource information, returned as a structure containing these fields.

FieldDescription
G

Bit capacity of the PUSCH. This value must be equal to the length of the codeword from the uplink shared channel (UL-SCH) transport channel.

Gd

Number of REs per layer or port

DMRSSymbolSet

The OFDM symbol locations in a slot containing the demodulation reference signal (DM-RS). The symbols are 0-based.

NREPerPRB

Number of REs per PRB allocated to the PUSCH

PTRSSymbolSet

The OFDM symbol locations in a slot containing the phase tracking reference signal (PT-RS). The symbols are 0-based.

PRBSet (since R2023b)

The PRBs allocated for PUSCH within the BWP

PT-RS RE indices, returned as one of these values.

  • N-by-P matrix — The function returns this type of value when you set 'IndexStyle' to 'index'. The number of columns depends on the TransmissionScheme property of the nrPUSCHConfig object and is returned as one of these values.

    • Number of transmission layers — When the transmission scheme is noncodebook

    • Number of antenna ports configured — When the transmission scheme is codebook

  • M-by-3 matrix — The function returns this type of value when you set 'IndexStyle' to 'subscript'. The matrix rows correspond to the [subcarrier, symbol, antenna] subscripts based on the number of subcarriers, OFDM symbols, and number of antennas, respectively.

Depending on the value of 'IndexBase', the function returns either 1-based or 0-based indices. Depending on the value of 'IndexOrientation', the function returns either carrier-oriented indices or BWP-oriented indices.

Data Types: uint32

References

[1] 3GPP TS 38.211. “NR; Physical channels and modulation.” 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