Main Content

802.11be Waveform Generation

This example shows how to parameterize and generate IEEE® 802.11be™ extremely high throughput (EHT) multi-user waveforms.

Introduction

802.11be

The physical layer of 802.11be (Wi-Fi 7) [1] is an extension of 802.11ax (Wi-Fi 6) [2], focusing on WLAN indoor and outdoor operation with a maximum throughput of 30 Gbps [1]. EHT devices coexist with legacy 802.11-compliant devices operating in the 2.4 GHz, 5 GHz, and 6 GHz unlicensed spectra. The standard introduces these key new features in the EHT format [1].

  • 320 MHz channel bandwidth

  • Multiple Resource Units (MRUs) per stations (STAs)

  • 4096-QAM

  • Non-OFDMA preamble puncturing

IEEE P802.11be/D1.0 [1] specifies two packet formats.

  • EHT multi-user (EHT MU), demonstrated in this example

  • EHT trigger-based (EHT TB), not demonstrated in this example

The EHT MU packet can be configured for OFDMA transmission, non-OFDMA transmission, or a combination of the two. With this flexibility, an EHT MU packet can transmit to a single user over the whole band, multiple users over different parts of the band (OFDMA), or multiple users over the same part of the band (MU-MIMO). This example shows how to generate an EHT MU packet for each of these different waveforms and demonstrates some of the key features of the draft standard [1]. The example uses random bits to generate the U-SIG and EHT-SIG signaling fields.

The EHT TB packet allows for OFDMA or MU-MIMO transmission in the uplink. The access point (AP) controls EHT TB transmissions. A trigger frame sent to all STAs participating in the transmission contains all the parameters required for the transmission. Each STA transmits an EHT TB packet simultaneously when triggered by the AP. This example does not support the generation of EHT TB packets. For information about HE TB transmissions, see the 802.11ax Packet Error Rate Simulation for Uplink Trigger-Based Format example.

Subcarriers and Resource Allocation

As in HE transmissions, the channel bandwidth of an EHT transmission is divided into RUs. An RU is a group of subcarriers assigned to one or more users. An RU is defined by the size (the number of subcarriers) and an index. The RU index specifies the location of the RU within the channel. For example, an 80 MHz transmission contains four possible 242-tone RUs, one in each 20 MHz subchannel. RU# 242-1 (size 242, index 1) is the RU occupying the lowest absolute frequency within the 80 MHz, and RU# 242-4 (size 242, index 4) is the RU occupying the highest absolute frequency. The draft standard defines possible sizes and locations of RUs in section 36.3.12.8 of [1].

In EHT, the RU sizes, in tones, are 26, 52, 106, 242, 484, 996, 2x996, or 4x996, where 242, 484, 996, 2x996, and 4x996 correspond correspond to the entire 20 MHz, 40 MHz, 80 MHz, 160 MHz, and 320 MHz channel bandwidth, respectively. An EHT AP can assign 26-, 52-, or 106-tone RUs to a single user, or 242-, 484-, 996-, 2x996, or 4x996-tone RUs to a single-user or multiple-users in MU-MIMO configuration.

Unlike in HE, more than one RU can be assigned to a STA. RUs can be aggregated to form an MRU. RUs are classified as small-size RUs or large-size RUs.

Small-size RUs are 26-, 52-, and 106-tone RUs. Small-size RUs can only be combined with other small-size RUs to form a small-size MRU. Small-size MRUs are used for both uplink and downlink transmission in OFDMA format. These combinations of small-size MRUs can be assigned to a single STA:

  • 52+26-tone MRU

  • 106+26-tone MRU

Large-size RUs are 242-, 484-, 996-, and 2x996-tone RUs. Large-size RUs can only be combined with other large-size RUs to form a large-size MRU. The large-size MRUs are defined for both uplink and downlink transmission in non-OFDMA and OFDMA format. These combinations of large-size MRUs can be assigned to a STA as defined in section 36.3.2.2.3 of [1]:

  • 484+242-tone MUR

  • 996+484-tone MRU

  • 996+484+242-tone MRU (can only be assigned to non-OFDMA STAs)

  • 2x996+484-tone MRU

  • 3x996-tone MRU

  • 3x996+484-tone MRU

