nrPUSCH

Generate PUSCH modulation symbols

Description

example

[sym,ptrsSym] = nrPUSCH(cw,mod,nLayers,nid,rnti) returns physical uplink shared channel (PUSCH) modulation symbols, as defined in TS 38.211 Sections 6.3.1.1 to 6.3.1.5 [1]. The process consists of scrambling with scrambling identity nid, performing symbol modulation with modulation scheme mod, and layer mapping. cw specifies an uplink shared channel (UL-SCH) codeword, as described in TS 38.212 Section 6.2.7 [2]. nLayers specifies the number of transmission layers. rnti is the radio network temporary identifier (RNTI) of the user equipment (UE). When you use this syntax, the output ptrsSym is empty.

[sym,ptrsSym] = nrPUSCH(___,transformPrecode,mrb) specifies transform precoding as a logical value in addition to the input arguments in the first syntax. When transformPrecode is set to true, the function applies the transform precoding defined in TS 38.211 Section 6.3.1.4. mrb specifies the allocated number of PUSCH resource blocks. When you use this syntax, the output ptrsSym is empty.

example

[sym,ptrsSym] = nrPUSCH(___,txScheme,nPorts,tpmi) specifies the transmission scheme in addition to the input arguments in the second syntax. When txScheme is set to 'codebook', the function performs multi-input multi-output (MIMO) precoding based on the specified number of layers nLayers, number of antenna ports nPorts, and the transmitted precoding matrix indicator (TPMI) tpmi. When you use this syntax, the output ptrsSym is empty.

example

[sym,ptrsSym] = nrPUSCH(carrier,pusch,cw) returns PUSCH modulation symbols, sym, for the specified carrier configuration carrier and PUSCH configuration pusch. The input cw specifies the UL-SCH codeword. The function also returns the precoded phase tracking reference signals (PT-RS) symbols, ptrsSym, which are mapped to the resource grid. When you use this syntax with transform precoding, the function maps the data modulated symbols and PT-RS symbols at appropriate locations prior to starting the transform precoding process.

example

[sym,ptrsSym] = nrPUSCH(___,'OutputDataType',datatype) specifies the data type for the PUSCH symbols and PT-RS symbols in addition to specifying an input combination from any of the previous syntaxes.

Examples

collapse all

Specify a random sequence of binary values corresponding to a codeword of 8064 bits.

cw = randi([0 1],8064,1);

Using 16-QAM modulation, generate PUSCH modulation symbols for the specified physical layer cell identity number, RNTI, and two transmission layers. By default, the function disables transform precoding and noncodebook-based transmission.

modulation = '16QAM';
nlayers = 2;
ncellid = 17;
rnti = 111;
sym = nrPUSCH(cw,modulation,nlayers,ncellid,rnti)
sym = 1008×2 complex

  -0.9487 - 0.9487i  -0.3162 + 0.3162i
   0.3162 + 0.3162i  -0.9487 - 0.3162i
   0.3162 + 0.3162i   0.3162 - 0.3162i
   0.9487 - 0.3162i  -0.3162 + 0.9487i
  -0.3162 - 0.9487i   0.3162 - 0.9487i
  -0.3162 + 0.9487i   0.3162 - 0.3162i
   0.3162 + 0.3162i   0.9487 - 0.9487i
  -0.9487 + 0.9487i  -0.3162 + 0.3162i
   0.9487 - 0.9487i  -0.9487 - 0.3162i
  -0.9487 - 0.9487i   0.3162 + 0.9487i
      ⋮

Specify a random sequence of binary values corresponding to a codeword of 8064 bits.

cw = randi([0 1],8064,1);

Using 256-QAM modulation, generate PUSCH modulation symbols for the specified physical layer cell identity number, RNTI, bandwidth, and one transmission layer. Enable transform precoding and codebook-based transmission based on the specified TPMI and four antennas.

modulation = '256QAM';
ncellid = 17;
rnti = 111;
mrb = 6;
nlayers = 1;
transformPrecode = true;
txScheme = 'codebook';
tpmi = 1;
nports = 4;
sym = nrPUSCH(cw,modulation,nlayers,ncellid,rnti,transformPrecode,mrb,txScheme,nports,tpmi)
sym = 1008×4 complex

   0.0000 + 0.0000i   0.2169 + 0.2350i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.2296 + 0.3713i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.0797 - 0.9008i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.4767 - 0.0143i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.4124 + 0.2638i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.1433 - 0.2366i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.0885 - 0.1080i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.5507 - 0.1894i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.3039 - 0.9165i   0.0000 + 0.0000i   0.0000 + 0.0000i
   0.0000 + 0.0000i  -0.1498 + 0.3356i   0.0000 + 0.0000i   0.0000 + 0.0000i
      ⋮

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]

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. The axes with title PUSCH Resource Elements in Carrier Resource Grid contains an object of type image.

