📄 alamoutiofdm.m
字号:
clear all;
clc;
%Initial Parameters
Num_Frame=1 ; %so Frame cua moi anten phat
Bc=20e9; %Bang thong kenh truyen
NFFT=64; %so kenh con trong he OFDM
numcarr=48; %so song mang mang du lieu OFDM
Ng=16; %so mau trong khoang Guard Interval
Ts=3.2e-6; %chu ky 1 tin hieu du lieu OFDM (us)
Tg=0.8e-6; %thoi gian bao ve Guard Interval GI (us)
Tf=Ts+Tg; %thoi gian tin hieu OFDM={chu ky 1 tin hieu du lieu OFDM + GI}
Num_TxAnt=2; %so anten phat
Num_RxAnt =1; %so anten thu
M=4; %M-ary Digital Modulator: BPSK, 4-QAM, 16-QAM, 64-QAM,...
Num_Slot=1; %so khe trong 1 Frame MIMO-OFDM theo tai lieu tham khao trong bai bao cua Alcatel
Num_Data_OFDM=1; %so tin hieu du lieu OFDM theo tai lieu tham khao trong bai bao cua Alcatel
Num_OFDM=2; %so tin hieu OFDM = {so tin hieu du lieu OFDM + 1 Preamble}
StartPoint=0; %thoi diem phat Slot OFDM thu nhat, thoi diem ke tiep t_next=Tf*Num_OFDM
%gia su kenh truyen k thay doi trong khoang thoi gian truyen di 1 Slot= ky tu OFDM
%tap hop nhom tin hieu dieu che de giai ma
if M==2
dh=[-1 1];
elseif M==4
dh=[1+j -1+j -1-j 1-j];
elseif M==16
dh=[1+j -1+j -1-j 1-j 3+j -3+j -3-j 3-j 3+j*3 -3+j*3 -3-j*3 3-j*3 1+j*3 -1+j*3 -1-j*3 1-j*3];
else
dh=[1+j -1+j -1-j 1-j 1+j*3 -1+j*3 -1-j*3 1-j*3 1+j*5 -1+j*5 -1-j*5 1-j*5 1+j*7 -1+j*7 -1-j*7 1-j*7 ...
3+j -3+j -3-j 3-j 3+j*3 -3+j*3 -3-j*3 3-j*3 3+j*5 -3+j*5 -3-j*5 3-j*5 3+j*7 -3+j*7 -3-j*7 3-j*7 ...
5+j -5+j -5-j 5-j 5+j*3 -5+j*3 -5-j*3 5-j*3 5+j*5 -5+j*5 -5-j*5 5-j*5 5+j*7 -5+j*7 -5-j*7 5-j*7 ...
7+j -7+j -7-j 7-j 7+j*3 -7+j*3 -7-j*3 7-j*3 7+j*5 -7+j*5 -7-j*5 7-j*5 7+j*7 -7+j*7 -7-j*7 7-j*7];
end
%Tao tin hieu Preamble (Training Sequence TS) cho cac anten phat
TS_A = 1; %TS Amplitude, bien do cua TS
Dst_TS=2; %Distance of TS, khoang cach chen TS trong mien thoi gian theo tai lieu tham khao cua Alcatel
%chuoi TS thiet ke theo tai lieu tham khao [18]
Min_int= floor(numcarr/(2*Num_TxAnt));
TS = [];
for TxAnt=1:Num_TxAnt
for m = 0:numcarr-1
if rem(m,2)==0
TS = [TS,TS_A*exp(j*2*pi*((m/2+TxAnt*Min_int)^2/numcarr))];
else
TS = [TS,0];
end
end
end
TS = reshape(TS,numcarr,Num_TxAnt);
%Tao TS cho cac anten khac nhau
TS_vector=[];
for TxAnt=1:Num_TxAnt
Temp1 = TS(:,TxAnt);
Temp1 = Temp1';
TS_vector = [TS_vector;Temp1];
end
clear TS Temp1 Temp2;
%du lieu TS_vector dang [TS1]1X48
% [TS2]1x48
% ...
% [TS..]1x48
%trong do so hang bang Num_TxAnt
if Num_TxAnt==2
col=2;
else
col=8;
end
Path_Gain = [0.6964 0.6207 0.2471 0.2202 0.1238 0.0696];
Path_Delay = [0 1 2 3 4 5] + 1;
ChannelProfile = 'ITU Vehicular A';
Num_Path = length( Path_Gain );
Max_Delay = max( Path_Delay );
Fc = 3e9;
v=3; %van toc cua user trong moi truong, don vi la km/h
Fd=v * Fc / 3e8 * 1000 / 3600; %Doppler Frequency
Phase = 2 * pi * rand( 1,Num_Path*Num_RxAnt *Num_TxAnt);
Ns=NFFT+Ng;
L_conv=Ns+Max_Delay-1;
Num_Block=1;
Num_bit=Num_TxAnt*Num_Data_OFDM*numcarr*log2(M)/col;
tot_err_vector=[];
In_Sym=[];
Out_Sym=[];
%Lap lai qua trinh nhu nhau doi voi gia tri khac nhau cua SNR
for SNR=1:5
tot_err_ml=0;
for Frame=1:Num_Frame
for Slot=1:Num_Slot
%Phia phat
Data_BeforeIFFT_vector=[];
data_pattern_vector=[];
%Phat chuoi du lieu ngau nhien nhi phan
bi_data=randint(1,Num_bit) ;
%Bit_Input=[Bit_input,bi_data]; %du lieu cac bit ngo vao dung cho tinh toan BER
%chuyen bit du lieu thanh dang M-ary QAM
[data_QAM,numQAM]=QAM(bi_data,M);
In_Sym=[In_Sym,data_QAM]; %Ky tu du lieu goc ban dau, dung cho viec tinh toan loi SER
%tao du lieu Alamouti
temp=reshape(data_QAM,Num_TxAnt,numQAM/Num_TxAnt);
code_data_vector=[];
for i=1:numQAM/Num_TxAnt
data=temp(:,i);
code_data=Alamouti(data,Num_TxAnt);
code_data_vector=[code_data_vector,code_data];
end
clear data code_data;
for TxAnt=1:Num_TxAnt
data_temp=code_data_vector(TxAnt,:);
data_temp=data_temp';
%prepare data that carry information
data_pattern=[];
for i=0:Num_Data_OFDM-1
infor_data=[];
for n=1:numcarr
infor_data=[infor_data,data_temp(i*numcarr+n)];
end
data_pattern=[data_pattern;infor_data];
clear infor_data;
end
data_pattern_vector=[data_pattern_vector,data_pattern];
clear data_temp infor_data data_pattern;
end
clear code_data_vector;
%du lieu data_pattern_vector dang []1X48 []1x48...[]1x48
% []1x48 []1x48...[]1x48
% ...
% []1x48 []1x48...[]1x48
%trong do so cot bang Num_TxAnt, so hang bang Num_Data_OFDM
%Insertion TS
Data_BeforeIFFT_vector=[];
for TxAnt=1:Num_TxAnt
data_temp=data_pattern_vector(:,(TxAnt-1)*numcarr+1:TxAnt*numcarr);
TS_temp=TS_vector(TxAnt,:);
Data_BeforeIFFT = Insert_Preamble(TS_temp,data_temp,Dst_TS,Num_OFDM);
Data_BeforeIFFT_vector=[Data_BeforeIFFT_vector,Data_BeforeIFFT];
end
clear data_temp Data_BeforeIFFT TS_temp data_pattern_vector;
%du lieu Data_BeforeIFFT_vector dang [TS1]1X48 [TS2]1x48...[TSAnt]1x48
% []1x48 []1x48 ...[]1x48
%
% ...
% []1x48 []1x48 ...[]1x48
%trong do so cot bang Num_TxAnt, so hang bang Num_OFDM
%OFDM modulator
transsig=[];
for TxAnt=1:Num_TxAnt
ts_frame=[];
data_temp=Data_BeforeIFFT_vector(:,(TxAnt-1)*numcarr+1:TxAnt*numcarr);
for i=1:Num_OFDM
OFDM_signal=OFDM_Modulator(data_temp(i,:),NFFT,Ng,numcarr);
ts_frame=[ts_frame,OFDM_signal];
clear OFDM_signal;
end
transsig=[transsig;ts_frame];
clear data_temp ts_frame;
end
clear Data_BeforeIFFT_vector;
%du lieu transsig dang [TS1]1X80 []1x80 []1x80...[]1x80
% [TS2]1x80 []1x80 []1x80...[]1x80
% [TS3]1x80 []1x80 []1x80...[]1x80
% ...
% [TS..]1x80 []1x80 []1x80...[]1x80
%trong do so hang bang Num_TxAnt, so cot bang Num_OFDM*(NFFT+Ng)
%Chuan IEEE 802.11 qui dinh
%NFFT=64
%Ng=16 (Samples)
%numcarr=48
%Channel
ChannelCoeff = MultiPathChannel(repmat(Path_Gain,1,Num_RxAnt*Num_TxAnt),Fd,Ts,Num_Block,StartPoint,Phase);
EbN0 = 10^( SNR / 10 );
Es = 1;
N0 = Es * Num_RxAnt / ( EbN0 * NFFT/Ns * log2(M) * Num_TxAnt );
Var = N0;
StartPoint = StartPoint + Num_OFDM*Tf;
%diem bat dau de phat he so tuong quan kenh moi, gia su kenh
%truyen thay doi trong moi Slot
ChannelOut = zeros( Num_RxAnt,Ns*Num_OFDM+Max_Delay-1 );
rs=0;
recsig=[];
h_real_vector=[];
for RxAnt = 1:Num_RxAnt
rs=0;
h_real_Tx=[];
for TxAnt = 1 : Num_TxAnt
h(Path_Delay,1:Num_Block) = ChannelCoeff((RxAnt-1)*Num_Path* Num_TxAnt +(TxAnt-1)*Num_Path+(1:Num_Path),:);
h_real=h(Path_Delay,1:Num_Block);
%H_real=sum(fft(h_real));
h_real_Tx=[h_real_Tx,h_real];
for i = 1 : Num_OFDM
Temp = ChannelOut(RxAnt,(i-1)*Ns+(1:L_conv));
ChannelOut(RxAnt,(i-1)*Ns+(1:L_conv))=Temp+conv(h_real,transsig(TxAnt,(i-1)*Ns +(1:Ns)));
end
rs=rs+ChannelOut;
clear h(Path_Delay,1:Num_Block) h_real;
end
h_real_vector=[h_real_vector;h_real_Tx];
recsig=[recsig;rs];
clear h_real_Tx rs;
end
clear transsig Temp;
%du lieu recsig dang []1X80 []1x80 []1x80...[]1x85
% []1x80 []1x80 []1x80...[]1x85
% []1x80 []1x80 []1x80...[]1x85
% ...
% []1x80 []1x80 []1x80...[]1x85
%trong do so hang bang Num_RxAnt, so cot bang Num_OFDM*Ns+Max_Delay-1
recsig = recsig + sqrt( Var ) * ( randn( size( recsig ) ) + sqrt( -1 ) * randn( size( recsig) ) ) / sqrt( 2 );
hh=[];
hh = [hh;ChannelCoeff];
recsig_post=recsig(:,1:Ns*Num_OFDM);
clear ChannelCoeff ChannelOut recsig;
%du lieu recsig_post dang []1X80 []1x80 []1x80...[]1x80
% []1x80 []1x80 []1x80...[]1x80
% []1x80 []1x80 []1x80...[]1x80
% ...
% []1x80 []1x80 []1x80...[]1x80
%trong do so hang bang Num_RxAnt, so cot bang Num_OFDM*Ns
%Phia thu
RecSig=[];
Dec_data_est_vector = [];
Dec_data_real_vector = [];
for OFDM_Sym=1:Num_OFDM
Temp_vector=[];
for RxAnt=1:Num_RxAnt
Temp=recsig_post(RxAnt,(OFDM_Sym-1)*Ns+1:OFDM_Sym*Ns);
Temp_vector=[Temp_vector;Temp];
end
%goi ham giai ma OFDM, function [Y]=OFDM_Demodulator(data,NFFT,Ng,numcarr,Nr);
Demodulated_signal=OFDM_Demodulator(Temp_vector,NFFT,Ng,numcarr,Num_RxAnt);
%Demodulated_signal co dang []1x48
% []1x48
% ...
% []1x48
%trong do so hang bang so Num_RxAnt
if rem((OFDM_Sym-1),Dst_TS)==0 %tim ma tran kenh truyen xap xi tai cac vi tri cua preamble
%goi ham xap xi kenh truyen
%[chan_coeff_est,h_est] = channel_est(data,TS_vector,numcarr,Nr,Nt,Num_Path)
[chan_coeff,h_est]=channel_est(Demodulated_signal,TS_vector,numcarr,Num_RxAnt,Num_TxAnt,Num_Path);
xap_xi_h_est=h_est
else %tai vi tri nay la cac ky tu OFDM du lieu, can giai ma Alamouti sau khi da tim duoc H_est
tin_hieu_DeOFDM=Demodulated_signal
%giai ma Alamouti, Dec_data =DeAlamouti(R_data,h_data,dh,M,numcarr,Nr,Nt,Num_Path)
Dec_data_real=DeAlamouti(Demodulated_signal,h_real_vector,dh,M,numcarr,Num_RxAnt,Num_TxAnt,Num_Path);
tin_hieu_DeAlamouti_h_real=Dec_data_real
%Dec_data_real=Dec_data_real';
Dec_data_real_vector = [Dec_data_real_vector;Dec_data_real];
Dec_data_est = DeAlamouti(Demodulated_signal,h_est,dh,M,numcarr,Num_RxAnt,Num_TxAnt,Num_Path);
tin_hieu_DeAlamouti_h_est=Dec_data_est
%Dec_data=Dec_data_est';
Dec_data_est_vector = [Dec_data_est_vector;Dec_data_est];
%Computing the errors
clear Dec_data_est;
end
clear Temp Temp_vector Demodulated_signal Dec_data_real Dec_data_est;
end
ty_so_SNR=SNR
tham_so_kenh_thuc=hh
tham_so_kenh_xapxi=chan_coeff
tin_hieu_QAM_vao=data_QAM
tin_hieu_giai_ma_Ala_thuc=Dec_data_real_vector
tin_hieu_giai_ma_Ala_xapxi=Dec_data_est_vector
err_ml = sum(data_QAM ~= Dec_data_est_vector);
tot_err_ml = err_ml + tot_err_ml;
tong_loi=tot_err_ml
Out_Sym=[Out_Sym,Dec_data_est_vector];
clear hh h_est Dec_data_vector Dec_data_real_vector;
end %doi vong lap Slot
clear RecSig;
end %doi voi vong lap Frame
tot_err_vector=[tot_err_vector,tot_err_ml];
clear err_ml tot_err_ml;
end %doi voi vong lap SNR
%data = [In_Sym;Out_Sym;hh;hh_est];
%save AlamoutiOFDM.am data -ascii;
%Ve duong BER
semilogy(SNR,tot_err_vector,'bo');
%axis(SNR,10^-6,10^0]);
grid on;
xlabel('SNR (dB)'); ylabel('SER')
clear In_Sym Out_Sym hh hh_est tot_err_vector;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -