OFDM preamble generation in MATLAB used for WLAN,WiMAX,LDACS
This page covers OFDM preamble generation as per wimax system. The same concept is employed to generate preamble used in WLAN and LDACS based OFDM systems.
As we know, fixed pattern referred as preamble is used for time, frequency and channel synchronization in many of the wireless systems such as WLAN, WiMAX, LTE etc. In this page we will see how this preamble is generated using the equations provided in the IEEE standards such as 802.11, 802.16 etc.
STEP1: First preamble synchronization sequences are generated for both the symbols in the frequency domain as per equation given in the standard. Following are the equations for symbol-1 and symbol-2 of the preamble as per fixed wimax system. This is used for OFDM based system. wimax uses 256 point OFDM symbol.
The downlink long preamble in wimax consists of two consecutive OFDM symbols. Symbol1 has four times 64 sequence. Symbol2 has 2 times 128 sequence. In the frequency domain, these symbols are represented by P4x64 (k) and PEVEN (k) as per equation mentioned in the figure-1. Both of these preamble symbols are derived from a sequence PALL (k) of the form as mentioned in the same figure. Complete PALL sequence for full bandwidth is mentioned in IEEE 802.16-2004 OFDM physical layer specifications.
STEP2: After 256 Point IFFT is done for frequency domain vector of symbol1 and symbol2 as generated using above two equations in step1. Arrange the frequency domain values as per IFFT structure shown below. Using this IFFT obtain the time domain vector of both the symbols of the preamble.
STEP3: Now add cyclic prefix for both the symbols as shown in the figure below. This provides time domain preamble with cp for both the symbols i.e. symbol1 and symbol2. Symbol1 is referred as short preamble and symbol2 is referred as long preamble. Cyclic prefix is added to avoid the delay spread of the channel.
clear all;
close all;
%%%Preamble in frequency domain as provided in the wimax standard
%%%These are frequency domain 201 values in the order of 100 negative halves, DC and 100 positive
%%%halves
%%%STEP1 Pall= [1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i ...
-1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i ...
1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i ...
1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i ...
1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i ...
1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i ...
-1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i ...
-1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i ...
1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i ...
-1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i ...
1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i ...
-1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i ...
-1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i ...
1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i ...
-1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i ...
1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i ...
-1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 0.0000 + 0.0000i -1.0000 - 1.0000i ...
1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i ...
1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i ...
-1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i ...
-1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 + 1.0000i ...
1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i ...
-1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i ...
-1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i ...
1.0000 - 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i ...
-1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i ...
1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i ...
1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 + 1.0000i ...
1.0000 + 1.0000i -1.0000 - 1.0000i 1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i ...
-1.0000 + 1.0000i 0.0000 + 0.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 - 1.0000i ...
-1.0000 - 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i 1.0000 - 1.0000i ...
-1.0000 + 1.0000i -1.0000 + 1.0000i -1.0000 + 1.0000i 1.0000 - 1.0000i -1.0000 + 1.0000i 1.0000 + 1.0000i ...
1.0000 + 1.0000i 1.0000 + 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i -1.0000 - 1.0000i ...
1.0000 + 1.0000i 1.0000 - 1.0000i 1.0000 - 1.0000i]
for k=1:201
c=mod(k,4)
if c==1
S1(k)=2*conj(Pall(k));
end
S1(k+1)=0;
end
for k=1:201
c=mod(k,2)
if c==1
S2(k)= sqrt(2)*(Pall(k));
end
S2(k+1)=0;
end
%%STEP2 Arranging the preamble symbol1 and symbol2 as per 256 IFFT structure and taking IFFT S1=[0,S1(102:201),zeros(1,28),zeros(1,27),S1(1:100)];
S2=[0,S2(102:201),zeros(1,28),zeros(1,27),S2(1:100)];
S1_td=ifft(S1,256);
S2_td=ifft(S2,256);
%%STEP3 Adding CP to the time domain preamble symbol1 and symbol2 CP=64;
S1_tdcp1=[S1_td(end-CP+1:end) S1_td];
S2_tdcp1=[S2_td(end-CP+1:end) S2_td];
preamble = [S1_tdcp1 S2_tdcp1];
x1=corr(S1_tdcp1,S1_tdcp1);
x2=corr(S2_tdcp1,S2_tdcp1);
%%%Correlation of symbol1 with itself will have four peaks figure;plot(abs(x1));title('short preamble spectrum');
%%%Correlation of symbol2 with itself will have two peaks figure;plot(abs(x2));title('long preamble spectrum');
save file_wimax_preamble S1_tdcp1 S2_tdcp1;
Figure mentions LDACS preamble equations used to generate LDACS compliant preamble in the frequency domain. After this the same is arranged and converted to time domain preamble using IFFT. Later CP is added to take care of delay spread of the channel.
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