α − Việc làm này mục đích đồng pha các tín hiệu Như vậy biên độ tín
4.5 Kiểm tra tính hội tụ của số lượng ăng ten
Số gói tin đã truyền đi n = 800.
Số ăng ten thu được sử dụng N_rx= 2, 4, 9, 10, 11. Mức điều chế QAM: M =64 .
Hình 4.11 Kết quả mô phỏng với số lượng ăng ten khác nhau
Nhận xét:
Với N_rx=4, thì BER nhỏ hơn N_rx=2. Khi tăng N_rx=9 thì thì BER giảm một cách đáng kể so với N_rx=2. Tiếp tục tăng N_rx: N_rx=10, 11 thì ta nhận thấy BER giảm không đột ngột nữa. Dường như hai đường này xấp xỉ nhau.
Như vậy không phải cứ tăng số lượng anten lên là cải thiện được BER của hệ thống. Ở một số lượng anten xác định nào đó thì BER khơng tăng nữa.
4.6 Kết luận
Trong chương cuối cùng này, đã mô phỏng các kỹ thuật phân tập thu trong hệ thống OFDM bằng chương trình matlab. Kết quả mô phỏng gần như chứng minh sự khác nhau trong hiệu quả của các kỹ thuật phân tập thu trong hệ thống OFDM đã được trình bày ở chương trước. Các kỹ thuật này đã cải thiện đáng kể BER của hệ thống, giải quyết được multipath fading. Đặt biệt MRC, kỹ thuật này rất hiệu quả nhất.
Qua đề tài này cho ta thấy được hiệu quả của việc áp dụng phân tập thu đã khắc phục được nhược điểm nhiễu fading đa đường nên cải thiện đáng kể chất lượng kênh truyền, nâng cao dung lượng hệ thống và kỹ thuật ghép kênh phân chia theo tần số trực giao – OFDM là một kỹ thuật hiện đại với nhiều ưu điểm nổi bật. Chúng ta có thể hướng đến những tài liệu liên quan đến cơng nghệ OFDM đó là:
- Những kỹ thuật OFDM nâng cao: VOFDM (Vector OFDM), COFDM (Code OFDM), WOFDM (Wideband OFDM), OFDMA (OFDM Access)
- Kết hợp OFDM với những công nghệ khác như CDMA nhằm phục vụ đa truy cập của mạng.
- Ứng dụng OFDM trong WLAN, Wimax, LTE, ứng dụng điện thoại di động trong truyền hình số mặt đất DVB-T.
[1] PGS.TS Nguyễn Văn Đức “Lý thuyết và các ứng dụng của kỹ thuật OFDM”, Nhà xuất bản khoa học và kỹ thuật Hà Nội, năm 2006.
[2] TS. Phan Hồng Phương, KS. Lâm Chi Thương, “Kỹ thuật phân tập anten trong cải thiện dung lượng hệ thống MIMO.
[3] TS. Nguyễn Lê Hùng, “Bài giảng thông tin di động” năm 2011.
[4] Andrea Goldsmith, “Wireless communications”, copyright 2005 by Cambridge University Press.
% Đoạn chương trình mơ phỏng tồn bộ hệ thống
% Diversity
clear all; close all;
N_packet = 2000 % number of simulation packets
for d=1:1:4
N_rx=3;
N_tx = 1; % So ang ten phat =1
M_QAM =32; % Muc dieu che M-QAM SNR = [1:1:18]; N_data_sym =21; %============== OFDM settings-------------- L = 5; % So resolvable multipaths < N_cp N_fft =128; N_cp = 10; SigPow = N_tx*1; Ns = N_fft + N_cp; PDP = exp(-(0:L-1)/4)/sum( exp(-(0:L-1)/4) ); %---------------------------- subcarr_len = log2(M_QAM); BER = zeros(1,length(SNR)); tic
for SNR_index = 1:length(SNR)
No = SigPow/(10^(SNR(SNR_index)/10)); for packet = 1:N_packet
disp(['SNR=', num2str(SNR(SNR_index)), ';Packet=', num2str(packet)]); if d==0 N_rx=1; end [tx_data_sig,data_bit_seq,data_sym] = Tx_data_signal_generator_Diversity(subcarr_len,N_fft,N_data_sym,L); h = zeros(L,N_tx,N_rx); for rx_anten = 1:N_rx
h(:,1,rx_anten) = sqrt(PDP.'/2).*( randn(L,1) + 1j*randn(L,1) ); end
[rx_sig,FD_rx_sig] = Rx_Sig_Generator(N_tx,N_rx,L,N_fft,No,h,tx_data_sig); [reco_bits, reco_sym] = Diversity( h, FD_rx_sig, subcarr_len, N_fft, N_data_sym, N_rx, L, d );
BER(SNR_index) = BER(SNR_index) + sum( abs(data_bit_seq - reco_bits) ); end end BER = BER/(N_packet*subcarr_len*N_fft*N_data_sym); switch(d) case 1 figure(1)
case 2 semilogy(SNR,BER,'b*:','LineWidth',2); hold on; case 3 semilogy(SNR,BER,'yx-','LineWidth',2); hold on; case 4 semilogy(SNR,BER,'k-->','LineWidth',2); hold on; otherwise end xlabel('SNR (dB)');
ylabel('Bit error rate (BER)'); legend( 'MRC Bloc-fading',... 'EGC Block-fading' ,... 'SC Block-fading',... 'TC Block-fading'); end
% Đoạn chương trình mơ tả khối tạo thơng sơ kênh truyền và khối các kỹ thuật phân tập thu MRC, SC, TC, EGC cũng như khơng có phân tập.
function [ reco_bits, reco_sym ] = Diversity( h, FD_rx_sig, subcarr_len, N_fft,
N_data_sym, N_rx, L, d ) N_tx=1; H = zeros(N_fft, 1, N_rx); for rx = 1:N_rx for k = 1:N_fft H(k, 1, rx) = exp(-2j*pi*(k-1)*[0:L-1]/N_fft)*h(:,1,rx); end end reco_bits = zeros(1,subcarr_len*N_fft*N_data_sym); for sym = 1:N_data_sym
reco_sym = zeros(N_fft,1);
for i =1:N_fft %go through all subcarrier y=0;
t=0;
if d == 1
%Maximal Ratial Combining for rx = 1:N_rx
y=y+FD_rx_sig(i,rx,sym)*conj(H(i,1,rx)); t=t+(conj(H(i,1,rx))*H(i,1,rx));
elseif d==0 % No Diversity y=FD_rx_sig(i,rx,sym); t=H(i,1,rx); s1=y/t; reco_sym(i)=[s1]; elseif d==2
% Equal Gain Combining for rx=1:N_rx y=y+FD_rx_sig(i,rx,sym)*conj(H(i,1,rx))/abs(H(i,1,rx)); t=t+abs(H(i,1,rx)); end s1=y/t; reco_sym(i) = [s1]; elseif d == 3 %Selection Combining [Hmax, rx] = max( abs(H(i,1,:))); y=FD_rx_sig(i,rx,sym); s1=y/(H(i,1,rx)); reco_sym(i) = [s1]; elseif d==4 % Threshold Combining SigPow = N_tx*1; threshold = SigPow; rx = 1; count = 0;
while ((abs(H(i,1,rx)) < threshold) && (count < N_rx)) rx = mod(rx,N_rx)+1; count = count + 1; end reco_sym(i) = FD_rx_sig(i,rx,sym)/H(i,1,rx); end end reco_bits((subcarr_len*N_fft*(sym-1)+1):subcarr_len*N_fft*sym) = MQAM_Demodulator(reco_sym,2^subcarr_len); end end
% Đoạn chương trình mơ tả khối tạo tín hiệu phát
function [tx_data_sig,data_bit_seq,data_sym] =
Tx_data_signal_generator_Diversity(subcarr_len,N_fft,N_data_sym,L)
% Data OFDM signal generation
data_bit_seq = randint(1,subcarr_len*N_fft*N_data_sym); %tao ra chuoi bi ngau
nghien, 1 hang, chua chen CP
pre_QAM_seq = reshape(data_bit_seq,subcarr_len,N_fft,N_data_sym);% chia ra
tx_data_1 = MQAM_modulator(pre_QAM_seq(:,:,sym));%????????? data_sym = tx_data_1.';
% According to the Gray Mapping USED
tx_data_sig(1:N_fft,1:L,1,sym) = circulant_ma(sqrt(N_fft)*ifft(tx_data_1.'),L);% end
end
% Đoạn chương trình mơ phỏng khối tín hiệu thu được
function [rx_sig,FD_rx_sig] = Rx_Sig_Generator(N_tx,N_rx,L,N_fft,No,h,tx_data_sig)
N_data_sym =21; for mm=1:N_data_sym for rx_anten = 1:N_rx rx_sig_nonoise = zeros(N_fft,1); rx_sig_nonoise = rx_sig_nonoise... + tx_data_sig(1:N_fft,1:L,N_tx,mm)*h(1:L,N_tx,rx_anten); AWGN_sig = sqrt(No/2)*( randn(N_fft,1) + j*randn(N_fft,1) ); rx_sig(1:N_fft,rx_anten,mm) = rx_sig_nonoise + AWGN_sig; FD_rx_sig(1:N_fft,rx_anten,mm) = sqrt(1/N_fft)*fft(rx_sig(1:N_fft,rx_anten,mm));%
chuyen lai qua mien tan so
end
end end
% Đoạn chương trình mơ phỏng khối điều chế
function [QAM_sym] = MQAM_modulator(bit_tupple)
tupple_Len = length(bit_tupple(:,1));%so bit/subcarrier burst_len = length( bit_tupple(1,:) );%so subcarriers
%[int_value] = two_bit_to_int(two_bits);
QAM_sym = zeros(1,burst_len);%
for sam =1:burst_len
if tupple_Len == 1 %M = 2
QAM_sym(sam) = 2*bit_tupple(1,sam) -1; elseif tupple_Len == 2 %M = 4
QAM_sym(sam) = (2*bit_tupple(1,sam) -1) +1i*(2*bit_tupple(2,sam) -1); elseif tupple_Len == 3 %M = 8
QAM_sym(sam) = 2*bit_tupple(1,sam) -1+ 1i*sign(bit_tupple(2,sam)-0.5)*(- 2*bit_tupple(3,sam) +3);
elseif tupple_Len == 5 %M = 32 QAM_sym(sam) = sign(bit_tupple(1,sam)-0.5)*(-2*bit_tupple(2,sam) +3) +... 1i*sign(bit_tupple(3,sam)-0.5)*two_bit_to_int(bit_tupple(4:5,sam)); elseif tupple_Len == 6 %M = 64 QAM_sym(sam) = sign(bit_tupple(1,sam)-0.5)*two_bit_to_int(bit_tupple(2:3,sam)) +... 1i*sign(bit_tupple(4,sam)-0.5)*two_bit_to_int(bit_tupple(5:6,sam)); elseif tupple_Len == 7 %M = 128 QAM_sym(sam) = sign(bit_tupple(1,sam)-0.5)*two_bit_to_int(bit_tupple(2:3,sam)) +... 1i*(sign(bit_tupple(4,sam)-0.5)*8 - sign(bit_tupple(4,sam)- 0.5)*sign(bit_tupple(5,sam)-0.5)*two_bit_to_int(bit_tupple(6:7,sam))); elseif tupple_Len == 8 %M = 256
QAM_sym(sam) = sign(bit_tupple(1,sam)-0.5)*8 - sign(bit_tupple(1,sam)- 0.5)*sign(bit_tupple(2,sam)-0.5)*two_bit_to_int(bit_tupple(3:4,sam)) + ...
1i*(sign(bit_tupple(5,sam)-0.5)*8 - sign(bit_tupple(5,sam)- 0.5)*sign(bit_tupple(6,sam)-0.5)*two_bit_to_int(bit_tupple(7:8,sam))); end
end
% Đoạn chương trình mơ phỏng khối giải điều chế
function [recovered_bits] = MQAM_Demodulator(sig,M)
num_sam = length(sig);%
if M == 2
%bits:0 1 s = [-1 1];
for sam = 1:num_sam
[distance,min_index] = min( abs( sig(sam) - s ).^2 ); recovered_bits(sam) = min_index-1;
end
%=============================================================== elseif M == 4
%bits:00 10 01 11 s = [-1-1i 1-1i -1+1i 1+1i]; for sam = 1:num_sam
[distance,min_index] = min( abs( sig(sam) - s ).^2 );
recovered_bit_temp(1:2,sam) = dec2bin(min_index-1,2); end recovered_bits = reshape(recovered_bit_temp,1,2*(num_sam)); %=============================================================== elseif M == 8 %new load QAM8dectab.mat
recovered_bits = horzcat(recovered_bits, reshape(QAMbintab(y, x, :), 1, 3)); end
%=============================================================== elseif M == 16 %new
load QAM16dectab.mat
[QAMbintab, QAMcplxtab] = make_tables(4,QAM_in); recovered_bits = [];
for sam = 1:num_sam
[y, x] = nearestIndex(sig(sam),QAMcplxtab);
recovered_bits = horzcat(recovered_bits, reshape(QAMbintab(y, x, :), 1, 4)); end
%=============================================================== elseif M == 32 %new
load QAM32dectab.mat
[QAMbintab, QAMcplxtab] = make_tables(5,QAM_in); recovered_bits = [];
for sam = 1:num_sam
[y, x] = nearestIndex(sig(sam),QAMcplxtab);
recovered_bits = horzcat(recovered_bits, reshape(QAMbintab(y, x, :), 1, 5)); end
%=============================================================== elseif M == 64 %new
load QAM64dectab.mat
[QAMbintab, QAMcplxtab] = make_tables(6,QAM_in); recovered_bits = [];
for sam = 1:num_sam
[y, x] = nearestIndex(sig(sam),QAMcplxtab);
recovered_bits = horzcat(recovered_bits, reshape(QAMbintab(y, x, :), 1, 6)); end
%=============================================================== elseif M == 128 %new
load QAM128dectab.mat
[QAMbintab, QAMcplxtab] = make_tables(7,QAM_in); recovered_bits = [];
for sam = 1:num_sam
[y, x] = nearestIndex(sig(sam),QAMcplxtab);
recovered_bits = horzcat(recovered_bits, reshape(QAMbintab(y, x, :), 1, 7)); end
%=============================================================== elseif M==256 %new
load QAM256dectab.mat
[QAMbintab, QAMcplxtab] = make_tables(8,QAM_in); recovered_bits = [];
for sam = 1:num_sam
[y, x] = nearestIndex(sig(sam),QAMcplxtab);
% Đoạn chương trình nguồn mơ phỏng tính hội tụ các ăng ten
clear all; close all;
N_packet =800; % number of simulation packets d=3; for x=1:5 if x==1 N_rx=2; elseif x==2 N_rx=4; elseif x==3 N_rx=9; elseif x==4 N_rx=10; elseif x==5 N_rx=11; end
N_tx = 1; % So ang ten phat =1
M_QAM =64; % Muc dieu che M-QAM SNR = [0:2:20].'; N_data_sym =21; %============== OFDM settings-------------- L = 5; % So resolvable multipaths < N_cp N_fft =128; N_cp = 10; SigPow = N_tx*1;
Ns = N_fft + N_cp; % OFDM symbol length (in sample) after CP insertion PDP = exp(-(0:L-1)/4)/sum( exp(-(0:L-1)/4) );
%----------------------------
subcarr_len = log2(M_QAM); BER = zeros(1,length(SNR)); tic
for SNR_index = 1:length(SNR)
No = SigPow/(10^(SNR(SNR_index)/10)); for packet = 1:N_packet
disp(['SNR=', num2str(SNR(SNR_index)), ';Packet=', num2str(packet)]); if d==0 N_rx=1; end [tx_data_sig,data_bit_seq,data_sym] = Tx_data_signal_generator_Diversity(subcarr_len,N_fft,N_data_sym,L); h= zeros(L,N_tx,N_rx); for rx_anten = 1:N_rx
[rx_sig,FD_rx_sig] = Rx_Sig_Generator(N_tx,N_rx,L,N_fft,No,h,tx_data_sig); [reco_bits, reco_sym] = Diversity( h, FD_rx_sig, subcarr_len, N_fft, N_data_sym, N_rx, L, d );
BER(SNR_index) = BER(SNR_index) + sum( abs(data_bit_seq - reco_bits) ); end end BER = BER/(N_packet*subcarr_len*N_fft*N_data_sym); switch(x) case 1 figure(1) semilogy(SNR,BER,'b*:','LineWidth',2); hold on; case 2 semilogy(SNR,BER,'r+-','LineWidth',2); hold on; case 3 semilogy(SNR,BER,'k>--','LineWidth',2); hold on; case 4 semilogy(SNR,BER,'yx-','LineWidth',2); hold on; case 5 semilogy(SNR,BER,'go-','LineWidth',2); hold on; otherwise end xlabel('SNR (dB)');
ylabel('Bit error rate (BER)'); legend( 'N_rx=2',... 'N_rx=4',... 'N_rx=9',... 'N_rx=10',... 'N_rx=11'); end