The index and size of an MRU is a combined index and size of the RUs forming an MRU. For example, an 20 MHz transmission contains 106+26-tone RU and a 106-tone RU. RU# 106+26 (size 106 and 26, index 1 and 5) is an MRU occupying the lowest absolute frequency within the 20 MHz, and RU# 106 (size 106, index 2) is the RU occupying the highest absolute frequency. The draft standard defines possible sizes and locations of RUs in section 36.3.12.8 of [1].

Non-OFDMA Packet Format

A full-band non-OFDMA packet is an EHT MU packet which contains the transmission of a single user or multiple users in an MU-MIMO configuration over the full channel bandwidth.

Single-User Packet Generation

An EHT MU single-user (SU) packet is a full-band, non-OFDMA transmission to a single user. Use EHT MU configuration object ehtMUConfig to configure the transmission parameters of a full-band EHT MU packet for a single user. Create a full-band 320 MHz single-user MIMO configuration and set the transmission parameters of the user.

cfgSU = ehtMUConfig('CBW320');
numTx = 2; % Number of transmit antennas
cfgSU.NumTransmitAntennas = numTx; 
cfgSU.User{1}.APEPLength = 8000; % A-MPDU length pre-EOF padding, in bytes
cfgSU.User{1}.MCS = 12;          % Modulation and coding scheme
cfgSU.User{1}.NumSpaceTimeStreams = numTx;

Get the required PSDU length for the specified transmission configuration and create a random PSDU of this length for transmission.

psdu = randi([0 1],getPSDULength(cfgSU)*8,1,'int8');

Generate the EHT MU single-user packet by using waveform generator function ehtWaveformGenerator. The ehtWaveformGenerator function uses random bits to generate the U-SIG and EHT-SIG signaling fields.

tx = ehtWaveformGenerator(psdu,cfgSU); %#ok<*NASGU> % Create packet

MU-MIMO Packet Generation

Configure transmission parameters for a full-band non-OFDMA EHT MU packet for multiple users by using the EHT MU configuration object. Use the numUsers property object to specify the number of users in an MU-MIMO configuration.

Create a 20 MHz (MU-MIMO) EHT MU configuration for two users and set parameters common to all users.

numUsers = 2;
numTx = 2;
% Set common transmission parameters for all users
cfgMUMIMO = ehtMUConfig('CBW20',numUsers); 
cfgMUMIMO.NumTransmitAntennas = numTx;
cfgMUMIMO.GuardInterval = 3.2;
cfgMUMIMO.EHTLTFType = 4;

The ruInfo object function provides details of the RUs in the configuration. In this case a single RU contains two users.

allocInfo = ruInfo(cfgMUMIMO);
disp('Allocation info:')
Allocation info:
disp(allocInfo)
                    NumUsers: 2
                      NumRUs: 1
                   RUIndices: {[1]}
                     RUSizes: {[242]}
               NumUsersPerRU: 2
    NumSpaceTimeStreamsPerRU: 2
       PowerBoostFactorPerRU: 1
                   RUNumbers: 1

The properties of cfgMUMIMO describe the transmission configuration. The cfgMUMIMO.RU and cfgMUMIMO.User properties of cfgMUMIMO are cell arrays. Each element of the cell arrays contains an object which configures an RU or a user. When you create the cfgMUMIMO object, the elements of cfgMUMIMO.RU and cfgMUMIMO.User create the desired number of RUs and users. Each element of cfgMUMIMO.RU is an ehtRU object describing the configuration of an RU. Similarly, each element of cfgMU.User is an ehtUser object describing the configuration of a user. This figure shows the object hierarchy.

This example creates a single RU in non-OFDMA format for a channel bandwidth of 20 MHz, so cfgMUMIMO.RU is a cell array with one element. The index and size of each RU is configured according to the channel bandwidth specified when cfgMUMIMO was created.

disp('RU configuration:')
RU configuration:
disp(cfgMUMIMO.RU{1})
  ehtRU with properties:

    PowerBoostFactor: 1
      SpatialMapping: 'Direct'

   Read-only properties:
                Size: 242
               Index: 1
         UserNumbers: [1 2]

