Điều chế và giải điều chế tín hiệu OFDM trên cơ sở không gian tín hiệu
B Điều chế và giải điều chế tín hiệu OFDM trên cơ sở không gian tín hiệu :
- Luồng dữ liệu đầu vào 𝑋 0,𝑘 ; 𝑋 1,𝑘 ; 𝑋 2,𝑘 ; … 𝑋 𝑁−1,𝑘 qua khối xử lí số liệu S/P tách thành các luồng dữ liệu con được điều chế độc lập :
- Sau đó các luồng con này được tổng hợp lại tạo nên tín hiệu s(t) trước khi gửi lên kênh truyền pha ding
- Sau khi đi qua kênh truyền ở phía thu ta được tín hiệu y(t)
+ y(t) = s(t) * h(t) + n(t) ( h(t) – đáp ứng xung của kênh truyền ; n(t) là thành phần tạp âm của kênh truyền )
- Sau đó tín hiệu y(t) được đưa vào bộ nhân kết hợp với các thành phần
- Sau đó tín hiệu tiếp tục được đưa qua bộ tích phân
- Sau bộ tích phân ta thu được các tín hiệu 𝑋 ^ 𝑖,𝑘 𝑣ớ𝑖 𝑖 = 0 ,1,2, 𝑁 − 1
- Nhờ có tính chất trực giao của các sóng mang con 𝑔 𝑖,𝑘 (𝑡) 𝑡𝑎 𝑡á𝑐ℎ đượ𝑐 𝑋 𝑖,𝑘
❖ Tính chất trực giao giữa các sóng mang con
Minh họa tín hiệu và phổ tín hiệu OFDM trong băng tần gốc
Tín hiệu OFDM có chu kỳ gấp N lần so với tín hiệu băng gốc, dẫn đến độ rộng phổ của tín hiệu OFDM giảm xuống N lần so với tín hiệu gốc Điều này cho phép tín hiệu OFDM chứa nhiều thành phần phổ con trong băng tần đã được xác định.
D Mô tả phổ của OFDM trong băng tần gốc trên Matlab
➢ Khai báo và khởi tạo các tham số đầu vào
* Xét BW = 500Hz ; Delta_f = 100Hz
- Hai hình trên biểu thị phổ tần của tín hiệu cơ sở đơn sóng mang tại giá trị f=0 và f = frf, độ rộng phổ là 2/Tb Băng thông BW
Hình ảnh dưới đây thể hiện phổ tần của tín hiệu OFDM Băng thông (BW) được điều chế OFDM với nhiều sóng mang con, tạo ra nhiều phổ con trong băng tần, với khoảng cách giữa các băng con là delta_f Số lượng sóng mang con được xác định bằng công thức: BW/delta_f.
→ Nhận xét : So sánh PSD của các tín hiệu
- Phổ tần của tín hiệu
Tín hiệu OFDM có phổ tần bao gồm nhiều thành phần sóng mang con, mỗi thành phần có độ rộng phổ là 2/T_ofdm Khoảng cách giữa các tần số trung tâm là deta_f = 1/T_ofdm, bắt đầu từ tần số trung tâm fal_f Độ rộng băng tần của tín hiệu này được xác định là BW.
Phổ tín hiệu OFDM RF có nhiều thành phần sóng mang tương tự như tín hiệu OFDM với nhiều sóng mang Tuy nhiên, điểm khác biệt chính là tần số trung tâm của OFDM RF bắt đầu từ f = frf.
➢ Dịch đoạn code chương trình :
STT Câu lệnh Giải thích Ghi chú
1 Clc ; Xóa cửa sổ lệnh
2 Clear ; Xóa các mục khỏi không gian
12 làm việc, giải phóng bộ nhớ hệ thống
3 Close all ; Xóa tất cả hình đã chỉ định
5 BW_channel = 200; - Khai báo BW_channel 200 ( Băng thông kênh )
6 num_subcarrier round(BW_channel/deta_f);
- Khai báo num_subcarrier (số lượng thành phần sóng mang)
7 T_ofdm = 1/deta_f; - Khai báo T_ofdm = 1/deta_f
8 R_ofdm = 1/T_ofdm; - Khai báo R_ofdm 1/T_ofdm
9 Tb = T_ofdm/num_subcarrier; - Khai báo Tb T_ofdm/num_subcarrier
10 Rb = 1/Tb; - Khai báo Rb = 1/Tb
12 AA = A^2*T_ofdm; - Khai báo AA =
13 f_i deta_f:deta_f:BW_channel+deta_f;
- Khai báo f_i là 1 mảng có các giá trị bắt đầu từ deta_f -
> BW_channel+deta_f Khoảng cách là deta_f
14 f = -Rb:BW_channel+4*deta_f; - Khai báo f là mảng gồm các giá trị từ -Rb đến BW_channel+4*deta_f
15 fc = 3*max(f); - Khai báo fc = 3 * max(f)
- Khai báo f2 là mảng gồm cá giá trị từ -f đến fc+BW_channel+4*deta_f
17 PSD_ofdm_in A1*(sinc((f*Tb)).^2);
- Khai báo PSD_ofdm_in A1*(sinc((f*Tb)).^2);
18 PSD_RF_SC = A1*(sinc(((f2- fc)*Tb)).^2);
- Khai báo PSD_RF_SC A1*(sinc(((f2-fc)*Tb)).^2);
19 PSD_OFDM zeros(num_subcarrier,max(size(f)));
- Khai báo PSD_OFDM là 1 mảng zeros gồm num_subcarrier hàng x max(size(f)) cột
PSD_OFDM(k,:) AA*(sinc((f-f_i(k))*T_ofdm)).^2;
PSD_OFDM_RF(k,:) AA*(sinc((f2-f_i(k)- fc)*T_ofdm)).^2; (2) end (3)
-(*) Bắt đầu vòng lặp for cho k từ 1 -> num_subcarrier PSD_OFDM(k,:) ( Giá trị - (1)PSD_OFDM tại hàng thứ k của các cột ) = AA*(sinc((f- f_i(k))*T_ofdm)).^2
-(2) PSD_OFDM_RF(k,:) ( Giá trị -(1)PSD_OFDM_RF tại hàng thứ k của các cột ) AA*(sinc((f2-f_i(k)- fc)*T_ofdm)).^2 -(3) Kết thúc vòng lặp for (*)
21 PSD_OFDM_sum_RF sum(PSD_OFDM_RF,'double');
- Khai báo PSD_OFDM_sum_RF = tổng PDS_OFDM_RF kiểu dữ liệu double
21 Các lệnh tiếp theo cấu tạo figure
Mô hình hóa hệ thống truyền dẫn OFDM trên cơ sở thực hiện IFFT/FFT và chèn/khử CP
IFFT/FFT và chèn/khử CP
❖ Minh họa thực hiện IFFT/FFT trên mathlab
❖ Thực hiện mô phỏng trên mathlab
➢ Khởi tạo ma trận W H và ma trận W thủ công
➢ Tích của 2 ma trận W H và W
→ Nhận xét : Kết quả đúng là ma trận đơn vị I[nxn]
➢ Thực hiện biến đổi FFT/IFFT của dãy số liệu đầu vào
Kết quả đầu ra từ biến đổi IFFT và FFT là giống nhau, không có sự khác biệt Điều này cho thấy rằng việc sử dụng biến đổi FFT kết hợp với IFFT cho phép chúng ta đạt được đầu ra tương ứng với đầu vào mong muốn.
➢ Khởi tạo ma trận IFFT và FFT theo hình thức dùng vòng lặp for
→ Nhận xét : So sánh với kết quả tạo W_H và W theo thủ công thì kết quả không có sự khác biệt → Chương trình tạo đúng
➢ Giải thích đoạn code chương trình :
STT Câu lệnh Giải thích Ghi chú
1 Clc ; Xóa cửa sổ lệnh
2 Clear ; Xóa các mục khỏi không gian làm việc, giải phóng bộ nhớ hệ thống
3 Close all ; Xóa tất cả hình đã chỉ định
1 exp(j*2*pi/4) exp(j*4*pi/4) exp(j*6*pi/4);
1 exp(j*4*pi/4) exp(j*8*pi/4) exp(j*12*pi/4);
1 exp(j*6*pi/4) exp(j*12*pi/4) exp(j*2*3*3*pi/4)];
- Khởi tọa ma trận W_H có các giá trị như bên
1 exp(-j*2*pi/4) exp(- j*4*pi/4) exp(-j*6*pi/4);
- Khởi tạo ma trận W có các giá trị như bên
1 exp(-j*4*pi/4) exp(- j*8*pi/4) exp(-j*12*pi/4);
1 exp(-j*6*pi/4) exp(- j*12*pi/4) exp(-j*2*3*3*pi/4)];
8 test = abs(W_H*W) - Tính giá trị modul của tích
- (2) Tạo ma trận W_H_2 là ma trận toàn 0 có N phần tử
- (*) Bắt đầu vòng for cho i chạy từ 1:N
- (**) Bắt đầu vòng for con trong (*) cho m chạy từ 1 :N -(1) W_H_2(i,m) phần tử ở vị trí hàng i cột m exp(j*2*pi/N*(i-1)*(m-1)) -(2) kết thúc (**)
13 W_2 = zeros(N); Tạo ma trận W_2 là ma trận toàn 0 có N phần tử
(*) Bắt đầu vòng for cho i chạy từ m:N
- (**) Bắt đầu vòng for con trong (*) cho i chạy từ 1 :N -(1) W_H_2(m,i) phần tử ở vị trí hàng m cột i = exp(- j*2*pi/N*(m-1)*(i-1));
Chèn CP/ Khử CP
❖ Thực hiện mô phỏng chèn/khử CP trên mathlab
➢ Tạo ma trận chèn Cp trên mathlab
→ Nhận xét : Kết quả đúng với lí thuyết
➢ Tạo ma trận khử CP trên mathlab
→ Kết quả : Ma trận khử CP với N =8 và V =2
→ Nhận xét : Kết quả đúng với lí thuyết
➢ Giải thích đoạn code chương trình
STT Câu lệnh Giải thích Ghi chú
- Tạo function MA_06_CP_insert với đầu vào là N & V Đầu ra là
2 O_I = zeros(V,N); - Khai báo O_I là mảng toàn
3 O_V_N_V = zeros(V,N-V); - Khai báo 0_V_N_V là mảng toàn 0 gồm V hàng và N-V cột
4 I_V = eye(V); - Khai báo I_V là ma trận đơn vị kích thước VxV
-(*) Bắt đầu vòng for cho i chạy từ 1:V
-(1) O_I hàng thứ i của tất cả các cột = [O_V_N_V(i,:) I_V(i,:)]
6 I_N = eye(N); - Khai báo I_N là ma trận đơn vị NxN
7 CP_insert = [O_I;I_N]; - Gán CP_insert = [O_I;I_N]
STT Câu lệnh Giải thích Ghi chú
1 function [CP_Remve] MA_06_CP_Remove(N,V)
- Tạo function MA_06_CP_Remove với đầu vào là N & V Đầu ra là CP_Remove
2 CP_Remve = zeros(N,N+V); - Khai báo CP_Remve là mảng toàn 0 gốm N hàng x N+V cột
3 O_V = zeros(N,V); - Khai báo O_V = là mảng toàn 0 gồm N hàng x V cột
4 I_N = eye(N); - Khai báo I_N là ma trận đơn vị kích thước NxN
-(*) Bắt đầu vòng for cho i chạy từ 1:N
-(1) CP_Remve(i,:) (hàng thứ i của tất cả các cột ) [O_V(i,:) I_N(i,:)];
Bài mô phỏng này so sánh quy trình thực hiện IFFT/FFT với việc chèn và khử CP, thông qua việc nhân ma trận Quy trình được thực hiện theo từng khối trong sơ đồ và kỹ thuật trong MATLAB, nhằm đơn giản hóa quá trình này.
TH1 : Xử lí từng bước theo nhân ma trận
❖ Khởi tạo tham số đầu vào : N ; V
❖ Tạo chuỗi đầu vào mô phỏng và các ma trận IFFT/FFFT ; Chèn/khử CP
❖ Thực hiện xử lí IFFT/FFT và chèn/khử CP theo từng bước :
→ Nhận xét : Kết quả đầu vào và đầu ra giống nhau nên quá trình xử lí là chính xác
TH2 : Xử lí các bước theo biến đổi ma trận trong mathlab
❖ Dùng hàm ifft trong mathlab để xử lí IFFT
❖ Dùng kĩ thuật biến đổi ma trận trong mathlab xử lí quá trình chèn CP
❖ Dùng kĩ thuật biến đổi ma trận trong mathlab xử lí quá trình khử CP
❖ Dùng hàm fft trong mathlab xử lí quá trình FFT
Kết quả đầu ra của hai quá trình biến đổi OFDM (IFFT/FFT và chèn/khử CP) hoàn toàn giống nhau Việc sử dụng MATLAB để xử lý các quá trình này giúp đơn giản hóa thao tác mà vẫn đảm bảo tính chính xác của kết quả.
STT Câu lệnh Giải thích Ghi chú
1 Clc ; Xóa cửa sổ lệnh
2 Clear ; Xóa các mục khỏi không gian làm việc, giải phóng bộ nhớ hệ thống
3 Close all ; Xóa tất cả hình đã chỉ định
Khai báo các giá trị N và
[CP_insert] MA_06_CP_insert(N,V);
[CP_Remve] MA_06_CP_Remove(N,V);
-(1) Khởi tạo chuỗi nhị phân X1 đầu vào
- Các lệnh tiếp theo tạo các ma trận IFFT/FFT và chèn/khử CP từ function đã tạo trước đó
Thực hiện xử lí IFFT/FFT và chèn khử
CP theo dạng ma trận
- X6 là đầu ra chèn CP
- X9 là đầu ra khử CP
- X13 chuyển bị X12 để được chuỗi bit dạng 1xN
7 data_IFFT = sqrt(N)*ifft(X1,N); - Xử lí IFFT bằng sử dụng lệnh ifft trong mathlab chuỗi X1
8 data_IFFT_CP = [data_IFFT(N-V+1:N) data_IFFT];
Thực hiện chèn CP theo xử lí ma trận trong matlab
Chuỗi đầu ra khử CP là một vector ghép từ 2 vector con
[data_IFFT(N-V+1:N) – data_IFFT các giá trị từ N-V+1 đến N ] ghép với data_IFFT
9 data_CPR data_IFFT_CP(V+1:N+V);
- Chuỗi đầu ra khử CP là một vector con của data_IFFT_CP các giá trị từ V+1 đến N+V
10 data_FFT (1/sqrt(N))*fft(data_CPR,N)
- Xử lí FFT bằng sử dụng lênh fft trong mathlab
Mô hình hóa và mô phỏng hiệu năng BER cho hệ thống truyền dẫn BPSK-OFDM dùng mã kênh trong môi trường kênh AWGN
- Mô hình hóa và trực quan hóa nguyên lý hoạt động của hệ thống BPSK-
OFDM dùng mã kênh trong môi trường kênh AWGN
Bài viết này tập trung vào việc Matlab hóa và mô phỏng hệ thống BPSK-OFDM sử dụng mã kênh trong môi trường kênh AWGN Mục tiêu là làm sáng tỏ nguyên lý hoạt động của hệ thống và phân tích, đánh giá hiệu năng của nó.
- Xây dựng và trình bày nguyên lý hoạt động quá trình điều chế/giải điều chế OFDM trên cơ sở không gian tín hiệu
- Xây dựng mô hình và nguyên lý hoạt động hệ thống BPSK-OFDM dùng mã kênh trong môi trường kênh AWGN
- Tiến trình mô phỏng: Lưu đồ mô phỏng và thực hiện mô phỏng hệ thống BPSK-OFDM dùng mã kênh trong môi trường kênh AWGN
- Matlab hóa và mô phỏng hiệu năng BER của hệ thống BPSK-OFDM dùng mã kênh trong môi trường kênh AWGN
- Thực hiện mô phỏng trên Matlab để: sáng tỏ nguyên lý hoạt động và khảo sát đánh giá hiệu năng BER.
Mô hình hóa và mô phỏng hệ thống truyền dẫn
❖ Thực hiện mô phỏng trên mathlab
➢ Thiết lập tham số mô phỏng
➢ Xử lí IFFT/FFT và chèn/khử CP
➢ Quyết định đầu ra và thực hiện so sánh lỗi
• Thực hiện so sánh lỗi
→ Nhận xét : Thực hiện mô phỏng trên 512 bit thì có 133 bit bị lỗi sau khi quyết định ở phía thu
STT Câu lệnh Giải thích Ghi chú
1 Clc ; Xóa cửa sổ lệnh
2 Clear ; Xóa các mục khỏi không gian làm việc, giải phóng bộ nhớ hệ thống
3 Close all ; Xóa tất cả hình đã chỉ định
CPsize = 20; (2) snr_in_dB = 10; (3) noisePower = 10^(-snr_in_dB/10);
- (3) Khai báo giá trị SNRdB ;
-(4) Gán noise power 10^(-snr_in_dB/10)
- (1) Sử dụng hàm rand để tạo chuỗi dữ liệu đầu vào và xử lí đưa về dạng
- (2) Đưa chuỗi đơn cực về lưỡng cực
6 data_IFFT = ifft(data); - Thực hiện IFFT chuỗi dữ liệu đầu vào và gán vào data_IFFT
7 data_IFFT_CP = [data_IFFT(FFTsize-
- Thực hiện chèn CP của chuỗi dữ liệu sau IFFT
- (1) Tạo thành phần tạp âm random theo phân bố gauss
- (2) Nhân với công suất tạp âm
- (3) Dữ liệu đầu ra khi qua kênh bằng dữ liệu đầu vào + tạp âm
9 data_CPR RxSymbols(CPsize+1:FFTsize+CPsize);
10 data_FFT = fft(data_CPR); - Xử lí FFT
11 data_des1 = zeros(1, length(data)); - Khởi tạo mảng giá trị đầu ra sau quyết định
12 for i = 1:length(data_FFT) (*) if data_FFT(i) >= 0 (1) data_des1(i) = 1; (2) else (3) data_des1(i) = -1; (4) end (5) end (6)
- (*) Bắt đầu vong for cho i chạy từ 1-
-(1) Bắt đầu vòng đk : Nếu data_FFT(i)>=0 thì quyết định đầu ra =1; else đầu ra bằng 0
13 error_vector1 = data~a_des1; - So sánh bit đầu vào và bit sau quyết định
14 num_error1 = sum(error_vector1) - Tính tổng số bit lỗi
15 BER = num_error1/FFTsize - Tỉ lệ lỗi bit BER
B Mô hình hóa và mô phỏng hệ thống truyền dẫn BPSK-OFDM dùng mã hóa kênh trong kênh AWGN
❖ Thực hiện mô phỏng trên mathlab
➢ Khởi tạo các tham số đầu vào :
➢ Xác định hệ số và ma trận mã hóa kênh theo mã hóa xoắn
➢ Thực hiện mô phỏng tính toán
→ Nhận xét : Kết quả mô phỏng hệ thống BPSK OFDM trong kênh AWGN
- SNR càng lớn thì tỉ lệ lỗi càng giảm - > đúng với thực tế
So sánh khi có mã hóa kênh và không mã hóa kênh :
+ Ở cùng 1 giá trị SNR thì tỉ lệ lỗi khi có mã hóa kênh nhỏ hơn khi không mã hóa
- Tốc độ giảm lỗi khi SNR tăng cao của mã hóa kênh lớn khi không mã hóa
-> Hệ thống tối ưu hơn khi mã hóa kênh
➢ Giải thích đoạn mã chương trình
STT Câu lệnh Giải thích Ghi chú
1 Clc ; Xóa cửa sổ lệnh
2 Clear ; Xóa các mục khỏi không gian làm việc, giải phóng bộ nhớ hệ thống
3 Close all ; Xóa tất cả hình đã chỉ định
- Khai báo các tham số đầu vào của quá trình mô phỏng
-(4) Tham số numRun thể hiện số lần lấy mẫu kênh AWGN
5 mode_Sim = 2; % 1 for No channel code - Xác định mode
% 2 for channel coding (OFDM with channel coding)
Matrix if mode_Sim ==2 if Codding_Type == 1 k0 = 1;
0 0 0 0 0 1]; end end mô phỏng và loại mã hóa mô phỏng
- Sử dụng mã hóa xoắn để mã hóa kênh
Mỗi loại Codding _Type là một dạng ma trận mã hóa xoẵn khác nhau
6 for n = 1:length(SNR) (*) - Bắt đầu vòng for
(*) thực hiện mô phỏng theo các giá trị SNR
- Các lệnh tiếp theo nằm trong vòng for (*)
% Generated BPSK data numSymbols = FFTsize; data 0.5*(sign(rand(1,numSymbols)-0.5)+1); data2 = 2*data-1;
- (1) Khởi tạo số lượng lỗi ban đầu
-(**) Bắt đầu vòng for k = 1: numRun
- Các lệnh tiếp theo thực hiện điều chế dữ liệu BPSK
8 if mode_Sim ==2 % Convolution code Encoder inputSymbols FWC_COV_Encoder(G,k0,data); inputSymbols = 2*inputSymbols-1; else inputSymbols = 2*data-1; end
- Xác định mode_Sim để mã hóa xoắn chuỗi dữ liệu
- Sau đó chuyển sang dạng lưỡng cực.