Main Content


Perform fine CFO estimation



fOffset = wlanFineCFOEstimate(rxSig,cbw) performs fine carrier frequency offset (CFO) estimation on received time-domain L-LTF1 samples rxSig for channel bandwidth cbw. The function can estimate a maximum CFO of 156.25 kHz, or half of the subcarrier spacing.


fOffset = wlanFineCFOEstimate(rxSig,cbw,corrOffset) specifies the correlation offset as a fraction of the L-LTF cyclic prefix.


collapse all

Create non-HT configuration object.

nht = wlanNonHTConfig;

Generate a non-HT waveform.

txSig = wlanWaveformGenerator([1;0;0;1],nht);

Create a phase and frequency offset object and introduce a 2 Hz frequency offset.

pfOffset = comm.PhaseFrequencyOffset('SampleRate',20e6,'FrequencyOffset',2);
rxSig = pfOffset(txSig);

Extract the L-LTF and estimate the frequency offset.

ind = wlanFieldIndices(nht,'L-LTF');
rxlltf = rxSig(ind(1):ind(2),:);
freqOffsetEst = wlanFineCFOEstimate(rxlltf,'CBW20')
freqOffsetEst = 2.0000

Estimate the frequency offset for a VHT signal passing through a noisy, TGac channel. Correct for the frequency offset.

Create a VHT configuration object and create the L-LTF.

vht = wlanVHTConfig;
txltf = wlanLLTF(vht);

Set the sample rate to correspond to the default bandwidth of the VHT configuration object.

fs = 80e6;

Create TGac and thermal noise channel objects. Set the noise figure of the AWGN channel to 10 dB.