After creating the object, you can configure each RU to create the desired transmission configuration by setting the properties of the appropriate RU object. For example, the spatial mapping and power boost factor can be configured per RU.

Create a random spatial mapping array and configure RU index 1.

ruIndex = 1;
ofdmInfo = ehtOFDMInfo('EHT-Data',cfgMUMIMO,ruIndex);
numST = ofdmInfo.NumTones; % Number of occupied subcarriers
numSTS = allocInfo.NumSpaceTimeStreamsPerRU(ruIndex);
cfgMUMIMO.RU{ruIndex}.SpatialMapping = 'Custom';
cfgMUMIMO.RU{ruIndex}.SpatialMappingMatrix = rand(numST,numSTS,numTx);

In this section, numUsers specifies two users in the transmission, so cfgMUMIMO.User contains two elements. The transmission properties of users can be configured by modifying individual user objects, for example the modulation and coding scheme (MCS), APEP length, and channel coding scheme.

Set transmission properties of user 1.

cfgMUMIMO.User{1}.APEPLength = 500; % A-MPDU length pre-EOF padding in bytes
cfgMUMIMO.User{1}.MCS = 12;
cfgMUMIMO.User{1}.ChannelCoding = 'LDPC';
cfgMUMIMO.User{1}.NumSpaceTimeStreams = 1;

Set transmission properties of user 2.

cfgMUMIMO.User{2}.APEPLength = 700; % A-MPDU length pre-EOF padding in bytes
cfgMUMIMO.User{2}.MCS = 7;
cfgMUMIMO.User{2}.ChannelCoding = 'BCC';
cfgMUMIMO.User{2}.NumSpaceTimeStreams = 1;

The read-only RUNumber property indicates which RU is used to transmit this user.

disp('First user configuration:')
First user configuration:
disp(cfgMUMIMO.User{1})
  ehtUser with properties:

              APEPLength: 500
                     MCS: 12
     NumSpaceTimeStreams: 1
           ChannelCoding: 'LDPC'
                   STAID: 0
    NominalPacketPadding: 0
    PostFECPaddingSource: 'mt19937ar with seed'
      PostFECPaddingSeed: 1

   Read-only properties:
                RUNumber: 1

In this example the non-OFDMA configuration consists of a single RU and two users. The UserNumbers property of an RU object indicates which users (elements of the cfgMUMIMO.User cell array) are transmitted on that RU. Similarly, the RUNumber property of each User object indicates which RU (element of the cfgMUMIMO.RU cell array) is used to transmit the user. For more information, see the 802.11ax Waveform Generation example.

The showAllocation object function visualizes the occupied RUs or MRUs and subcarriers for the specified configuration. The colored blocks illustrate the occupied subcarriers in the pre-EHT and EHT portions of the packet. White indicates unoccupied subcarriers. The pre-EHT portion illustrates the occupied subcarriers in the fields preceding the EHT-STF. The EHT portion illustrates the occupied subcarriers in the EHT-STF, EHT-LTF, and EHT-Data field and therefore shows the RU/MRU allocation. To display information about an RU or MRU, click on the RU or MRU. The RU number corresponds to the ith RU element of the cfgMUMIMO.RU property. The showAllocation object function also shows the size of each RU or MRU, and the users assigned to each. The user number corresponds to the ith User element of the cfgMUMIMO.

showAllocation(cfgMUMIMO);

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 7 objects of type patch, line, text.

To generate a non-OFDMA EHT MU waveform, create a random PSDU for each user. Use a cell array to store the PSDU for each user as the PSDU lengths differ. The getPSDULength object function returns a vector with the required PSDU per user for the specified configuration.

psduLength = getPSDULength(cfgMUMIMO);
psdu = cell(1,allocInfo.NumUsers);
for i = 1:allocInfo.NumUsers
    psdu{i} = randi([0 1],psduLength(i)*8,1,'int8');
end

Generate a 20 MHz non-OFDMA (MU-MIMO) packet with two users.