Specify a random sequence of binary values corresponding to a codeword of 4032 bits.

cw = randi([0 1],4032,1);

Create a carrier configuration object with 30 kHz subcarrier spacing and 20 MHz transmission bandwidth.

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

Create a PUSCH configuration object with these specified properties.

pusch = nrPUSCHConfig;
pusch.NStartBWP = 10;
pusch.NSizeBWP = 41;
pusch.Modulation = '64QAM';
pusch.PRBSet = 0:5;
pusch.TransformPrecoding = 1;
pusch.FrequencyHopping = 'intraSlot';
pusch.EnablePTRS = 1;

Create a PUSCH phase tracking reference signal (PT-RS) configuration object with these specified properties.

ptrs = nrPUSCHPTRSConfig;
ptrs.TimeDensity = 2;
ptrs.NumPTRSSamples = 4;
ptrs.NumPTRSGroups = 8;
ptrs.NID = 750;

Assign the PUSCH PT-RS configuration object to the PTRS property of the PUSCH configuration object.

pusch.PTRS = ptrs;

Generate PUSCH PT-RS symbols.

[sym,ptrsSym] = nrPUSCH(carrier,pusch,cw)
sym = 864×1 complex

   0.0000 - 0.3273i
  -0.0879 - 0.3552i
   0.4931 + 0.1194i
  -1.4765 - 0.6074i
  -0.1208 + 0.1961i
   0.8119 - 0.3622i
  -0.4653 + 0.0519i
   0.7790 + 0.9679i
   1.2730 + 1.0205i
  -1.6337 + 0.6741i
      ⋮

ptrsSym = 192×1 complex

   0.0000 - 0.3273i
  -0.0879 - 0.3552i
   0.4931 + 0.1194i
  -1.4765 - 0.6074i
  -0.5758 + 0.1331i
   2.2422 + 0.5442i
  -1.1968 + 1.4190i
   0.7160 + 0.7333i
  -0.7518 - 0.5147i
   1.3432 - 0.0623i
      ⋮

Input Arguments

collapse all

UL-SCH codeword from TS 38.212 Section 6.2.7, specified as a column vector of integers from –2 to 1.

  • 0 and 1 represent false and true bit values, respectively.

  • –1 and –2 represent x and y placeholders in the uplink control information (UCI), respectively. For more details, see TS 38.212 Sections 5.3.3.1 and 5.3.3.2.

Data Types: double | int8

Modulation scheme, specified as 'pi/2-BPSK', 'QPSK', '16QAM', '64QAM', or '256QAM'. This modulation scheme determines the modulation type and number of bits used per modulation symbol.

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

Data Types: char | string

Number of transmission layers, specified as an integer from 1 to 4. For more information, see TS 38.211 Section 6.3.1.3.

Data Types: double

Scrambling identity, specified as an integer from 0 to 1023. nid is higher layer parameter dataScramblingIdentityPUSCH, ranging from 0 to 1023, if the higher layer parameter is configured. Otherwise, nid is physical layer cell identity number NCellID, ranging from 0 to 1007. For more information, see TS 38.211 Section 6.3.1.1.

Data Types: double

RNTI of the UE, specified as an integer from 0 to 65,535.

Data Types: double

Transform precoding, specified as false or true. For more information, see TS 38.211 Section 6.3.1.4.

Data Types: double | logical

Number of allocated PUSCH resource blocks, specified as an integer from 1 to 275. For more information, see TS 38.214 Section 6.1.2.

Data Types: double

Transmission scheme, specified as one of these values:

  • 'nonCodebook' — Use this option to disable MIMO precoding.

  • 'codebook' — Use this option for codebook-based transmission using MIMO precoding.

For more information, see TS 38.211 Section 6.3.1.4.

Data Types: char | string

Transmitted precoding matrix indicator, specified as an integer from 0 to 27. The valid range of tpmi depends on the specified number of transmission layers, nLayers, and number of antenna ports, nPorts. For more information, see TS 38.211 Tables 6.3.1.5-1 to 6.3.1.5-7.

Data Types: double

Number of antenna ports, specified as 1 , 2, or 4. For more information, see TS 38.211 Section 6.3.1.5.

Data Types: double

Data type of the output symbols, specified as 'double' or 'single'.

