This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English version of the page.

Note: This page has been translated by MathWorks. Click here to see
To view all translated materials including this page, select Country from the country navigator on the bottom of this page.

wlanHEDataBitRecover

Recover data bits from HE-Data field

Syntax

dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,cfgHE)
dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,csi,cfgHE)
dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,cfgHE,userIdx)
dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,csi,cfgHE,userIdx)
dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,cfgRx)
dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,csi,cfgRx)
recBits = wlanHEDataBitrecover(___,Name,Value)

Description

dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,cfgHE) returns dataBits, tHE-Data bits recovered from equalized HE-Data OFDM symbols rxDataSym in a single-user transmission. The function also returns noise variance estimate noiseVarEst and high-efficiency single-user (HE-SU) configuration object cfgHE.

example

dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,csi,cfgHE)returns the recovered data bits using the channel state information csi to enhance the demapping of OFDM subcarriers.

dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,cfgHE,userIdx) returns the recovered data bits for the specified user of a multiuser HE transmission, as determined by the user index userIdx, for the given.

example

dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,csi,cfgHE,userIdx)returns the recovered data bits for the specified user of a high-efficiency multiuser (HE-MU) transmission, using the channel state information to enhance the demapping of OFDM subcarriers.

example

dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,cfgRx) returns the recovered data bits for the HE recovery configuration object cfgRx.

dataBits = wlanHEDataBitrecover(rxDataSym,noiseVarEst,csi,cfgRx) returns the recovered data bits for the HE recovery configuration object and channel state information.

recBits = wlanHEDataBitrecover(___,Name,Value) returns the recovered data bits for additional options specified by one or more name-value pair arguments. When a name-value pair is not specified, its default value is used.

Examples

collapse all

Recover HE data from a single-user HE packet waveform transmitted though an AWGN channel.

cfgHE = wlanHESUConfig('MCS',11);

Generate a transmit waveform containing eight data packets.

msgLen = getPSDULength(cfgHE)*8;
txBits = randi([0 1],msgLen,1,'int8');
txWaveform = wlanWaveformGenerator(txBits,cfgHE);

Add noise to the waveform.

snr = 30;
rxWaveform = awgn(txWaveform,snr);

Extract the data field.

ind = wlanFieldIndices(cfgHE);
rxData = rxWaveform(ind.HEData(1):ind.HEData(2),:);

Assuming 20-MHz channel bandwidth and 3.2-microsecond guard interval, OFDM demodulate the received waveform and extract the data-carrying subcarriers.