tx = ehtWaveformGenerator(psdu,cfgMUMIMO);

Punctured Packet Generation with Large MRUs

The draft standard allows for punctured 20 MHz subchannels in a non-OFDMA or OFDMA 80 MHz, 160 MHz, or 320 MHz transmission to allow a legacy system to operate in the punctured subchannel. The preamble portion of the punctured 20 MHz subchannel is not transmitted and the corresponding RU is not allocated to any user (no data transmitted). This method is also described as channel bonding.

In a non-OFDMA format, large-size MRUs are obtained by puncturing any one of the 242-, 484-, or 996-tone RUs within an 80 MHz, 160 MHz, or 320 MHz channel bandwidth. As an example, a 996+484+242-tone MRU is obtained by puncturing any one of eight 242-tone RUs in the 160 MHz channel, see section 36.3.12.11.3 of [1]. The preamble is not transmitted in the punctured subchannel within a large MRU and the corresponding RU is not allocated to any user. The non-OFDMA packet format supports single-user and MU-MIMO packet transmission in large MRUs. The EHT-USIG field of an EHT MU packet carries the punctured sub-channel indication for a non-OFDMA transmission.

Use the EHT MU configuration object to configure the non-OFDMA transmission properties of an EHT MU packet transmission on a large MRU. Appendix B lists possible puncturing patterns for 80 MHz, 160 MHz, and 320 MHz channel bandwidths and the corresponding value of the PuncturedChannelFieldValue property when creating the ehtMUConfig object.

Create a configuration for a 160 MHz EHT MU packet transmission on a large 996+484+242-tone MRU. Puncture the second 20 MHz subchannel in a 160 MHz channel as shown in Appendix B by setting the PuncturedChannelFieldValue property to 2.

cfgPunc = ehtMUConfig('CBW160',1,2);
tx = ehtWaveformGenerator([1 0 1 0],cfgPunc);

View the punctured RU allocation.

showAllocation(cfgPunc);

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 25 objects of type patch, line, text.

Create a configuration for two users in MU-MIMO configuration in a 320 MHz channel. The EHT MU packet transmission is on a large 3x996+484-tone MRU, see section 36.3.2.2.3 of [1]. Create the ehtMUConfig object, setting the PuncturedChannelFieldValue property to 3 to puncture the third 40 MHz subchannel in a 320 MHz channel as shown in Appendix B.

cfg = ehtMUConfig('CBW320',2,3);
cfg.NumTransmitAntennas = 8;

Set transmission properties of user 1.

cfg.User{1}.NumSpaceTimeStreams = 4;
cfg.User{1}.APEPLength = 500000;
cfg.User{1}.MCS = 12;

Set transmission properties of user 2.

cfg.User{2}.NumSpaceTimeStreams = 4;
cfg.User{2}.APEPLength = 400000;
cfg.User{2}.MCS = 13;

View the punctured RU allocation.

showAllocation(cfg);

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 43 objects of type patch, line, text.

Create a random PSDU for each user. Use a cell array to store the PSDU for each user as the PSDU lengths differ. The getPSDULength object function returns a vector with the required PSDU per user for the specified configuration.

psduLength = getPSDULength(cfg);
allocInfo = ruInfo(cfg); % Get allocation information
psdu = cell(1,allocInfo.NumUsers);
for i=1:allocInfo.NumUsers 
    psdu{i} = randi([0 1],psduLength(i)*8,1); 
end

Create an oversampled waveform using the ehtWaveformGenerator function. This function generates an oversampled waveform by using a larger inverse fast Fourier transform (IFFT) size than required for the nominal baseband rate.

osf = 1.5;
tx = ehtWaveformGenerator(psdu,cfg,'OversamplingFactor',osf);

Generate the spectrum and spectrogram of the generated signal. The spectrogram shows the punctured 40 MHz subchannel in the 320 MHz channel.

spectrumAnalyzer = plotSpectrumAndSpectrogram(tx,cfg,osf,'3x996+484-tone MRU with punctured 40 MHz subchannel in 320 MHz channel');

