Main Content

wlanEHTTrackPilotError

Track errors using pilot subcarriers of EHT waveform

Since R2023a

Description

[y,cpe,ae] = wlanEHTTrackPilotError(x,chanEst,cfg,field) tracks errors using the pilot subcarriers of an extremely high-throughput (EHT) waveform. The function tracks errors using OFDM symbols x of the field specified in field and channel estimate chanEst. The function returns the pilot-error-tracked symbols y, common phase error cpe, and amplitude error ae.

example

[y,cpe,ae] = wlanEHTTrackPilotError(x,chanEst,cfg,field,ruNumber) also specifies the resource unit (RU) number. This syntax is required to track errors in the EHT-LTF or EHT-Data fields of EHT multi-user (EHT MU) waveforms when the PPDU type is OFDMA.

example

[y,cpe,ae] = wlanEHTTrackPilotError(___,Name=Value) specifies options using one or more name-value arguments in addition to either input argument combination from the previous syntaxes.

example

Examples

collapse all

Create a non-OFDMA EHT MU configuration object with a channel bandwidth of 80 MHz.

cfg = wlanEHTMUConfig("CBW80");

Extract the channel bandwidth of the configuration.

cbw = cfg.ChannelBandwidth;

Generate a time-domain waveform for the configuration. Extract the number of time-domain samples.

tx = wlanWaveformGenerator([1;0;0;1],cfg);
numSample = size(tx,1);

Generate field indices for the configuration.

ind = wlanFieldIndices(cfg);

Model a step power amplifier droop impairment by applying a step gain change at the start of the L-SIG field.

droopGain = 1;
droopGainLinear = db2mag(droopGain);
droopLength = double(ind.LSIG(1));

Apply a magnitude droop gain per time-domain sample.

droopPerSample = ones(numSample,1);
droopPerSample(1:droopLength,:) = ...
    droopGainLinear*droopPerSample(1:droopLength,:);
rx=droopPerSample.*tx;

Perform channel estimation at the L-LTF.

rxLLTF = rx(ind.LLTF(1):ind.LLTF(2),:);
lltfDemod = wlanEHTDemodulate(rxLLTF,"L-LTF",cfg);
lltfChanEst = wlanLLTFChannelEstimate(lltfDemod,cbw);

Demodulate the L-SIG field.

rxLSIG = rx(ind.LSIG(1):ind.LSIG(2),:);
lsigDemod = wlanEHTDemodulate(rxLSIG,"L-SIG",cfg);

Track pilot errors using the L-SIG field. Display the errors.

[lsigDemod,cpe,ae] = wlanEHTTrackPilotError(lsigDemod, ...
   lltfChanEst,cfg,"L-SIG",TrackAmplitude=true);
disp([cpe,ae])
    0.0000   -1.0000

Create an OFDMA EHT MU configuration object. Set the allocation index to 0. This setting specifies nine 26-tone RUs, each with one user, in a 20 MHz channel.

cfg = wlanEHTMUConfig(0);
chanBW = cfg.ChannelBandwidth;

Generate the WLAN field indices.

ind = wlanFieldIndices(cfg);

Generate a time-domain waveform for the configuration and pass it through an AWGN channel with a signal-to-noise ratio of 20 dB.

tx = wlanWaveformGenerator([1;0;0;1],cfg);
snr = 20;
rxAWGN = awgn(tx,snr);

Specify the RU of interest. Extract the part of the received waveform that corresponds to the EHT-LTF. Demodulate it and estimate the channel at the RU of interest.

ruNumber = 2;
rxEHTLTF = rxAWGN(ind.EHTLTF(1):ind.EHTLTF(2),:);
demodEHTLTF = wlanEHTDemodulate(rxEHTLTF,"EHT-LTF",cfg,ruNumber);
chanEst = wlanEHTLTFChannelEstimate(demodEHTLTF,cfg,ruNumber);

Extract the part of the received waveform that corresponds to the EHT-Data field. Demodulate it and track pilot phase errors for the RU of interest, using the channel estimate at the EHT-LTF.

