Main Content


Channel estimation using VHT-LTF



chEst = wlanVHTLTFChannelEstimate(demodSig,cfg) returns the channel estimate, using the demodulated VHT-LTF1 signal, demodSig, given the parameters specified in wlanVHTConfig object cfg.


chEst = wlanVHTLTFChannelEstimate(demodSig,cbw,numSTS) returns the channel estimate for the specified channel bandwidth, cbw, and the number of space-time streams, numSTS.

[chEst,chEstPilots] = wlanVHTLTFChannelEstimate(___) returns the channel estimate at each pilot subcarrier location for each demodulated VHT-LTF symbol in addition to any input argument combination from the previous syntaxes. The function assumes that there is one space-time stream at the transmitter.


chEst = wlanVHTLTFChannelEstimate(___,span) specifies the span of a moving-average filter used to perform frequency smoothing in addition to any argument combination from the previous syntaxes.


collapse all

Display the channel estimate of the data and pilot subcarriers for a VHT format channel using its long training field.

Create a VHT format configuration object. Generate a VHT-LTF based on cfg.

cfg = wlanVHTConfig;
txSig = wlanVHTLTF(cfg);

Multiply the transmitted VHT-LTF signal by 0.3 – 0.15i and pass it through an AWGN channel having a 30 dB signal-to-noise ratio. Demodulate the received signal.

rxSig = awgn(txSig*(0.3-0.15i),30);
demodSig = wlanVHTLTFDemodulate(rxSig,cfg);

Estimate the channel response using the demodulated VHT-LTF signal.

est = wlanVHTLTFChannelEstimate(demodSig,cfg);

Plot the channel estimate.


The channel estimate matches the complex channel multiplier.

Estimate and display the channel coefficients of a 4x2 MIMO channel using the VHT-LTF.

Create a VHT format configuration object for a channel having four spatial streams and four transmit antennas. Transmit a complete VHT waveform.