Figure Spectrum Analyzer contains 2 axes objects and other objects of type uiflowcontainer, uimenu, uitoolbar. Axes object 1 with title 3x996+484-tone MRU with punctured 40 MHz subchannel in 320 MHz channel contains 8 objects of type line. These objects represent Channel 1, Channel 2, Channel 3, Channel 4, Channel 5, Channel 6, Channel 7, Channel 8. Axes object 2 with title 3x996+484-tone MRU with punctured 40 MHz subchannel in 320 MHz channel contains an object of type image.

OFDMA Packet Format

The allocation index defines the assignment of RUs/MRUs in an OFDMA transmission. Appendix A lists the allocation indices for all RU/MRU assignments. For each 20 MHz subchannel, a 9-bit index describes the number and size of RUs/MRUs and the number of users transmitted on each RU/MRU. The length of allocation Index must be 1, 2, 4, 8, or 16 to define the assignment for each 20 MHz subchannel in a 20 MHz, 40 MHz, 80 MHz, 160 MHz, or 320 MHz channel bandwidth, respectively. The allocation index also determines which content channel the EHT-SIG field uses to signal a user.

Small MRU Packet Generation

Configure transmission parameters for an EHT MU packet format in a OFDMA configuration with an EHT MU configuration object. Create an OFDMA configuration for a 20 MHz EHT MU packet with two 52-tone RUs, one 106+26-tone MRU, and one user per RU, as defined by allocation index 47.

cfgOFDMA = ehtMUConfig(47);

Visualize the RU allocation with the showAllocation object function.

showAllocation(cfgOFDMA)

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 10 objects of type patch, line, text.

The ruInfo object function provides details of the RUs in the configuration. You can see three RUs with a user in each RU.

allocInfo = ruInfo(cfgOFDMA);
disp('Allocation info:')
Allocation info:
disp(allocInfo)
                    NumUsers: 3
                      NumRUs: 3
                   RUIndices: {[1 5]  [3]  [4]}
                     RUSizes: {[106 26]  [52]  [52]}
               NumUsersPerRU: [1 1 1]
    NumSpaceTimeStreamsPerRU: [1 1 1]
       PowerBoostFactorPerRU: [1 1 1]
                   RUNumbers: [1 2 3]

Set common transmission parameters for all users.

numTx = 3;
cfgOFDMA.NumTransmitAntennas = numTx;
cfgOFDMA.EHTLTFType = 2;
cfgOFDMA.GuardInterval = 1.6
cfgOFDMA = 
  ehtMUConfig with properties:

                     RU: {[1x1 ehtRU]  [1x1 ehtRU]  [1x1 ehtRU]}
                   User: {[1x1 ehtUser]  [1x1 ehtUser]  [1x1 ehtUser]}
    NumTransmitAntennas: 3
          GuardInterval: 1.6000
             EHTLTFType: 2
              EHTSIGMCS: 0
         USIGBitsSource: 'mt19937ar with seed'
           USIGBitsSeed: 74
       EHTSIGBitsSource: 'mt19937ar with seed'
         EHTSIGBitsSeed: 75

   Read-only properties:
       ChannelBandwidth: 'CBW20'
        AllocationIndex: 47

Configure RU 1 and user 1.

cfgOFDMA.RU{1}.SpatialMapping = 'Direct';
cfgOFDMA.User{1}.APEPLength = 1e3;
cfgOFDMA.User{1}.MCS = 12;
cfgOFDMA.User{1}.NumSpaceTimeStreams = numTx;
cfgOFDMA.User{1}.ChannelCoding = 'LDPC';

Configure RU 2 and user 2.

cfgOFDMA.RU{2}.SpatialMapping = 'Fourier';
cfgOFDMA.User{2}.APEPLength = 500;
cfgOFDMA.User{2}.MCS = 5;
cfgOFDMA.User{2}.NumSpaceTimeStreams = 2;
cfgOFDMA.User{2}.ChannelCoding = 'LDPC';

Configure RU 3 and user 3.

cfgOFDMA.RU{3}.SpatialMapping = 'Fourier';
cfgOFDMA.User{3}.APEPLength = 100;
cfgOFDMA.User{3}.MCS = 4;
cfgOFDMA.User{3}.NumSpaceTimeStreams = 1;
cfgOFDMA.User{3}.ChannelCoding = 'BCC';

