Frequency offset estimation for OFDM in MATLAB
This page of MATLAB source code covers frequency offset estimation and correction used in a OFDM based system receiver. The concept is employed in wireless technologies such as WLAN, WiMAX, LDACS etc.
Frequency synchronization module enables the receiver to overcome frequency offsets induced due to transmitter and receiver clock variations, drifts etc. On this page we will see frequency offset estimation using reference data i.e. preamble.
• Extract the first symbol of preamble from the received packet. (excluding CP)
• Multiply first 128 samples with complex conjugate of next 128 samples of the first symbol preamble.
• Estimate angle of above 128 multiplications.
• Take average of the angle vector
• Divide average value by 2*pi.
• Multiply result with 4 as frequency bins are spaced at every 4th place.
• This will give frequency offset.
• Note: Frequency offset estimation using symbol2 can also be done in the similar manner
explained above. Multiply result with 2 as frequency bins are spaced at every second place in the second symbol preamble.
close all;
clear all;
CP=64;
load file_wimaxtxpkt;
load file_wimax_preamble;
Tx_Packet=awgn(Tx_Packet,40,'measured');
%%%%Introducing frequency offset%%%%%%%%%%%%
CFO = 40e3; % Hz Here 40KHz frequency offset
CFO = (CFO)/20e6;
rx_data_fo = impairments(Tx_Packet,CFO);
%Frequency offset estimation using first symbol preamble in time domain
sh_dat = rx_data_fo((CP+1):256+CP);
for m=0:128
theta(m+1) = angle(sh_dat(65+m:128+m)*sh_dat(1+m:64+m)')/(2*pi);
end
theta = mean(theta);
f_off1 = (theta*4)*20e6/256
%Frequency offset estimation using second symbol preamble in time domain
lo_dat = rx_data_fo((2*CP+256+1):256+2*CP+256);
theta = angle(lo_dat(129:256)*lo_dat(1:128)')/(2*pi);
f_off2 = (theta*2)*20e6/256
f_off=(f_off1+f_off2)/2 % average of both above symbol based estimation.
%%%%%%%%%Frequency offset correction%%%%%%%%
rx_data_corrected = rx_data_fo.*exp(-i*2*pi*(f_off/20e6)*(0:length(rx_data_fo)-1));
Frequency offset correction
For Frequency offset correction utilize the frequency offset estimated above and multiply the received symbols using
exponential function as mentioned below.
y(n)= y'(n).exp(-i2π α n/N )
where n is sample index and N is no. of samples in a
symbol, y(n) and y'(n) are the received samples without and with frequency offset and
α is the frequency offset estimated (f_off or f_off1 or f_off2) using above algorithms.
DOWNLOAD MAT FILES
Download MAT and other supporting files.
Useful Links to MATLAB codes
Refer following as well as links mentioned on left side panel for useful MATLAB codes.
OFDM Preamble generation
Time off estimation corr
Freq off estimation corr
channel estimation
11a WLAN channel
PN sequence generation
OFDMA Tx Rx
AES DES
carrier aggregation
CCDF
FIR Filter
IIR Filter
Low Pass FIR
Viterbi decoder
CRC8 CRC32
RF and Wireless tutorials
WLAN 802.11ac 802.11ad wimax Zigbee z-wave GSM LTE UMTS Bluetooth UWB IoT satellite Antenna RADAR