Data Types: char | string

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

Physical layer cell identity, specified as an integer from 0 to 1007.

Data Types: double

Subcarrier spacing in kHz, for all channels and reference signals of the carrier, specified as 15, 30, 60, 120, or 240.

Data Types: double

Cyclic prefix length, specified as one of these options.

  • 'normal' — Use this value to specify normal cyclic prefix. This option corresponds to 14 OFDM symbols in a slot.

  • 'extended' — Use this value to specify extended cyclic prefix. This option corresponds to 12 OFDM symbols in a slot. For the numerologies specified in TS 38.211 Section 4.2, extended cyclic prefix length applies for only 60 kHz subcarrier spacing.

Data Types: char | string

Number of RBs in the carrier resource grid, specified as an integer from 1 to 275. The default value of 52 corresponds to the maximum number of RBs of a 10 MHz carrier with 15 kHz SCS.

Data Types: double

Start of carrier resource grid relative to CRB 0, specified as an integer from 0 to 2199. This property is the higher-layer parameter offsetToCarrier.

Data Types: double

Slot number, specified as a nonnegative integer. You can set NSlot to a value larger than the number of slots per frame. For example, you can set this value using transmission loop counters in a MATLAB® simulation. In this case, you may have to ensure that the property value is modulo the number of slots per frame in a calling code.

Data Types: double

PUSCH configuration parameters for a specific OFDM numerology, specified as an nrPUSCHConfig object. This function only uses these nrPUSCHConfig object properties.

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, or a character array.

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

Data Types: char | string

Number of transmission layers, specified as 1, 2, 3, or 4.

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.

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, or 4. This value must be greater than or equal to the NumLayers property.

Dependencies

This property is applicable only when TransmissionScheme is set to 'codebook'.

Data Types: double

Transmitted precoding matrix indicator, specified as an integer from 0 to 27.

Dependencies

This property is applicable only when TransmissionScheme is set to 'codebook'.

Data Types: double

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

Data Types: char | string

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

Dependencies

This property is applicable only when FrequencyHopping is set to 'intraSlot', or 'interSlot'.

Data Types: double

Scrambling identity, specified as an integer from 0 to 1023. Use [] to set this property to the NCellID property of the nrCarrierConfig object.

Data Types: double

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

Data Types: double

PUSCH DM-RS configuration parameters, specified as an nrPUSCHDMRSConfig object. This function uses only these nrPUSCHDMRSConfig properties.

DM-RS configuration type, specified as 1 or 2. This property is the higher-layer parameter dmrs-Type.

This property value must be 1 when nrPUSCHDMRSConfig is a property of nrPUSCHConfig with TransformPrecoding property set to 1.

Data Types: double

Position of first DM-RS OFDM symbol, provided by higher layer parameter dmrs-TypeA-Position, specified as 2 or 3.

This property is applicable when nrPUSCHDMRSConfig is a property of nrPUSCHConfig object with MappingType property value set to 'A'.

Data Types: double

Maximum number of DM-RS additional positions, specified as 0, 1, 2, or 3. This property is the higher layer parameter dmrs-AdditionalPosition.

This property value must be 0 or 1 when nrPUSCHDMRSConfig is a property of nrPUSCHConfig object with FrequencyHopping property set to 'intraSlot'.

Data Types: double

Number of consecutive front-loaded DM-RS OFDM symbols, specified as 1 (single-symbol DM-RS) or 2 (double-symbol DM-RS).

This property value must be 1 when nrPUSCHDMRSConfig is a property of nrPUSCHConfig object with FrequencyHopping property set to 'intraSlot'.

Data Types: double

DM-RS OFDM symbol locations that are 0-based, specified as one of these options.

  • Integer from 0 to 13 — For one DM-RS symbol

  • Vector of nonnegative integers from 0 to 13 — For multiple DM-RS symbols

Each input symbol location is assumed to be a single-symbol DM-RS within the physical shared channel symbol allocation.

The default value, [], corresponds to the DM-RS symbols locations as per TS 38.211 Table 6.4.1.1.3-3, 6.4.1.1.3-4, or 6.4.1.1.3-6 [1]. Setting this property overrides the corresponding DM-RS symbol locations in these standard lookup tables.

Data Types: double

DM-RS antenna ports, specified as one of these options.

  • Integer from 0 to 11 — For a single antenna port

  • Vector of nonnegative integers from 0 to 11 — For multiple antenna ports

Nominal antenna ports supported depend on DMRSLength and DMRSConfigurationType property values, as shown in this table.

