1. Nội dung thiết kế tốt nghiệp:
4.2.2 Mô phỏng hệ thống OFDM
Hình 4.9 Sơ đồ mô phỏng hệ thống OFDM
Đầu tiên, bộ phát nhị phân Bernoulli sẽ tạo chuỗi tín hiệu. Chuỗi dữ liệu đầu vào được mã hoá bởi bộ mã Reed-Solommon và được điều chế bởi bộ Mapping QPSK. IFFT là hữu ích cho OFDM vì nó phát ra các mẫu của dạng sóng có thành phần tần số thoả mãn điều kiện trực giao. Dữ liệu sau khi được biến đổi sẽ được chèn thêm CP và chuỗi huấn luyện để giúp cho qua trình ước lượng kênh và đồng bộ ở máy thu.
Mô phỏng kênh truyền đưa ra các đặc trưng của kênh truyền vô tuyến chung như nhiễu, đa đường và xén tín hiệu. Dùng hai khối trong Matlab: Multipath Rayleigh fading, AWGN
Tín hiệu thu sau khi loại bỏ CP và chuỗi huấn luyện sẽ được đưa vào IFFT để chuyển các mẫu miền thời gian trở lại miền tần số. Đưa vào bộ ước lượng kênh và bù kênh để giảm ảnh hưởng kênh truyền đến tín hiệu. Cuối cùng, tín hiệu được giải điều
Ta có kết quả:
Hình 4.10 Tín hiệu OFDM bên phát
Hình 4.13 Phổ tín hiệu OFDM nhận Hình 4.12 Phổ tín hiệu OFDM truyền
Hình 4.15 Chòm sao QPSK sau CE Hình 4.14 Chòm sao QPSK trước CE
Hình 4.12 và 4.13 cho thấy tác động của kênh truyền đến phổ tín hiệu OFDM. Vì kênh truyền là một kênh fading chọn lọc tần số nên phổ tín hiệu OFDM nhận ở những tần số khác nhau chịu sự tác động khác nhau. Hình 4.10 và 4.11 cho thấy biên độ tín hiệu OFDM nhận nhỏ hơn biên độ tín hiệu OFDM truyền đi.
Hình 4.14 và 4.15 cho thấy tác dụng của bộ ước lượng và bù kênh. Hình 4.6 chòm sao QPSK trước khi ước lượng kênh có biên độ và pha rất không ổn định. Hình 4.7 chòm sao QPSK sau khi ước lượng kênh những điểm chỉ dao động nhỏ quanh một vị trí cố định tức là biên độ và pha gần như ổn định.
4.3 Kết luận chương
Trong chương cuối cùng này đã mô phỏng hệ thống OFDM bằng simulink của Matlab, với những scope để hiện thị tín hiệu giúp cho việc phân tính đánh giá tác động của kênh truyền đến tín hiệu, tác dụng của bộ ước lượng và bù kênh. Tuy nhiên, simulink này chỉ dừng lại ở mức độ đơn giản, tức là chỉ mô phỏng hệ thống OFDM băng gốc với phương thức điều chế QPSK. Trong chương cũng đã so sánh tín hiệu OFDM và tín hiệu QAM, file âm thanh của chúng để thấy rõ những ưu điểm của OFDM.
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
Công nghệ ghép kênh phân chia theo tần số trực giao OFDM là một công nghệ hiện đại cho truyền thông tương lai. Hiện nay việc nghiên cứu và ứng dụng OFDM không ngừng được nghiên cứu và mở rộng phạm vi ứng dụng bởi những ưu điểm trong việc tiết kiệm băng tần và khả năng chống lại fading chọn lọc tần số cũng như xuyên nhiễu băng hẹp. Đồ án đã tìm hiểu, trình bày những vấn đề cơ bản của kỹ thuật OFDM cũng như một số vấn đề kỹ thuật cho công nghệ OFDM và khả năng ứng dụng OFDM vào các công nghệ tương lai này.
Đồng bộ là một vấn đề quan trọng không chỉ trong hệ thống OFDM mà còn cả trong các hệ thống khác cũng vậy. Hệ thống OFDM yêu cầu khắt khe về vấn đề đồng bộ vì sự sai lệch về tần số, ảnh hưởng của hiệu ứng Doppler khi di chuyển và lệch pha sẽ gây ra nhiễu giao thoa tần số (ICI). Trong bất kỳ một hệ thống OFDM nào, hiệu suất cao phụ thuộc vào tính đồng bộ hoá giữa máy phát và máy thu, làm mất tính chính xác định thời dẫn đến nhiễu ISI và ICI khi mất độ chính xác tần số
Chương trình mô phỏng tín hiệu OFDM ở đồ án này chỉ mới thực hiện được bước đầu là mô phỏng tổng quan và và mô phỏng so sánh tín hiệu. Có thể thiết kế hệ thống OFDM với Simulink trong Matlab và đi vào mô phỏng các thuật toán, các phương pháp cụ thể trong từng vấn đề. Ngoài ra, để nâng cao chỉ tiêu chất lượng hệ thống OFDM, người ta sử dụng mã hoá tín hiệu OFDM. Do đó chúng ta có thể bổ sung vấn đề mã hoá vào trong đồ án này.
Việc tìm hiểu tổng quan về OFDM và giải quyết các vấn đề kỹ thuật trong hệ thống OFDM, chúng ta có thể hướng đến ứng dụng của OFDM trong tương lai như:
Nghiên cứu, tìm hiểu một số hệ thống OFDM nâng cao như VOFDM (Vector OFDM), COFDM (Coded OFDM), WOFDM (Wideband OFDM),...
Kết hợp OFDM với các công nghệ khác như FDMA, TDMA và CDMA để tạo thành các kỹ thuật đa truy cập trong thông tin di động.
TÀI LIỆU THAM KHẢO
[1]. Th.s Nguyễn Ngọc Tiến,” Một số vấn đề kỹ thuật trong OFDM”, Tạp chí Bưu Chính Viễn Thông & Công Nghệ Thông Tin , Kỳ 1(10/2003)
[2]. 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, 2006.
[3]. Ramjee Prasad “OFDM for Wireless Communications Systems” Artech House, 2004.
[4]. Ye(Geoffrey) Li, Gordon Stuber “Orthogonal Frequency Division Multiplexing for Wireless Communications” ,Springer , 2006 .
[5] Hui Liu, Guoqing Li “ OFDM- Based Broadband Wireless Networks” Wiley Interscience, 2005.
[6] L.Hanzo, M.Munster, B.J.Choi and T.Keller “ OFDM and MC-CDMA for Broadband Multi-User Communications, WLANs and Broadcasting ” All of Univesity of Southampton,UK, IEEE Press/ Wiley 2003.
[7] Juha Heikala, John Terry, Ph.D. “OFDM Wireless LANS : A Theoritical and Practical Guide” ISBN :0672321572.
[8]. Henrik Schulze and Christian Luders, “Theory and Application of OFDM and CDMA”, Fachhochschule Sudwestfalen Meschede, Germany-2005.
[9]. L.HANZO,W.WEBB,and T.KELLER,"Single-and Multi-Carrier Quadrature Amplititude Modulation". New York: IEEE Press/ Wiley, Apr.2000.
[10]. Richard van Nee, Ramjee Prasad, " OFDM for wireless multimedia communications", Artech House, 2000.
[11]. Ahmad R.S. Bahai, Burton R. Saltzberg, “Multicarier Digital
Communications Theory and Applications of OFDM”, Kluwer Academic Publishers, 2002.
PHỤ LỤC
******************Chuẩn hóa dữ liệu trước khi sử dụng******************* if channel_on == 1
disp('Simulating Channel') norm_factor = max(abs(recv)); recv = (1/norm_factor) * recv; ch_clipping
ch_multipath ch_noise
recv = norm_factor * recv; end
**********************Mô phỏng hiệu ứng xén tín hiệu************** for i = 1:length(recv) if recv(i) > clip_level recv(i) = clip_level; end if recv(i) < -clip_level recv(i) = -clip_level; end end
************************Mô phỏng hiệu ứng đa đường******************* copy1=zeros(size(recv)); for i=1+d1:length(recv) copy1(i)=a1*recv(i-d1); end copy2=zeros(size(recv)); for i=1+d2:length(recv) copy2(i)=a2*recv(i-d2); end recv=recv+copy1+copy2;
*******************Tính toán nhiễu ( thực hiện ở phía thu) ***********
if already_made_noise == 0% only generate once and use for both QAM and OFDM noise = (rand(1,length(recv))-0.5)*2*noise_level;
already_made_noise = 1; end
recv = recv + noise; % khôi phục biên độ dữ liệu
****************** Phát symbol OFDM *********************** disp('Transmitting')
read % Đọc dữ liệu vào
data_in_pol = bin2pol(data_in); % Chuyen doi du lieu nhi phan thanh du lieu phan cuc
tx_chunk
*******Thuc hien IFFT de tao dang song mien thoi gian bieu dien du lieu***** td_sets = zeros(num_chunks,fft_size);
for i = 1:num_chunks
td_sets(i,1:fft_size) = real(ifft(spaced_chunks(i,1:fft_size))); end
tx_dechunk
**************Đổi dữ liệu nhị phân (0,1) thanh du lieu cuc (-1,1)************ y = ones(1,length(x)); for i = 1:length(x) if x(i) == 0 y(i) = -1; end end
**********************Đổi dữ liệu nhị phân thành hexa******************* y = 0; k = 0; for i = 1:8 y = y + x(8-k)*2^k; k = k+1; end *******************
% Simulation of digital M-PSK modulation schemes over an AWGN channel % November 2004. Robert Morelos-Zaragoza. San Jose State University. % Needs the Communications toolbox.
clear
Fd = 1; Fs = 1;
N = 100000 ; method='psk'; set(1) = 2; set(2) = 4; set(3) = 8; for j=1:1:3 M = set(j); i=1; for esno=0:1:18 sigma = sqrt(10^(-esno/10)/2); x = floor(M*rand(N,1)); y = modmap(x,Fd,Fs,method,M); ynoisy = y + sigma*randn(N*Fs,2); z = demodmap(ynoisy,Fd,Fs,method,M); s = symerr(x,z); ber(j,i) = (s/N)/log2(M); snr(i) = esno; i=i+1; end j end semilogy(snr,ber(1,:),'-b^',snr,ber(2,:),'-bo',snr,ber(3,:),'-bs'); grid on; ylabel('BER'); xlabel('E/N_0 (dB)'); legend('BPSK', 'QPSK', '8PSK',1);
title('Simulated error performance of M-PSK. SJSU - Fall 2004.'); ***************************
% Simulation of digital M-QAM modulation schemes over an AWGN channel % November 2004. Robert Morelos-Zaragoza. San Jose State University. % Needs the Communications toolbox.
clear
Fd = 1; Fs = 1;
N= 100000 ; method='qask'; set(1) = 4; set(2) = 16; set(3) = 64;
M = set(j); l=1:1:M; aux = sum(abs(modmap(l-1,Fd,Fs,method,M)).^2)/M; energy(j) = aux(1)+aux(2); i=1; for esno=0:2:26; sigma = sqrt(10^(-esno/10)/2)*sqrt(energy(j)); x = floor(M*rand(N,1)); y = modmap(x,Fd,Fs,method,M); ynoisy = y + sigma*randn(N*Fs,2); z = demodmap(ynoisy,Fd,Fs,method,M); s = symerr(x,z); ber(j,i) = (s/N)/log2(M); snr(i) = esno; i=i+1; end j end semilogy(snr,ber(1,:),'-b^',snr,ber(2,:),'-bo',snr,ber(3,:),'-bs'); grid on; ylabel('BER'); xlabel('E/N_0 (dB)');
legend('QPSK', '16-QAM', '64-QAM',1);
title('Cac kieu dieu che M-QAM khac nhau trong kenh truyen AWGN'); ************************
function y = eight2bin(x) % eight2bin
%
% Converts eight bit data (0-255 decimal) to a binary form for processing. y = zeros(1,8); k = 0; while x > 0 y(8-k) = rem(x,2); k = k+1; x = floor(x/2); end **********************
% Run OFDM simulation
tic % Start stopwatch to calculate how long QAM simulation takes disp(' '),disp('---') disp('OFDM Simulation')
tx ch rx
% Stop stopwatch to calculate how long QAM simulation takes OFDM_simulation_time = toc;
if OFDM_simulation_time > 60
disp(strcat('Time for OFDM simulation=', num2str(OFDM_simulation_time/60), ' minutes.')); else
disp(strcat('Time for OFDM simulation=', num2str(OFDM_simulation_time), ' seconds.')); end ********************* function y = pol2bin(x) % pol2bin %
% Chuyen doi cac so phan cuc (-1,1) thanh cac so nhi phan (0,1) % Chap nhan mot mang 1-D cua cac so phan cuc
% Loai bo cac zeros, khi chung khong hop le % % Loai bo cac zeros - Khong can cho giai ma y = ones(1,length(x)); for i = 1:length(x) if x(i) == -1 y(i) = 0; end end *****************************
% QAM.m So sanh OFDM (Da song mang) voi QAM da muc (Don song mang) % Khi chung ta phat cung mot so luong bit giong ngau tren mot chu ky thoi % gian
read % Doc du lieu cho QAM - Khong anh huong den OFDM
data_in_pol = bin2pol(data_in); % Chuyen doi du lieu nhi phan thanh du lieu phan cuc
% Kiem tra so song mang co phai la luy thua cua 2 is_pow_2 = num_carriers; temp_do_QAM = 0; if is_pow_2 ~= 2 while temp_do_QAM == 0 temp_do_QAM = rem(is_pow_2,2); is_pow_2 = is_pow_2/2; if is_pow_2 == 2 temp_do_QAM = -99; end end else
temp_do_QAM = -99; % 2 la luy thua cua 2 end
if temp_do_QAM ~= -99
do_QAM = 0; % Khong the thuc hien
disp(' '),disp('ERROR: Cannot run QAM because num_carriers is not valid.') disp(' Please see "setup.m" for details.')
end
if do_QAM == 1
tic % Bat dau de tinh toan thoi gian mo phong thuc hien QAM disp(' '), disp('---') disp('QAM simulation'), disp('Transmitting')
****** Them cac muc zeros de du lieu duoc chia thanh cac phan bang nhau data_length = length(data_in_pol);
r = rem(data_length,num_carriers); if r ~= 0
for i = 1:num_carriers-r
data_in_pol(data_length+i) = 0; %Them dau vao voi cac zeros vao tap hop du lieu
end %Toc do co the duoc
cai thien end
num_OFDM_symbols = ceil(data_length / (2*num_carriers));
% So ky hieu QAM duoc bieu dien bang so luong cua du lieu tren mot ky % hieu OFDM
num_QAM_symbols = num_carriers / 2; % So mau tren ky hieu QAM
num_symbol_samples = fft_size / num_QAM_symbols;
**** *Chuyen doi du lieu phan cuc [-1, 1] thanh du lieu 4 muc [-3, -1, 1, 3]**** data_in_4 = zeros(1,data_length/2);
for i = 1:2:data_length
data_in_4(i - (i-1)/2) = data_in_pol(i)*2 + data_in_pol(i+1); end
% Dinh ro diem lay mau giua 0 va 2*pi
ts = linspace(0, 2*pi*QAM_periods, num_symbol_samples+1); % Phat du lieu 16-QAM
% Tong do dai cua truyen dan 16-QAM
tx_length = num_OFDM_symbols * num_QAM_symbols * num_symbol_samples; QAM_tx_data = zeros(1,tx_length); for i = 1:2:data_length/2 for k = 1:num_symbol_samples QAM_tx_data(k+((i-1)/2)*num_symbol_samples) = data_in_4(i)*cos(ts(k)) + data_in_4(i+1)*sin(ts(k)); end end
% Do channel simulation on QAM data
xmit = QAM_tx_data; % ch dung du lieu 'xmit' va tra ve 'recv' ch
QAM_rx_data = recv; % Luu du lieu QAM sau khi mo phong kenh
clear recv %Loai bo 'recv' sao cho no khong nhieu voi OFDM
clear xmit % Loai bo 'xmit' sao cho no khong nhieu voi OFDM
disp('Receiving') % Khoi phuc du lieu nhi phan (Giai ma QAM)
cos_temp = zeros(1,num_symbol_samples); %
xxx = zeros(1,data_length/4); % Khoi tao muc khong cho toc do
yyy = xxx; %
QAM_data_out_4 = zeros(1,data_length/2); % for i = 1:2:data_length/2 % "cheating"
for k = 1:num_symbol_samples
************Tang so song mang de tao tan so cao va du lieu goc********** cos_temp(k) = QAM_rx_data(k+((i-
1)/2)*num_symbol_samples) * cos(ts(k));
sin_temp(k) = QAM_rx_data(k+((i- 1)/2)*num_symbol_samples) * sin(ts(k));
end
% LPF va xac dinh - chung ta se rat don gian LPF bang phep trung % binh
xxx(1+(i-1)/2) = mean(cos_temp); yyy(1+(i-1)/2) = mean(sin_temp);
************ Khoi phuc du lieu thanh dang noi tiep******************** QAM_data_out_4(i) = xxx(1+(i-1)/2);
QAM_data_out_4(i+1) = yyy(1+(i-1)/2); end
********************** %Tinh toan giua cac muc khong
zeros_between = ((fft_size/2) - (num_carriers + num_zeros))/(num_carriers + num_zeros);
spaced_chunks = zeros(num_chunks,fft_size); %Them vao giua cac muc khong
i = 1;
for k = zeros_between +1:zeros_between +1:fft_size/2
spaced_chunks(1:num_chunks,k) = padded_chunks(1:num_chunks,i); i = i+1;
end
% Gap du lieu de tao ra mot ham le cho dau vao IFFT for i = 1:num_chunks
% Chu y: chi muc = 1 that ra la tan so mot chieu de ifft -> no khong % tao ban sao len truc y do thi
spaced_chunks(i,fft_size:-1:fft_size/2+2) = conj(spaced_chunks(i,2:fft_size/2));
********Thuc hien xac dinh giua cac muc [-3, -1, 1, 3]****** for i = 1:data_length/2
if QAM_data_out_4(i) >= 1, QAM_data_out_4(i) = 3; elseif QAM_data_out_4(i) >= 0, QAM_data_out_4(i) = 1; elseif QAM_data_out_4(i) >= -1, QAM_data_out_4(i) = -1; else QAM_data_out_4(i) = -3;
end end
******Chuyen doi du lieu 4 muc [-3, -1, 1, 3] ve du lieu phan cuc [-1, 1]****** QAM_data_out_pol = zeros(1,data_length); % "cheating"
for i = 1:2:data_length
switch QAM_data_out_4(1 + (i-1)/2) case -3 QAM_data_out_pol(i) = -1; QAM_data_out_pol(i+1) = -1; case -1 QAM_data_out_pol(i) = -1; QAM_data_out_pol(i+1) = 1; case 1 QAM_data_out_pol(i) = 1; QAM_data_out_pol(i+1) = -1; case 3 QAM_data_out_pol(i) = 1; QAM_data_out_pol(i+1) = 1; otherwise
disp('Error detected in switch statment - This should not be happening.');
end end
QAM_data_out = pol2bin(QAM_data_out_pol); % Chuyen doi ve du lieu nhi phan