BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA VIỄN THƠNG ĐA TRUY NHẬP VÔ TUYẾN BÀI THỰC HÀNH MA_06 VÀ MA_07 Giảng viên: Nguyễn Viết Đảm Hà Nội - 2021 ĐỒN ĐỨC TÌNH - B18DCVT362 SIM_MA_06 1.1 Mục tiêu Làm sáng tỏ trình xây dựng mơ hình ngun lý hoạt động hệ thống truyền dẫn OFDM sở IFFT/FFT chèn khử CP Trực quan hóa nguyên lý hoạt động sở mô tả mô Matlab 1.2 Nội dung TRANG TRANG TRANG TRANG TRANG TRANG TRANG TRANG TRANG ĐỒN ĐỨC TÌNH - B18DCVT362 - Hình 3: Phổ tần mẫu tín hiệu đầu vào OFDM có độ rộng phổ 2/TOFDM Mẫu tín hiệu có chồng lấn phổ - tăng hiệu suất phổ - Hình 4: Phổ mẫu tín hiệu OFDMRF tương tự phổ tần mẫu tín hiệu đầu vào OFDM, khác điểm bắt đầu phổ từ f = fRF Nhìn chung, kênh trùng tần số không giao thoa lẫn nhau, tăng hiệu suất phổ, giảm chi phí tiết kiệm phổ tần 1.4 MA_06_CP_insert 1.4.1 Câu lệnh Matlab % -% - MA_06_CP_insert % -function [CP_insert] = MA_06_CP_insert(N,V) % CP_insert -O_I = zeros(V,N); O_V_N_V = zeros(V,N-V); I_V = eye(V); for i=1:V O_I(i,:) = [O_V_N_V(i,:) I_V(i,:)] ; end I_N = eye(N); CP_insert = [O_I;I_N]; Câu lệnh Giải thích function [CP_insert] = MA_06_CP_insert(N,V) Tạo function MA_06_CP_insert với đầu vào O_I = zeros(V,N); Khai báo O_I mảng toàn O_V_N_V = zeros(V,N-V); Khai báo 0_V_N_V mảng toàn gồm V N & V Đầu CP_insert hàng N-V cột I_V = eye(V); Khai báo I_V ma trận đơn vị kích thước VxV for i=1:V (*) O_I(i,:) = [O_V_N_V(i,:) I_V(i,:)] Vòng for cho I chạy từ 1:V - O_I hàng thứ i tất cột = [O_V_N_V(i,:) I_V(i,:)] I_N = eye(N); CP_insert = [O_I;I_N]; Khai báo I_N ma trận đơn vị NxN Gán CP_insert = [O_I;I_N] TRANG 16 Ghi ĐỒN ĐỨC TÌNH - B18DCVT362 1.4.2 Kết [CP_insert] = MA_06_CP_insert(8,2) CP_insert = 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.5 MA_06_CP_Remove 1.5.1 Câu lệnh Matlab % -% - MA_06_CP_Remove % -function [CP_Remve] = MA_06_CP_Remove(N,V) % CP_Remove -CP_Remve = zeros(N,N+V); O_V = zeros(N,V); I_N = eye(N); for i =1:N CP_Remve(i,:) = [O_V(i,:) I_N(i,:)]; end Câu lệnh Giải thích function [CP_Remve] = MA_06_CP_Remove(N,V) Tạo function MA_06_CP_Remove với đầu O_I = zeros(V,N); CP_Remve = zeros(N,N+V); O_V = zeros(N,V); I_N = eye(N); Khai báo CP_Remve mảng toàn gốm N vào N & V Đầu CP_Remove hàng, N+V cột TRANG 17 Ghi ĐỒN ĐỨC TÌNH - B18DCVT362 for i =1:N CP_Remve(i,:) = [O_V(i,:) I_N(i,:)]; end Vòng for cho I chạy từ 1:N - CP_Remve(i,:) (hàng thứ i tất cột ) = [O_V(i,:) I_N(i,:)]; 1.5.2 Kết >> [CP_Remve] = MA_06_CP_Remove(8,2) CP_Remve = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.6 MA_06_OFDM_Principle 1.6.1 Câu lệnh Matlab clc; clear; N = 4; V = 2; %input('Enter N ='); %input('Enter V ='); X1 [W_H] [W] [CP_insert] [CP_Remve] = 1:N; = MA_06_IFFT_matrix(N); = MA_06_FFT_matrix(N); % note W=inv(W_H) W*W_H = I = MA_06_CP_insert(N,V); = MA_06_CP_Remove(N,V); Mode = 1; if Mode == else X1 % X1 = 0.5*(sign(rand(1,N)-0.5)+1); = 2*X1-1; end % X2 = X1'; X3 = W_H*X2; % IFFT X4 = X3'; X5 = X4'; TRANG 18 ĐOÀN ĐỨC TÌNH - B18DCVT362 X6 = CP_insert*X5; X7 = X6'; X8 = X7'; X9 = CP_Remve*X8; X10 = X9'; X11 = X10'; X12 = W*X11; % FFT X13 = X12' % ===== Check for IFFT/FFT; CP_insert_remove % X13_T = abs(X13) Test_IFFT_FFT_matrix = abs(W_H*W); Test_CP_inser_remove = CP_Remve*CP_insert; % Test_CP_inser_remove2 = CP_insert*CP_Remve % ===== Check for System Modeling X1; X13; % Test_I_O = xor(X1,X13); % Note khong dung X1~=X13 %================================================== % IFFT & FFT Princeples % step 1: IFFT process data_IFFT = sqrt(N)*ifft(X1,N); % step 2: add CP % data_IFFT=data_IFFT'; data_IFFT_CP = [data_IFFT(N-V+1:N) data_IFFT]; % step 3: remove CP % data_IFFT_CP= data_IFFT_CP'; data_CPR = data_IFFT_CP(V+1:N+V); % step 4: IFFT process data_FFT = (1/sqrt(N))*fft(data_CPR,N) 1.6.2 Kết X13 = 1.0000 - 0.0000i 2.0000 - 0.0000i 3.0000 - 0.0000i 4.0000 + 0.0000i data_FFT = 1.7 MA_06_IFFT_FFT_matrix 1.7.1 Câu lệnh Matlab clc clear; % solution 1: belong to matrix W_H & W display('SOLUTION 1: belong to Generation OF MATRIX'); W_H = [1 1 1; exp(j*2*pi/4) exp(j*4*pi/4) exp(j*6*pi/4); exp(j*4*pi/4) exp(j*8*pi/4) exp(j*12*pi/4); exp(j*6*pi/4) exp(j*12*pi/4) exp(j*2*3*3*pi/4)]; TRANG 19 ĐỒN ĐỨC TÌNH - B18DCVT362 W_H=1/2*W_H W = [1 1 1; exp(-j*2*pi/4) exp(-j*4*pi/4) exp(-j*6*pi/4); exp(-j*4*pi/4) exp(-j*8*pi/4) exp(-j*12*pi/4); exp(-j*6*pi/4) exp(-j*12*pi/4) exp(-j*2*3*3*pi/4)]; W=1/2*W test = abs(W_H*W); display('tich ma tran W_H*W'); disp(test); display(' so lieu vao ma tran IFFT (W_H)'); x11 = 1:4 display(' dau IFFT sau nhan ma tran W_H (W_H*x11)'); x12 = W_H*x11' display(' dau FFT sau nhan ma tran W'); x13 = W*x12 display(' so sanh I/O cua IFFT & FFT o dang ma tran'); test2 = x11~=round(x13') display('SOLUTION 2: belong to Generation OF MATRIX'); % clear; clc; N= 4; W_H_2 = zeros(N); for i =1:N for m= 1:N W_H_2(i,m) = exp(j*2*pi/N*(i-1)*(m-1)); end end W_H_2 = 1/sqrt(N)*W_H_2 W_H W_H_2~=W_H W_2 = zeros(N); for m =1:N for i= 1:N W_2(m,i) = exp(-j*2*pi/N*(m-1)*(i-1)); end end W_2 = 1/sqrt(N)*W_2 W W_2~=W 1.7.2 Kết W_H_2 = 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.0000 + 0.5000i -0.5000 + 0.0000i -0.0000 - 0.5000i 0.5000 + 0.0000i -0.5000 + 0.0000i 0.5000 - 0.0000i -0.5000 + 0.0000i 0.5000 + 0.0000i -0.0000 - 0.5000i -0.5000 + 0.0000i 0.0000 + 0.5000i TRANG 20 ĐOÀN ĐỨC TÌNH - B18DCVT362 W_H = 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.0000 + 0.5000i -0.5000 + 0.0000i -0.0000 - 0.5000i 0.5000 + 0.0000i -0.5000 + 0.0000i 0.5000 - 0.0000i -0.5000 + 0.0000i 0.5000 + 0.0000i -0.0000 - 0.5000i -0.5000 + 0.0000i 0.0000 + 0.5000i ans = 0 0 0 0 0 0 0 0 W_2 = 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.0000 - 0.5000i -0.5000 - 0.0000i -0.0000 + 0.5000i 0.5000 + 0.0000i -0.5000 - 0.0000i 0.5000 + 0.0000i -0.5000 - 0.0000i 0.5000 + 0.0000i -0.0000 + 0.5000i -0.5000 - 0.0000i 0.0000 - 0.5000i W= 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.5000 + 0.0000i 0.0000 - 0.5000i -0.5000 - 0.0000i -0.0000 + 0.5000i 0.5000 + 0.0000i -0.5000 - 0.0000i 0.5000 + 0.0000i -0.5000 - 0.0000i 0.5000 + 0.0000i -0.0000 + 0.5000i -0.5000 - 0.0000i 0.0000 - 0.5000i ans = 0 0 0 0 0 0 0 0 TRANG 21 ĐỒN ĐỨC TÌNH - B18DCVT362 1.8 MA_06_IFFT_FFT_AWGN 1.8.1 Câu lệnh Matlab % -% - MA_06_IFFT_FFT_AWGN -% -clc; clear all; close all; % FFTsize = 1000; CPsize = 25; snr_in_dB = 10; noisePower = 10^(-snr_in_dB/10); % -% Generate for FFTsize bits: BPSK data = 0.5*(sign(rand(1,FFTsize)-0.5)+1); data = 2*data-1; % -% IFFT & FFT Princeples % step 1: IFFT process data_IFFT = ifft(data); % step 2: add CP data_IFFT_CP = [data_IFFT(FFTsize-CPsize+1:FFTsize) data_IFFT]; % step 3: AWGN channel tmp = randn(1,FFTsize+CPsize); RV_Gausian = tmp*noisePower; RxSymbols = data_IFFT_CP + RV_Gausian; % step 4: remove CP data_CPR = RxSymbols(CPsize+1:FFTsize+CPsize); % step 5: IFFT process data_FFT = fft(data_CPR); %%%%% decision and determine error % solution 1: % Hard decision data_des1 = zeros(1, length(data)); for i = 1:length(data_FFT) if data_FFT(i) >= data_des1(i) = 1; else data_des1(i) = -1; end end % to determine error (comparesion) error_vector1 = data~=data_des1; % errCount & number of errors num_error1 = sum(error_vector1); BER1 = num_error1/FFTsize % solution 2: % Hard decision data_des2 = sign(real(data_FFT)); % to determine error (comparesion) error_vector2 = data~=data_des2; % errCount & number of errors num_error2 = sum(error_vector2); TRANG 22 ĐỒN ĐỨC TÌNH - B18DCVT362 BER2 = num_error2/FFTsize % optimal solution optimal BER_op = sum(sign(real(data_FFT))~=data)/FFTsize 1.8.2 Các bước tiến hành Bước 1: Thiết lập tham số mô SNR = FFTsize = 16 CPsize = 4; errCount = 0; Bước 2: Điều chế Q-PSK numSymbols = FFTsize; % note tmp1 = round(rand(2,numSymbols)); tmp2 = tmp1*2 - 1; data = (tmp2(1,:) + j*tmp2(2,:))/sqrt(2); inputSymbols = data; Bước 3: Điêu chế OFDM IFFT TxSamples = sqrt(FFTsize)*ifft(inputSymbols); Bước 4: Chèn CP Tx_ofdm = [TxSamples(numSymbols- CPsize+1:numSymbols) TxSamples]; Bước 5: Tạo kênh AWGN liệu tmp = randn(2,numSymbols+CPsize); qua kênh AWGN complexNoise = (tmp(1,:) + i*tmp(2,:))/sqrt(2); noisePower = 10^(-SNR/10); RxSymbols = Tx_ofdm + sqrt(noisePower)*complexNoise; Bước 6: Khử CP EstSymbols = RxSymbols(CPsize+1:numSymbols+CPsize); Bước 7: Giải điều chế OFDM Y = fft(EstSymbols,FFTsize); % dau cua FFT FFT Bước 8: Tách sóng quết định cứng EstSymbols = Y; EstSymbols = sign(real(EstSymbols)) + i*sign(imag(EstSymbols)); EstSymbols1 = EstSymbols; EstSymbols = EstSymbols/sqrt(2); TRANG 23 ĐỒN ĐỨC TÌNH - B18DCVT362 Bước 9: So sánh kiểm tra lỗi đếm I = find((inputSymbols-EstSymbols) == 0); lỗi Bước 10: Đếm lỗi errCount = errCount + (numSymbols- length(I)); SER = errCount / (numSymbols); Bước 11: Hiển thị kết mô disp('Du lieu dau vao IFFT = ') disp(data); disp('Du lieu dau sau quyet dinh = ') disp(EstSymbols); disp('Kiem tra su khac vao/ra he thong') disp(data~=EstSymbols); disp('So ky hieu loi = ') disp(sum(data~=EstSymbols)); disp('SER = ') disp(sum(data~=EstSymbols)/FFTsize); 1.8.3 Kết BER1 = 0.3360 BER2 = 0.3360 BER_op = 0.3360 TRANG 24 ĐOÀN ĐỨC TÌNH - B18DCVT362 SIM_MA07 1.9 Mục tiêu Mơ hình hóa trực quan hóa nguyên lý hoạt động hệ thống BPSK-OFDM dùng mã kênh mô trường AWGN Matlab hóa mơ hệ thống BPSK-OFDM-AWGN 1.10 Nội dung 1.11 Sim_MA_07_BPSK_OFDM_AWGN_ChannelCode 1.11.1 Câu lệnh Matlab %======================================================================== %================= Sim_MA_07_BPSK_OFDM_AWGN_ChannelCode ================= %======================================================================== clc; clear all; close all; SNR = [0:1:9]; FFTsize = 512; CPsize = 20; numRun = 10^3; % Note NumBits = FFTsize*numRun; %======================================================================== == mode_Sim = 2; % for No channel code (OFDM without channel coding); % for channel coding (OFDM with channel coding) Codding_Type = 1; % Code Generation Matrix if mode_Sim ==2 if Codding_Type == k0 = 1; G = [1 1;1 1]; elseif Codding_Type == k0 = 1; G = [1 1 0 1;1 1 0]; else k0 = 2; G = [0 1 0 1;0 0 0 0 1;1 0 0 0 1]; end end %======================================================================== == for n = 1:length(SNR), errCount = 0; for k = 1:numRun % Generated BPSK data numSymbols = FFTsize; data = 0.5*(sign(rand(1,numSymbols)-0.5)+1); data2 = 2*data-1; % - TRANG 25 ĐỒN ĐỨC TÌNH - B18DCVT362 if mode_Sim ==2 % Convolution code Encoder inputSymbols = FWC_COV_Encoder(G,k0,data); inputSymbols = 2*inputSymbols-1; else inputSymbols = 2*data-1; end % % IFFT (OFDM Modulation) TxSamples = sqrt(length(inputSymbols))*ifft(inputSymbols,length(inputSymbols)); numSymbols = length(inputSymbols); % Insert CP Tx_ofdm = [TxSamples(numSymbols-CPsize+1:numSymbols) TxSamples]; % AWGN channel numSymbols_2 = length(inputSymbols); tmp = randn(1,numSymbols_2+CPsize); noisePower = 10^(-SNR(n)/10); RxSymbols = Tx_ofdm + sqrt(noisePower)*tmp; % Remove CP EstSymbols_1 = RxSymbols(CPsize+1:numSymbols_2+CPsize); % IFT (OFDM Demodulation) Y = fft(EstSymbols_1,length(EstSymbols_1)); % Detection and decide EstSymbols_1 = Y; EstSymbols_1 = sign(real(EstSymbols_1)); for i = 1:length(EstSymbols_1) if EstSymbols_1(i)>0 Decis(i)= 1; else Decis(i)= 0; end end % if mode_Sim==2 % Convolution code Decoder EstSymbols = FWC_COV_Dencoder(G,k0,Decis); else EstSymbols = EstSymbols_1; end % % Check for Error if mode_Sim==2 I = find((data-EstSymbols) == 0); else I = find((data2-EstSymbols) == 0); end % Countered Errors errCount = errCount + (FFTsize-length(I)); end SER(n,:) = errCount / (FFTsize*numRun); end %======================================================================== == if mode_Sim ==2 save MA_07_BPSK_OFDM_CC_AWGN.mat; figure(1); G = semilogy(SNR,SER,'-vr'); TRANG 26 ĐỒN ĐỨC TÌNH - B18DCVT362 title(['Mô SER hệ thống BPSK OFDM kênh AWGN voi mà hóa kênh; Số bit mô = ', num2str(NumBits),' bits '],'FontName','.VnTime','color','b','FontSize',16); LT=legend('OFDM - kªnh AWGN cã m· hãa kªnh'); set(LT,'fontname','.Vntime','fontsize',16); else save MA_07_BPSK_OFDM_NoCC_AWGN.mat; figure(1); G = semilogy(SNR,SER,'-ob'); title(['Mô SER hệ thống BPSK OFDM kênh AWGN; Sè bit m« pháng = ',num2str(NumBits),' bits ', ],'FontName','.VnTime','color','b','FontSize',16); LT=legend('OFDM - kênh AWGN không mà hóa kênh'); set(LT,'fontname','.Vntime','fontsize',16); end set(G,'LineWidth',1.5); AX = gca; set(AX,'fontsize',14); X=xlabel('SNR (dB)'); set(X,'fontname','.Vntime','fontsize',14,'color','b'); Y=ylabel('SER'); set(Y,'fontname','.Vntime','fontsize',14,'color','b'); grid on; % Câu lệnh Giải thích Ghi Clc; Xóa tất đầu vào đầu từ hình Command Window Clear; Xóa tất biến khỏi vùng làm việc, giải phóng nhớ hệ thống Close all; Đóng tất xóa tất số liệu mà không xử lý ẩn SNR = [0:1:9]; Tỉ số tín hiệu tạp âm FFTsize = 512; Số điểm FFT CPsize = 20; Kích cỡ CP numRun = 10^3; Tổng số chạy (số lần lấy mẫu kênh AWGN) NumBits = FFTsize*numRun; Tổng số bit mode_Sim = 2; OFDM có mã kênh khơng có mã kênh TRANG 27 ĐỒN ĐỨC TÌNH - B18DCVT362 Sử dụng mã hóa xoắn để mã hóa kênh Codding_Type = Ma trận tạo mã hóa xoắn if mode_Sim ==2 if Codding_Type == k0 = 1; G = [1 1;1 1]; elseif Codding_Type == k0 = 1; G = [1 1 0 1;1 1 0]; else k0 = 2; G = [0 1 0 1;0 0 0 0 1;1 0 0 0 1]; end end Khi mode_Sim = 2: - Nếu Codding_Type = : k0 = 1, ma trận G = [1 1; 1] GT = - Nếu Codding_Type = : k0 = ma trận G = [1 1 0 1; 1 1 0] GT = - Ngược lại, codding_Type khác : k0 = ma trận G = [0 1 0 1; 0 0 0 1; 0 0 0 1] for n = 1:length(SNR), errCount = 0; for k = 1:numRun numSymbols = FFTsize; data = 0.5*(sign(rand(1,numSymbols)-0.5)+1); data2 = 2*data-1; Tạo tín hiệu BPSK if mode_Sim ==2 inputSymbols FWC_COV_Encoder(G,k0,data); inputSymbols 2*inputSymbols-1; else inputSymbols 2*data-1; end Bộ mã hóa chuyển đổi = sang lưỡng cực = = TxSamples = sqrt(length(inputSymbols)) *ifft(inputSymbols, length(inputSymbols)); numSymbols = length(inputSymbols); Đầu vào IFFT Tx_ofdm = [TxSamples(numSymbolsCPsize+1:numSymbols) TxSamples]; Chèn CP numSymbols_2 = length(inputSymbols); tmp = randn(1,numSymbols_2+CPsize); noisePower = 10^(SNR(n)/10); Tạo kênh AWGN liệu qua TRANG 28 kênh AWGN ĐỒN ĐỨC TÌNH - B18DCVT362 RxSymbols sqrt(noisePower)*tmp; = Tx_ofdm + EstSymbols_1 = RxSymbols(CPsize+1:numSymbols_2+CPsize); Y = fft(EstSymbols_1,length(EstSymbols_1)); Khử CP EstSymbols_1 = Y; EstSymbols_1 = sign(real(EstSymbols_1)); for i = 1:length(EstSymbols_1) if EstSymbols_1(i)>0 Decis(i)= 1; else Decis(i)= 0; end end Tách sóng quết định cứng if mode_Sim==2 EstSymbols = FWC_COV_Dencoder(G,k0,Decis); else EstSymbols = EstSymbols_1; end Giải mã chuyển đổi if mode_Sim==2 I = find((data-EstSymbols) == 0); else I = find((data2-EstSymbols) == 0); end So sánh kiểm tra lỗi đếm lỗi errCount = errCount + (FFTsizelength(I)); end SER(n,:) = errCount / (FFTsize*numRun); Đếm lỗi TRANG 29 Giải điều chế OFDM FFT - Nếu > đầu - Ngược lại đầu ĐỒN ĐỨC TÌNH - B18DCVT362 1.11.2 Mô nhận xét Nhận xét: Tỉ số SNR lớn SER giảm Nhận xét: - Tỷ số SNR tỉ lệ lỗi có mã kênh nhỏ khơng có mã kênh - SNR tăng SER giảm - Mã hóa kênh cho tốc độ giảm lỗi cao khơng có mã hóa kênh -> OFDM - AWGN có mã hóa kênh tối ưu TRANG 30 ... SIM_MA_06 1.1 Mục tiêu Làm sáng tỏ q trình xây dựng mơ hình ngun lý hoạt động hệ thống truyền dẫn OFDM sở IFFT/FFT chèn khử CP Trực quan hóa nguyên lý hoạt động sở mô tả mô Matlab 1.2 Nội dung TRANG... 1.9 Mục tiêu Mơ hình hóa trực quan hóa ngun lý hoạt động hệ thống BPSK -OFDM dùng mã kênh mô trường AWGN Matlab hóa mơ hệ thống BPSK -OFDM- AWGN 1.10 Nội dung 1.11 Sim_MA_07_BPSK _OFDM_ AWGN_ChannelCode... tín hiệu đầu vào OFDM OFDM đầu điều chế để vẽ đồ thị mô subplot(2,2,1); Chia figure để vẽ hình plot(f,PSD _ofdm_ in,''r'', ''LineWidth'',3); Vẽ đồ biểu diễn PSD tín hiệu đầu vào khối OFDM theo tần