Nfft = 256; % FFT length (20 MHz)
Ncp = 64;   % Cyclic prefix length (3.2 us at 20 MHz)
pilotSC = [-116; -90; -48; -22; 22; 48; 90; 116]; % Pilot indices
ruSC = [-122:-2 2:122].'; % Active subcarrier indices
nullIdx = setdiff((-Nfft/2:(Nfft/2-1)).',ruSC)+Nfft/2+1;
pilotIdx = pilotSC+Nfft/2+1;
sf = (1/sqrt(numel(ruSC)))*Nfft; % Scaling factor
rxSym = ofdmdemod(rxData,Nfft,Ncp,Ncp,nullIdx,pilotIdx)/sf;

Recover the data bits.

csi = ones(length(rxSym),1); % Assume CSI estimate of all ones
nVar = 10^(-snr/10); % Noise variance
rxBits = wlanHEDataBitRecover(rxSym,nVar,csi,cfgHE);

Compare the recovered bits to the original information bits.

disp(isequal(txBits,rxBits));
   1

Decode the HE-Data field for each user in an OFDMA transmission.

Waveform Generation

Create a multiuser HE object and packet configuration.

allocationIndex = 96; % Two 106-tone RUs, two users, 20 MHz
cfg = wlanHEMUConfig(allocationIndex);
cfg.User{1}.MCS = 4;
cfg.User{2}.APEPLength = 1e3;
cfg.User{2}.MCS = 7;

Generate random data based on the specific PSDU length per user.

numUsers = numel(cfg.User);
psduLength = getPSDULength(cfg);
txBits = cell(1,numUsers);
for i = 1:numUsers
   txBits{i} = randi([0 1],psduLength(i)*8,1);
end

Generate an OFDMA waveform signal and add AWGN to the signal.

txWaveform = wlanWaveformGenerator(txBits,cfg);
snr = 25;
rxWaveform = awgn(txWaveform,snr);

Receiver Processing per User

Using the PPDU field indices structure, extract the HE-Data field for each user.

ind = wlanFieldIndices(cfg)
ind = struct with fields:
      LSTF: [1 160]
      LLTF: [161 320]
      LSIG: [321 400]
     RLSIG: [401 480]
    HESIGA: [481 640]
    HESIGB: [641 880]
     HESTF: [881 960]
     HELTF: [961 1280]
    HEData: [1281 6720]

rxData = rxWaveform(ind.HEData(1):ind.HEData(2),:);       

For each user, OFDM demodulate and extract data-carrying subcarriers assuming 20-MHz channel bandwidth, and 3.2-microsecond guard interval for the appropriate resource unit (RU).

for userIdx = 1:numUsers
   Nfft = 256; % FFT length (20 MHz)
   Ncp = 64;  % Cyclic prefix length (3.2 us at 20 MHz)
   pilotSC = [-116; -90; -48; -22; 22; 48; 90; 116]; % Pilot indices
   if userIdx==1
      ruSC = (-122:-17).'; % Active subcarrier indices RU #1
   else
      ruSC = (17:122).'; % Active subcarrier indices RU #2
   end
   nullIdx = setdiff((-Nfft/2:(Nfft/2-1)).',ruSC)+Nfft/2+1;
   pilotIdx = pilotSC(ismember(pilotSC,ruSC))+Nfft/2+1;
   sf = (1/sqrt(2*numel(ruSC)))*Nfft; % Scaling factor
   rxSym = ofdmdemod(rxData,Nfft,Ncp,Ncp,nullIdx,pilotIdx)/sf;        
  
   % Recover data bits and compare with transmitted
   csi = ones(length(rxSym),1); % Assume CSI estimate of all ones
   nVar = 10^(-snr/10); % Noise variance
   rxBits = wlanHEDataBitRecover(rxSym,nVar,csi,cfg,userIdx);
   disp(isequal(rxBits,txBits{userIdx}))
end
   1

   1

Recover the HE-Data field for an HE-SU-format packet by decoding the HE signaling fields, updating the unknown properties in the recovery configuration object, and passing the updated object into the HE-Data recovery function.

Create an HE-SU-format configuration object, specifying the MCS, and extract the channel bandwidth.

cfgHESU = wlanHESUConfig('MCS',0);
cbw = cfgHESU.ChannelBandwidth;

Generate a waveform for the specified configuration object.

bits = randi([0 1],8*getPSDULength(cfgHESU),1,'int8');
waveform = wlanWaveformGenerator(bits,cfgHESU);

Create a WLAN recovery configuration object, specifying the known channel bandwidth and an HE-SU-format packet.

cfgRx = wlanHERecoveryConfig('ChannelBandwidth',cbw,'PacketFormat','HE-SU');

Recover the HE signaling fields by retrieving the field indices and performing the relevant demodulation operations.

ind = wlanFieldIndices(cfgRx);
heLSIGandRLSIG = waveform(ind.LSIG(1):ind.RLSIG(2),:);
symLSIG = wlanHEDemodulate(heLSIGandRLSIG,'L-SIG',cbw);
info = wlanHEOFDMInfo('L-SIG',cbw);

Merge the L-SIG and RL-SIG fields for diversity and obtain the data subcarriers.

symLSIG = mean(symLSIG,2);
lsig = symLSIG(info.DataIndices,:);

Decode the L-SIG field, assuming a noiseless channel, and use the length field to update the recovery object.

[~,~,lsigInfo] = wlanLSIGBitRecover(lsig,0);
cfgRx.LSIGLength = lsigInfo.Length;

Recover and demodulate the HE-SIG-A field, obtain the data subcarriers and recover the HE-SIG-A bits.

heSIGA = waveform(ind.HESIGA(1):ind.HESIGA(2),:);
symSIGA = wlanHEDemodulate(heSIGA,'HE-SIG-A',cbw);
siga = symSIGA(info.DataIndices,:);
[sigaBits,failCRC] = wlanHESIGABitRecover(siga,0);

Update the recovery configuration object with the recovered HE-SIG-A bits and obtain the updated field indices.

cfgRx = interpretHESIGABits(cfgRx,sigaBits);
ind = wlanFieldIndices(cfgRx);

Retrieve and decode the HE-Data field.

heData = waveform(ind.HEData(1):ind.HEData(2),:);
symData = wlanHEDemodulate(heData,'HE-Data', ... 
    cbw,cfgRx.GuardInterval,[cfgRx.RUSize cfgRx.RUIndex]);
infoData = wlanHEOFDMInfo('HE-Data',cbw,cfgRx.GuardInterval,[cfgRx.RUSize cfgRx.RUIndex]);
data = symData(infoData.DataIndices,:,:);
dataBits = wlanHEDataBitRecover(data,0,cfgRx);

Check that the returned data bits are the same as the transmitted data bits.

isequal(bits,dataBits)
ans = logical
   1

Input Arguments

collapse all

Equalized HE-Data field OFDM symbols for a user, specified as an NSD-by-NSym-by-NSS complex-valued array. NSD is the number of data subcarriers in the HE-Data field, NSym is the number of OFDM symbols, and NSS is the number of spatial streams. The contents and size of rxDataSym depend on the HE PPDU format configuration.

Data Types: double
Complex Number Support: Yes

Noise variance estimate, specified as a nonnegative scalar.

Data Types: double

Channel state information, specified as an NST-by-NSS real-valued matrix. NST is the number of subcarriers and NSS is the number of spatial streams.

Data Types: double

HE format configuration, specified as an object of type wlanHESUConfig or wlanHEMUConfig.

HE recovery configuration, specified as a wlanHERecoveryConfig object.

User index, specified as an integer in the interval [1, 8].

Data Types: double

Name-Value Pair Arguments

Specify optional comma-separated pairs of Name,Value arguments. Name is the argument name and Value is the corresponding value. Name must appear inside quotes. You can specify several name and value pair arguments in any order as Name1,Value1,...,NameN,ValueN.

Example: 'MaximumLDPCIterationCount','12','EarlyTermination','false' specifies a maximum of 12 decoding iterations for the low-density parity check (LDPC) and disables early termination of LDPC decoding so that it completes the 12 iterations.

Maximum number of decoding iterations in LDPC, specified as a positive scalar integer. This parameter is applicable when channel coding is set to LDPC for the user of interest.

For information on channel coding options, see the 802.11™ format configuration object of interest.

Data Types: double

Enable early termination of LDPC decoding, specified as a logical. This parameter is applicable when channel coding is set to LDPC for the user of interest.

  • When set to false, LDPC decoding completes the number of iterations specified by MaximumLDPCIterationCount, regardless of parity check status.

  • When set to true, LDPC decoding terminates when all parity-checks are satisfied.

For information on channel coding options, see the 802.11 format configuration object of interest.

Output Arguments

collapse all

Recovered information bits in the HE-Data field, returned as an 8-by-LPSDU column vector, where LPSDU is the PSDU length. You can determine the PSDU length by using the getPSDULength function.

Data Types: int8

More About

collapse all

HE-Data Field

The DE-Data field of the HE PPDU contains data for one or more users.

As described in IEEE®802.11ax™/D2.0, the number of OFDM symbols in the HE-Data field is determined by the length value of the legacy signal (L-SIG) field (see Equation (28-11)), the preamble duration and the settings of the GI+LTF Size, Pre-FEC Padding Factor, and PE Disambiguity fields in the HE-SIG-A field (see 28.3.10.7 (HE-SIG-A)).

  • Data symbols in an HE PPDU use a discrete Fourier transform (DFT) period of 12.8 μs and subcarrier spacing of 78.125 kHz.

  • Data symbols in an HE PPDU support guard interval durations of 0.8 μs, 1.6 μs, and 3.2 μs.

  • HE PPDUs have single stream pilots in tHE-Data field.

When BCC encoding is used, tHE-Data field consists of the SERVICE field, the PSDU, the pre-FEC PHY padding bits, the tail bits, and the post-FEC padding bits. Packet extension is assumed to be zero.

When LDPC encoding is used, tHE-Data field consists of the SERVICE field, the PSDU, the pre-FEC PHY padding bits, the post-FEC padding bits, and the packet extension. No tail bits are present when LDPC encoding is used.

For more information, see WLAN Packet Structure and Build HE PPDU.

References

[1] IEEE Std P802.11ax™/D2.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 6: Enhancements for High Efficiency WLAN.

Extended Capabilities

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

Introduced in R2018b