Allocation index 47 specifies three RUs and three users, therefore cfgOFDMA.RU and cfgOFDMA.User are both cell arrays with three elements. This figure shows the object hierarchy.

The Size and Index properties of cfgOFDMA.RU{1} show the size and index of the RUs making up the 106+26-tone MRU.

disp('First RU configuration:')
First RU configuration:
disp(cfgOFDMA.RU{1})
  ehtRU with properties:

    PowerBoostFactor: 1
      SpatialMapping: 'Direct'

   Read-only properties:
                Size: [106 26]
               Index: [1 5]
         UserNumbers: 1

Configure the transmission properties of users by modifying individual user object properties. The read-only RUNumber property indicates which RU is used to transmit this user.

disp('First user configuration:')
First user configuration:
disp(cfgOFDMA.User{1})
  ehtUser with properties:

              APEPLength: 1000
                     MCS: 12
     NumSpaceTimeStreams: 3
           ChannelCoding: 'LDPC'
                   STAID: 0
    NominalPacketPadding: 0
    PostFECPaddingSource: 'mt19937ar with seed'
      PostFECPaddingSeed: 1

   Read-only properties:
                RUNumber: 1

The UserNumbers property of an RU object indicates which users (elements of the cfgOFDMA.User cell array) are transmitted on that RU. Similarly, the RUNumber property of each User object, indicates which RU (element of the cfgMUMIMO.RU cell array) is used to transmit the user. For more information see the 802.11ax Waveform Generation example.

To generate an EHT MU waveform, create a random PSDU for each user. Store the PSDU for each user in a cell array as the PSDU lengths differ. The getPSDULength object function returns a vector with the required PSDU per user given the configuration.

psduLength = getPSDULength(cfgOFDMA);
psdu = cell(1,allocInfo.NumUsers);
for i=1:allocInfo.NumUsers
    psdu{i} = randi([0 1],psduLength(i)*8,1);
end

Generate the waveform.

tx = ehtWaveformGenerator(psdu,cfgOFDMA);

Large MRU Packet Generation

An EHT MU transmission with a channel bandwidth greater than 20 MHz uses two content channels to signal the common and user configuration information. These content channels are duplicated over each 40 MHz subchannel within an 80 MHz segment. When an OFDMA system contains an RU with size greater than 242, the users assigned to the RU can be signaled on either of the two EHT SIG content channels as defined in section 36.3.12.8 of [1].