DMRSLength ValueDMRSConfigurationType ValueNominal Range of Antenna Ports Supported
11[0, 3]
2[0, 5]
21[0, 7]
2[0, 11]

The default value of [] implies that DM-RS antenna port is equal to 0.

When nrPUSCHDMRSConfig is a property of nrPUSCHConfig object, [] implies that DMRSPortSet is in the range from 0 to NumLayers–1.

Data Types: double

DM-RS scrambling identity for CP-OFDM, specified as one of these options.

  • Integer from 0 to 65,535 — If NIDNSCID is higher-layer parameter scramblingID0/scramblingID1

  • [] — If NIDNSCID is not a higher-layer parameter, then the value is equal to the NCellID property of the nrCarrierConfig object. Use [] to set this property to the NCellID property value.

Dependencies

This property applies when the TransformPrecoding property of the nrPUSCHConfig object is set to 0.

Data Types: double

DM-RS scrambling initialization for CP-OFDM, specified as 0 or 1.

Dependencies

This property applies when the TransformPrecoding property of the nrPUSCHConfig object is set to 0.

Data Types: double

DM-RS scrambling identity for DFT-s-OFDM, specified as one of these options.

  • Integer from 0 to 1007 — If NRSID is the higher-layer parameter nPUSCH-Identity.

  • [] — Use this option to set the value of this property to the NCellID property value of the nrCarrierConfig object when the higher-layer parameter nPUSCH-Identity is undefined.

Dependencies

This property applies when the TransformPrecoding property of the nrPUSCHConfig object is set to 1.

Data Types: double

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 PT-RS configuration, specified as an nrPUSCHPTRSConfig object. This function uses only these nrPUSCHPTRSConfig properties.

PT-RS time density, specified as 1, 2 or 4. This property is the higher layer parameter timeDensity.

Data Types: double

PT-RS frequency density, specified as 2 or 4. This property is the higher layer parameter frequencyDensity.

Dependencies

This property applies only when nrPUSCHPTRSConfig is a property of nrPUSCHConfig with TransformPrecoding set to 0.

Data Types: double

PT-RS antenna port set, specified as a two-element vector of nonnegative integers. Specify [] to set this property to the lowest value in the DMRSPortSet property of nrPUSCHDMRSConfig object. This usage of [] value is applicable only when nrPUSCHDMRSConfig object is used as a property of nrPUSCHConfig object.

Dependencies

This property applies only when nrPUSCHPTRSConfig is a property of nrPUSCHConfig with TransformPrecoding set to 0.

Data Types: double

Number of PT-RS samples per PT-RS group, specified as 2 or 4. This property is the higher layer parameter sampleDensity.

Dependencies

This property applies only when nrPUSCHPTRSConfig is a property of nrPUSCHConfig with TransformPrecoding set to 1.

Data Types: double

Number of PT-RS groups, specified as 2, 4, or 8. This property is the higher layer parameter sampleDensity.

When this property is set to 8, the number of PT-RS samples set by the NumPTRSSamples property must be set to 4.

Dependencies

This property applies only when nrPUSCHPTRSConfig is a property of nrPUSCHConfig with TransformPrecoding set to 1.

Data Types: double

Resource element offset, specified as '00', '01','10', or '11'. This property is the higher layer parameter resourceElementOffset.

Dependencies

This property applies only when nrPUSCHPTRSConfig is a property of nrPUSCHConfig with TransformPrecoding set to 0.

Data Types: char | string

PT-RS scrambling identity, specified as an integer from 0 to 1007. Specify [] to set this property equal to the NRSID property of nrPUSCHDMRSConfig object.

Dependencies

This property applies only when nrPUSCHPTRSConfig is a property of nrPUSCHConfig with TransformPrecoding set to 1.

Data Types: double

Output Arguments

collapse all

PUSCH modulation symbols, returned as a complex matrix. If you set the txScheme input to 'codebook', the number of matrix columns is nPorts. If you set the txScheme input to 'nonCodebook', the number of matrix columns is nLayers. When you enable transform precoding, the output sym represents all of the post transform precoding data modulated symbols and PT-RS symbols.

Data Types: single | double
Complex Number Support: Yes

PT-RS symbols mapped to the resource grid, returned as a complex matrix. When you enable transform precoding, the output ptrsSym is the subset of output sym, at the PT-RS locations prior to transform precoding process. The output ptrsSym returns an empty value when you do not specify the pusch input argument.

Data Types: single | double
Complex Number Support: Yes

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.212. “NR; Multiplexing and channel coding.” 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

Extended Capabilities

Introduced in R2019a