rxData = rxAWGN(ind.EHTData(1):ind.EHTData(2),:);
demodData = wlanEHTDemodulate(rxData,"EHT-Data",cfg,ruNumber);
[demodData,cpe] = wlanEHTTrackPilotError(demodData,chanEst,cfg,"EHT-Data",ruNumber);

Display the phase error averaged over all OFDM symbols in the EHT-Data field.

disp(mean(cpe))
    0.0234

Input Arguments

collapse all

Received OFDM symbols, specified as a complex-valued array of size Nst-by-Nsym-by-Nr.

  • Nst is the number of active subcarriers, which comprises data and pilot subcarriers.

  • Nsym is the number of OFDM symbols.

  • Nr is the number of receive antennas.

Data Types: single | double
Complex Number Support: Yes

Channel estimates at the data and pilot subcarriers or channel estimates at the pilot subcarriers only, specified as a complex-valued array of size Nst-by-Nsts-by-Nr or Nsp-by-Nsts-by-Nr, respectively.

  • Nst is the number of occupied subcarriers.

  • Nsts is the number of space-time streams.

  • Nr is the number of receive antennas.

  • Nsp is the number of pilot subcarriers.

Data Types: single | double
Complex Number Support: Yes

EHT transmission parameters, specified as a wlanEHTMUConfig or wlanEHTRecoveryConfig object.

Field of received OFDM symbols, specified as one of these values:

  • "L-SIG" — Legacy signal field

  • "RL-SIG" — Repeated legacy signal field

  • "U-SIG" — Universal signal field

  • "EHT-SIG" — EHT signal field

  • "EHT-LTF" — EHT long training field

  • "EHT-Data" — EHT-Data field

Data Types: char | string

Number of the RU or MRU of interest, specified as a positive integer. This input specifies the location of the RU or MRU in the channel. For example, consider a 20 MHz transmission with one 106+26-tone RU, one 52+26-tone MRU, and one 26-tone RU, in order of absolute frequency. For this allocation:

  • RU 1 corresponds to the 106+26-tone MRU at the lowest absolute frequency (size 106+26, index 1).

  • RU 2 corresponds to the 52+26-tone MRU at the next lowest absolute frequency (size 52+26, index 2).

  • RU 3 corresponds to the 26-tone RU at the highest absolute frequency (size 26, index 3).

Note

The function requires this input only when both of these conditions are satisfied:

  • the cfg input is an OFDMA-type wlanEHTMUConfig object.

  • the field input is "EHT-Data" or "EHT-LTF".

Data Types: double

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: TrackAmplitude=true enables pilot amplitude tracking.

Enable pilot phase tracking, specified as a numeric or logical 1 (true) or 0 (false). To estimate and correct a common phase offset across all subcarriers and receive antennas, set this property to 1 (true). Otherwise, set this property to 0 (false).

Data Types: logical

Enable pilot amplitude tracking, specified as a numeric or logical 1 (true) or 0 (false). To estimate and correct an average amplitude error across all subcarriers for each OFDM symbol and receive antenna, set this property to 1 (true). Otherwise, set this property to 0 (false).

Note

Due to the limitations of the pilot amplitude tracking algorithm, when filtering a waveform through a MIMO fading channel, disable the TrackAmplitude option.

Data Types: logical

Output Arguments

collapse all

Pilot-error-tracked OFDM symbols, returned as a complex-valued array of size Nst-by-Nsym-by-Nr.

  • Nst is the number of occupied subcarriers.

  • Nsym is the number of OFDM symbols.

  • Nr is the number of receive antennas.

Data Types: single | double
Complex Number Support: Yes

Common phase error, in radians, averaged over all receive antennas, returned as a real-valued row vector of length equal to the number of OFDM symbols. Each element of this vector contains the common phase error for the corresponding OFDM symbol.

Data Types: single | double

Average amplitude error, in dB, returned as a real-valued matrix of size Nsym-by-Nr.

  • Nsym is the number of OFDM symbols.

  • Nr is the number of receive antennas.

Each element of this matrix contains the amplitude error for all subcarriers with respect to the estimated received pilots for the corresponding OFDM symbol and receive antenna.

Data Types: single | double

Extended Capabilities

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

Version History

Introduced in R2023a

expand all