As an example, consider this 160 MHz configuration, which serves ten users with three RUs including a 996-[ ]-484 MRU:

  • A large 996+484-tone MRU (RU #1) with eight users (user #1-8)

  • A 242-tone RU (RU #2) with one user (user #9)

  • A 242-tone RU (RU #3) with one user (user #10)

Configure a 160 MHz OFDMA transmission with eight allocation indices, one for each 20 MHz subchannel. To configure the example scenario, use these allocation indices.

[X1 X2 X3 X4 64 64 X5 X6]

  • X1 to X6 configure the 996+484-tone MRU, with users #1-8.

  • Allocation index 64 configures a 242-tone RU with one user.

The selection of X1 to X6 configures the appropriate number of users through an allocation index in the 20 MHz subchannel and determines which EHT-SIG content channel signals the users on the 996+484-tone RU. A 996+484-tone RU spans six 20 MHz subchannels. The two 242-tone RUs each indicated by allocation index 64 span two 20 MHz subchannels within MRU 996-[ ]-484. The 996+484-tone MRU requires six allocation indices indicated by X1 to X6. The ten users can be signaled on two EHT-SIG content channels in different combinations. Table 1 shows seven of the numerous possible combinations.

An allocation index within the range 144-151 specifies 1-8 users on a 996+484-tone MRU. To signal no users on a content channel, use allocation index 29 or 30 when the 20 MHz subchannel corresponding to the index overlaps with a 448-tone or 996-tone RU, respectively. Therefore, the combinations in Table 1 require eight allocation indices as shown in Table 2. Other than allocation index 64, the remaining six allocation indices in each row of Table 2 are X1 to X6. Table 2 shows the number of users on each content channel in the two 80 MHz segments for various combinations of RU allocation index.

To configure 'Combination C' use the allocation indices [145 145 145 145 64 64 29 29].

Configure the transmission parameters for an EHT MU packet format for the OFDMA configuration with an EHT MU configuration object.

cfgLMRU = ehtMUConfig([145 145 145 145 64 64 29 29]); % 1 MRU (996+484) with 8 users and two 242-tone RUs with one user each
cfgLMRU.NumTransmitAntennas = 8;

Set transmission parameters of the users.

userSTS = [1 1 1 1 1 1 1 1 8 8]; % Number of space time streams per user
allocInfo = ruInfo(cfgLMRU); % Get details of the RU/MRU in the configuration
for u=1:allocInfo.NumUsers
    cfgLMRU.User{u}.NumSpaceTimeStreams = userSTS(u);
    cfgLMRU.User{u}.MCS = 12;
    cfgLMRU.User{u}.APEPLength = randi([100 500],1,1);
end

Create packet with a repeated bit sequence as the PSDU.

tx = ehtWaveformGenerator([1 0 1 0],cfgLMRU);

Visualize the RU allocation.

showAllocation(cfgLMRU)

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 29 objects of type patch, line, text.

Preamble Puncturing

Create a configuration for an OFDMA 160 MHz transmission with punctured subchannels. Use the 20 MHz subchannel allocation index 26 to puncture a 20 MHz subchannel. Puncture the second 20 MHz subchannel in the lower 80 MHz segment. Puncture the second and third 20 MHz subchannels in the upper 80 MHz segment.

cfgPuncture = ehtMUConfig([64 26 64 64 64 26 26 64]);
for u=1:numel(cfgPuncture.User)
    cfgPuncture.User{u}.APEPLength = 1000;
end

Generate on oversampled waveform using a larger IFFT size than required for the nominal baseband rate.

osf = 1.5;
txPuncture = ehtWaveformGenerator([1 0 1 0],cfgPuncture,'OversamplingFactor',osf);

View the punctured 20 MHz subchannels in the generated waveform by using the spectrum analyzer.

sa = plotSpectrumAndSpectrogram(txPuncture,cfgPuncture,osf,'160 MHz EHT MU Transmission with Punctured 20 MHz Channels');

Figure Spectrum Analyzer contains 2 axes objects and other objects of type uiflowcontainer, uimenu, uitoolbar. Axes object 1 with title 160 MHz EHT MU Transmission with Punctured 20 MHz Channels contains an object of type line. This object represents Channel 1. Axes object 2 with title 160 MHz EHT MU Transmission with Punctured 20 MHz Channels contains an object of type image.

Unassigned RUs

The draft standard allows for RUs to be unassigned (no data transmitted) without the preamble portion of the corresponding 20 MHz being punctured. The standard specifies two methods for creating unassigned RUs: using an unassigned 242-tone allocation index, or signaling a User with STA-ID 2046.

Unassigned 242-tone Allocation Index

Configure a 160 MHz transmission with no data transmission in a 20 MHz subchannel without preamble puncturing by using allocation index 27.

cfgUnassigned = ehtMUConfig([64 27 64 64]);
for u=1:numel(cfgUnassigned.User)
    cfgUnassigned.User{u}.APEPLength = 1000;
end

Visualize the RU allocation, which shows that the preamble is not punctured.

showAllocation(cfgUnassigned);

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 15 objects of type patch, line, text.

Generate an oversampled waveform and view the spectrogram. The preamble is visible in all 20 MHz subchannels at the start of the waveform.

osf = 1.5;
tx = ehtWaveformGenerator([1 0 0 1],cfgUnassigned,'OversamplingFactor',osf);
sa = plotSpectrumAndSpectrogram(tx,cfgUnassigned,osf,'160 MHz EHT MU Transmission with Unassigned 20 MHz Channel');

Figure Spectrum Analyzer contains 2 axes objects and other objects of type uiflowcontainer, uimenu, uitoolbar. Axes object 1 with title 160 MHz EHT MU Transmission with Unassigned 20 MHz Channel contains an object of type line. This object represents Channel 1. Axes object 2 with title 160 MHz EHT MU Transmission with Unassigned 20 MHz Channel contains an object of type image.

Signal User with STA-ID 2046

The draft standard states an RU is unassigned (no data transmitted) if the STA-ID of the EHT-SIG User field is 2046.

Create a 20 MHz OFDMA configuration with four RUs with a user in each RU using allocation index 52

cfgUnassigned = ehtMUConfig(52);

Visualize the RU allocation.

showAllocation(cfgUnassigned)

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 13 objects of type patch, line, text.

Set the STAID property of the third user to 2046 so the 52+26-tone MRU is unassigned.

cfgUnassigned.User{3}.STAID = 2046; % No data transmitted to 3rd user on MRU 52+26

Visualize the RU allocation, which shows that the third RU is now unassigned but the preamble is not punctured.

showAllocation(cfgUnassigned)

Figure RU/MRU Assignment and Occupied Subcarriers contains an axes object. The axes object contains 9 objects of type patch, line, text.

View details of the active RUs in the configuration by using the ruInfo object function. This shows three users and three RUs as one user and RU is unassigned.

allocInfo = ruInfo(cfgUnassigned);
disp('Allocation info:')
Allocation info:
disp(allocInfo)
                    NumUsers: 4
                      NumRUs: 3
                   RUIndices: {[1]  [5]  [9]}
                     RUSizes: {[106]  [26]  [26]}
               NumUsersPerRU: [1 1 1]
    NumSpaceTimeStreamsPerRU: [1 1 1]
       PowerBoostFactorPerRU: [1 1 1]
                   RUNumbers: [1 2 4]
function spectrumAnalyzer = plotSpectrumAndSpectrogram(tx,cfg,osf,titleStr)
    % Plot the specrum and spectrogram for a given waveform and
    % configuration
    fs = wlanSampleRate(cfg.ChannelBandwidth,'OversamplingFactor',osf); % Get baseband sample rate
    ofdmInfo = ehtOFDMInfo('EHT-Data',cfg,'OversamplingFactor',osf);
    fftsize = ofdmInfo.FFTLength; % Use the data field fft size
    rbw = fs/fftsize; % Resolution bandwidth
    spectrumAnalyzer = dsp.SpectrumAnalyzer('SampleRate',fs,...
        'Method','Filter bank','RBWSource','Property','RBW',rbw,...
        'AveragingMethod','Exponential','ForgettingFactor',0.25,...
        'ReducePlotRate',false,'YLimits',[-100,10],...
        'Title',titleStr);
    spectrumAnalyzer.ViewType = 'Spectrum and Spectrogram';
    spectrumAnalyzer.TimeSpanSource = 'Property';
    spectrumAnalyzer.TimeSpan = length(tx)/fs;
    spectrumAnalyzer(tx)
end

Appendix A

The RU allocation table for allocations <= 20 MHz is shown below, with annotated descriptions.

RU allocation and EHT-SIG user signaling for allocations >= 20 MHz, with annotated descriptions.

RU allocation and EHT-SIG user signaling for 242-, 484-, 996-, and 2x996-tone RUs.

MRU allocation and EHT-SIG user signaling for allocation >=80 MHz.

Appendix B

Non-OFDMA punctured channel indication for a 80 MHz PPDU, with annotated descriptions.

Non-OFDMA punctured channel indication for a 160 MHz PPDU, with annotated descriptions.

Non-OFDMA punctured channel indication for a 320 MHz PPDU.

Related Examples

References

  1. IEEE P802.11be™/D1.0 Draft Standard for Information technology - Telecommunications and information exchange between systems Local and metropolitan area networks - Specific requirements - Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications - Amendment 8: Enhancements for extremely high throughput (EHT).

  2. IEEE P802.11ax™/D4.1 Draft Standard for Information technology - Telecommunications and information exchange between systems - Local and metropolitan area networks - Specific requirements - Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications - Amendment 1: Enhancements for High Efficiency WLAN.