tgacChan = wlanTGacChannel('SampleRate',fs, ...
    'ChannelBandwidth',vht.ChannelBandwidth, ...

noise = comm.ThermalNoise('SampleRate',fs, ...
    'NoiseMethod','Noise figure', ...

Pass the L-LTF through the noisy TGac channel.

rxltfNoNoise = tgacChan(txltf);
rxltf = noise(rxltfNoNoise);

Create a phase and frequency offset object and introduce a 25 Hz frequency offset.

pfoffset = comm.PhaseFrequencyOffset('SampleRate',fs,'FrequencyOffsetSource','Input port');
rxltf = pfoffset(rxltf,25);

Perform a fine estimate the frequency offset using a correlation offset of 0.6. Your results may differ slightly.

fOffsetEst = wlanFineCFOEstimate(rxltf,vht.ChannelBandwidth,0.6)
fOffsetEst = 28.0773

Correct for the estimated frequency offset.

rxltfCorr = pfoffset(rxltf,-fOffsetEst);

Estimate the frequency offset of the corrected signal.

fOffsetEstCorr = wlanFineCFOEstimate(rxltfCorr,vht.ChannelBandwidth,0.6)
fOffsetEstCorr = 1.2514e-13

The corrected signal has negligible frequency offset.

Estimate and correct for a significant carrier frequency offset in two steps. Estimate the frequency offset after all corrections have been made.

Set the channel bandwidth and the corresponding sample rate.

cbw = 'CBW40';
fs = 40e6;

Coarse Frequency Correction

Generate an HT format configuration object.

cfg = wlanHTConfig('ChannelBandwidth',cbw);

Generate the transmit waveform.

txSig = wlanWaveformGenerator([1;0;0;1],cfg);

Create TGn and thermal noise channel objects. Set the noise figure of the receiver to 9 dB.

tgnChan = wlanTGnChannel('SampleRate',fs,'DelayProfile','Model-D', ...
    'LargeScaleFadingEffect','Pathloss and shadowing');
noise = comm.ThermalNoise('SampleRate',fs, ...
    'NoiseMethod','Noise figure', ...

Pass the waveform through the TGn channel and add noise.

rxSigNoNoise = tgnChan(txSig);
rxSig = noise(rxSigNoNoise);

Create a phase and frequency offset object to introduce a carrier frequency offset. Introduce a 2 kHz frequency offset.

pfOffset = comm.PhaseFrequencyOffset('SampleRate',fs,'FrequencyOffsetSource','Input port');
rxSig = pfOffset(rxSig,2e3);

Extract the L-STF signal for coarse frequency offset estimation.

istf = wlanFieldIndices(cfg,'L-STF');
rxstf = rxSig(istf(1):istf(2),:);

Perform a coarse estimate of the frequency offset. Your results may differ.

foffset1 = wlanCoarseCFOEstimate(rxstf,cbw)
foffset1 = 2.0221e+03

Correct for the estimated offset.

rxSigCorr1 = pfOffset(rxSig,-foffset1);

Fine Frequency Correction

Extract the L-LTF signal for fine offset estimation.

iltf = wlanFieldIndices(cfg,'L-LTF');
rxltf1 = rxSigCorr1(iltf(1):iltf(2),:);

Perform a fine estimate of the corrected signal.

foffset2 = wlanFineCFOEstimate(rxltf1,cbw)
foffset2 = -11.0795

The corrected signal offset is reduced from 2000 Hz to approximately 7 Hz.

Correct for the remaining offset.

rxSigCorr2 = pfOffset(rxSigCorr1,-foffset2);

Determine the frequency offset of the twice corrected signal.

rxltf2 = rxSigCorr2(iltf(1):iltf(2),:);
deltaFreq = wlanFineCFOEstimate(rxltf2,cbw)
deltaFreq = -2.0374e-11

The CFO is zero.

Input Arguments

collapse all

Received L-LTF samples, specified as a complex-valued matrix of size NS-by-NR. NS is the number of samples in the L-LTF and NR is the number of receive antennas.


If the number of samples in this input is greater than the number of samples in the L-LTF, the function estimates the CFO by using only the first NS samples.

Data Types: single | double
Complex Number Support: Yes

Channel bandwidth, specified as one of these values.

  • 'CBW5' – Channel bandwidth of 5 MHz

  • 'CBW10' – Channel bandwidth of 10 MHz

  • 'CBW20' – Channel bandwidth of 20 MHz

  • 'CBW40' – Channel bandwidth of 40 MHz

  • 'CBW80' – Channel bandwidth of 80 MHz

  • 'CBW160' – Channel bandwidth of 160 MHz

  • 'CBW320' – Channel bandwidth of 320 MHz

Data Types: char | string

Correlation offset as a fraction of the L-LTF cyclic prefix, specified as a scalar in the interval [0, 1]. The duration of the long training symbol varies with bandwidth. For more information, see L-LTF.

Data Types: single | double

Output Arguments

collapse all

Frequency offset, in Hz, returned as a real-valued scalar. The function can estimate a maximum CFO of 156.25 kHz, or half of the subcarrier spacing.

Data Types: double

More About

collapse all


The legacy long training field (L-LTF) is the second field in the 802.11™ OFDM PLCP legacy preamble. The L-LTF is a component of VHT, HT, and non-HT PPDUs.

Channel estimation, fine frequency offset estimation, and fine symbol timing offset estimation rely on the L-LTF.

The L-LTF is composed of a cyclic prefix (CP) followed by two identical long training symbols (C1 and C2). The CP consists of the second half of the long training symbol.

The L-LTF duration varies with channel bandwidth.

Channel Bandwidth (MHz)Subcarrier Frequency Spacing, ΔF (kHz)Fast Fourier Transform (FFT) Period (TFFT = 1 / ΔF)Cyclic Prefix or Training Symbol Guard Interval (GI2) Duration (TGI2 = TFFT / 2)L-LTF Duration (TLONG = TGI2 + 2 × TFFT)
20, 40, 80, 160, and 320312.53.2 μs1.6 μs8 μs
10156.256.4 μs3.2 μs16 μs
578.12512.8 μs6.4 μs32 μs


[1] IEEE Std 802.11™-2016 (Revision of IEEE Std 802.11-2012). “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] Li, Jian. “Carrier Frequency Offset Estimation for OFDM-Based WLANs.” IEEE Signal Processing Letters. Vol. 8, Issue 3, Mar 2001, pp. 80–82.

[3] Moose, P. H. “A technique for orthogonal frequency division multiplexing frequency offset correction.” IEEE Transactions on Communications. Vol. 42, Issue 10, Oct 1994, pp. 2908–2914.

[4] 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

1 IEEE® Std 802.11-2012 Adapted and reprinted with permission from IEEE. Copyright IEEE 2012. All rights reserved.