cfg = wlanVHTConfig('NumTransmitAntennas',4, ...
txWaveform = wlanWaveformGenerator([1;0;0;1;1;0],cfg);

Set the sampling rate, and then pass the transmitted waveform through a 4x2 TGac channel.

fs = 80e6;
tgacChan = wlanTGacChannel('SampleRate',fs, ...
rxWaveform = tgacChan(txWaveform);

Determine the VHT-LTF field indices and demodulate the VHT-LTF from the received waveform.

indVHTLTF = wlanFieldIndices(cfg,'VHT-LTF');
ltfDemodSig = wlanVHTLTFDemodulate(rxWaveform(indVHTLTF(1):indVHTLTF(2),:),cfg);

Generate the channel estimate by using the demodulated VHT-LTF signal. Specify a smoothing filter span of five subcarriers.

[est,estPilots] = wlanVHTLTFChannelEstimate(ltfDemodSig,cfg,5);

Plot the magnitude response of the first space-time stream for both receive antennas. Due to the random nature of the fading channel, your results may vary.

hold on
legend('Receive Antenna 1','Receive Antenna 2')

Recover bits from the VHT-Data field of a VHT multi-user transmission recovered from a fading MU-MIMO channel by using channel estimation on the VHT-LTF.

This example can return high bit error rates because the transmission does not include precoding to mitigate the interference between space-time streams. However, the example shows a typical VHT signal recovery workflow and appropriate syntax use for the functions.

Configure a VHT transmission with a channel bandwidth of 160 MHz, two users, and four transmit antennas. Assign one space-time stream to the first user and three space-time streams to the second user.

cbw = 'CBW160';
numSTS = [1 3];
cfgVHT = wlanVHTConfig('ChannelBandwidth',cbw,'NumUsers',2, ...

Generate a payload of bits for each user. This payload must be in a 1-by-N cell array, where N is the number of users.

psduLength = 8*cfgVHT.PSDULength;
numUsers = cfgVHT.NumUsers;
bits = cell(1,2);
for nu = 1:numUsers
    bits{nu} = randi([0 1],psduLength(nu),1);

Generate VHT-LTF and VHT-Data field signals.

txLTF  = wlanVHTLTF(cfgVHT); 
txDataSym = wlanVHTData(bits,cfgVHT);

Pass the VHT-Data field signal for the first user through a 4x1 channel because this signal consists of a single space-time stream. Pass the VHT-Data field for the second user through a 4x3 channel because this signal consists of three space-time streams. Apply AWGN to each signal, assuming an SNR of 15 dB.

snr = 15; 
H{1} = complex(randn(4,1),randn(4,1))/sqrt(2);
H{2} = complex(randn(4,3),randn(4,3))/sqrt(2);
number = zeros(2,1);
ratio = zeros(2,1);
for userIdx = 1:numUsers
    rxDataSym = awgn(txDataSym*H{userIdx},snr,'measured');

Apply the same channel processing to the VHT-LTF for each user.

    rxLTF = awgn(txLTF*H{userIdx},snr,'measured');

Calculate the received signal power for each user and estimate the noise variance.

    powerDB = 10*log10(var(rxDataSym));
    noiseVarEst = mean(10.^(0.1*(powerDB-snr)));

Estimate the channel characteristics by using the VHT-LTF.

    demod = wlanVHTLTFDemodulate(rxLTF,cbw,numSTS);
    chEst = wlanVHTLTFChannelEstimate(demod,cbw,numSTS);

Recover the bits from the received VHT-Data field for each user and determine the bit error rate by comparing the recovered bits with the original payload bits.

    dataBits = wlanVHTDataRecover(rxDataSym,chEst,noiseVarEst,cfgVHT,userIdx);
    [number(userIdx),ratio(userIdx)] = biterr(bits{userIdx},dataBits);

Input Arguments

collapse all

Demodulated VHT-LTF signal, specified as an NST-by-NSYM-by-NR array. NST is the number of occupied subcarriers, NSYM is the number of VHT-LTF OFDM symbols, and NR is the number of receive antennas.

Data Types: single | double
Complex Number Support: Yes

Format configuration, specified as a wlanVHTConfig object.

Channel bandwidth, specified as 'CBW20', 'CBW40', 'CBW80', or 'CBW160'. If the transmission has multiple users, the same channel bandwidth applies to all users.

Data Types: char | string

Number of space-time streams in the transmission, specified as a scalar or vector.

  • For a single user, the number of space-time streams is a scalar integer from 1 to 8.

  • For multiple users, the number of space-time streams is a 1-by-NUsers vector of integers from 1 to 4, where the vector length, NUsers, is an integer from 1 to 4.

Example: [1 3 2] indicates that one space-time stream is assigned to user 1, three space-time streams are assigned to user 2, and two space-time streams are assigned to user 3.


The sum of the space-time stream vector elements must not exceed eight.

Data Types: single | double

Filter span of the frequency smoothing filter, specified as a positive odd integer and expressed as a number of subcarriers. The function applies frequency smoothing only when span is greater than one. See Frequency Smoothing.

Data Types: single | double

Output Arguments

collapse all

Channel estimate between all combinations of space-time streams and receive antennas, returned as an NST-by-NSTS,total-by-NR array. NST is the number of occupied subcarriers. NSTS,total is the total number of space-time streams for all users. For the single-user case, NSTS,total = NSTS. NR is the number of receive antennas. The channel estimate includes coefficients for both the data and pilot subcarriers.

Data Types: single | double
Complex Number Support: Yes

Channel estimate at each pilot subcarrier location for each VHT-LTF symbol, returned as an NSP-by-NSYM-by-NR array. NSP is the number of pilot subcarriers, NSYM is the number of demodulated VHT-LTF symbols, and NR is the number of receive antennas. The function performs this estimate assuming one space-time stream at the transmitter.

Data Types: single | double
Complex Number Support: Yes

More About

collapse all


The very high throughput long training field (VHT-LTF) is between the VHT-STF and VHT-SIG-B portion of the VHT packet.

The VHT-LTF in the VHT packet

It is used for MIMO channel estimation and pilot subcarrier tracking. The VHT-LTF includes one VHT long training symbol for each spatial stream indicated by the selected modulation and coding scheme (MCS). Each symbol is 4 μs long. A maximum of eight symbols are permitted in the VHT-LTF.

For a detailed description of the VHT-LTF, see Section of IEEE® Std 802.11™-2016.

Frequency Smoothing

Frequency smoothing can improve channel estimation by averaging out noise.

Frequency smoothing is recommended only for cases in which you are using a single transmit antenna. Frequency smoothing consists of applying a moving-average filter that spans multiple adjacent subcarriers. Channel conditions dictate whether frequency smoothing is beneficial.

  • If adjacent subcarriers are highly correlated, frequency smoothing results in significant noise reduction.

  • In a highly frequency-selective channel, smoothing can degrade the quality of the channel estimate.


[1] IEEE Std 802.11-2020 (Revision of IEEE Std 802.11-2016). “Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications.” IEEE Standard for Information Technology — Telecommunications and Information Exchange between Systems — Local and Metropolitan Area Networks — Specific Requirements.

[2] IEEE Std 802.11™-2012 IEEE 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.

[3] Perahia, E., and R. Stacey. Next Generation Wireless LANs: 802.11n and 802.11ac. 2nd Edition, United Kingdom: Cambridge University Press, 2013.

Extended Capabilities

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

Version History

Introduced in R2015b

expand all

1 IEEE Std 802.11ac™-2013 Adapted and reprinted with permission from IEEE. Copyright IEEE 2013. All rights reserved.