lOMoARcPSD| 58737056
ÔN TẬP MÔN MÔ PHỎNG
I. LÝ THUYẾT
1. Máy phát là gì ? Máy thu là gì ? Em có nhận xét gì về máy phát và máy thu trong
một hệ thống mạng viễn thông đơn giản ?
Bài làm:
- Máy phát (Transmitter): Máy phát là thiết bị được sử dụng để chuyển đổi tín hiệu từ
dạng analog hoặc số sang dạng tín hiệu phù hợp để truyền đi qua mạng.
- Máy thu (Receiver): Máy thu là thiết bị được sử dụng để nhận và xử lý tín hiệu được gửi
từ máy phát. Nó có khả năng chuyển đổi tín hiệu nhận được thành dạng số hoặc analog
để có thể được sử dụng bởi các thiết bị hoặc hệ thống khác.
- Trong một hệ thống mạng viễn thông đơn giản, máy phát và máy thu thường được sử
dụng chung với nhau để truyền và nhận dữ liệu. Máy phát chuyển đổi tín hiệu từ dạng
đầu vào (ví dụ: âm thanh, dữ liệu số) thành tín hiệu có thể truyền đi, trong khi máy thu
nhận tín hiệu đó và chuyển đổi nó thành dạng có thể sử dụng cho mục đích tiếp theo (ví
dụ: âm thanh, dữ liệu số).
2. Thế nào là kỹ thuật select combining (SC) ?
Bài làm:
- Kỹ thuật Select Combining (SC) là một kỹ thuật trong viễn thông không dây được sử
dụng để cải thiện chất lượng của tín hiệu nhận bằng cách chọn ra tín hiệu tốt nhất từ
nhiều anten (hoặc từ nhiều bản sao của cùng một tín hiệu) để kết hợp lại.
- Trong kỹ thuật này, tín hiệu từ mỗi anten (hoặc từ mỗi bản sao) được đưa vào một hộp
chọn (selector). Hộp chọn này sẽ chọn ra tín hiệu có chất lượng tốt nhất dựa trên các tiêu
chí như mức độ tín hiệu và nhiễu, độ trễ, hoặc sự suy giảm trong kênh truyền. Sau đó, tín
hiệu được chọn này sẽ được truyền đến bộ thu để tiếp tục xử lý.
3. Xác suất dừng là gì ? Để đánh giá xác suất dừng ta cần dựa vào yếu tố nào ?
Bài làm:
- Xác suất dừng là xác suất mà một quá trình ngẫu nhiên sẽ kết thúc hoặc dừng lại tại một
trạng thái nhất định. Trong lý thuyết xác suất và quá trình ngẫu nhiên, việc đánh giá xác
suất dừng là một phần quan trọng để hiểu hành vi của các quá trình ngẫu nhiên.
- Để đánh giá xác suất dừng, chúng ta cần dựa vào các yếu tố sau:
+) Trạng thái của quá trình: Xác định tất cả các trạng thái mà quá trình có thể đạt
được. Đối với mỗi trạng thái, chúng ta cần biết liệu quá trình có thể dừng lại ở đó hay
không.
lOMoARcPSD| 58737056
+) Xác suất chuyển đổi: Đánh giá xem từ mỗi trạng thái, quá trình có thể di chuyển đến
các trạng thái khác với xác suất bao nhiêu. Xác xuất chuyển đổi này cung cấp thông tin
về khả năng của quá trình di chuyển tù trạng thái này sang trạng thái khác.
+) Điều kiện dừng: Xác định điều kiện hoặc sự kiện nào khiến cho quá trình ngừng hoạt
động và dừng lại ở một trạng thái cụ thể. Có thể là một trạng thái dừng hoặc một điều
kiện dừng khác nhau như thời gian, số lần lặp, hoặc một sự kiện xác định.
II. BÀI TẬP
1. Mô phỏng kênh truyền nhiễu trắng với điều chế MPSK, DPSK MQAM và
kiểm chứng với lý thuyết.
Bài làm:
- Code:
clc; clear; close all;
%% Thông số hệ thống
M_MPSK = 8; % Số mức điều chế M-PSK
M_DPSK = 8; % Số mức điều chế M-DPSK
M_QAM = 16; % Số mức điều chế M-QAM
EbN0_dB = 0:1:15; % Dải giá trị Eb/N0 (dB)
numBits = 1e5; % Số bit truyền
%% Khởi tạo BER ber_MPSK =
zeros(size(EbN0_dB)); ber_DPSK =
zeros(size(EbN0_dB)); ber_QAM =
zeros(size(EbN0_dB));
%% Vòng lặp mô phỏng
for i = 1:length(EbN0_dB)
EbN0 = 10^(EbN0_dB(i)/10); % Chuyển Eb/N0 từ dB sang tuyến tính
N0 = 1 / EbN0; % Công suất nhiễu phù hợp
%% Tạo dữ liệu bit ngẫu nhiên data_MPSK
= randi([0 M_MPSK-1], numBits, 1); data_DPSK
= randi([0 M_DPSK-1], numBits, 1); data_QAM
= randi([0 M_QAM-1], numBits, 1);
%% Điều chế
lOMoARcPSD| 58737056
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_DPSK
= dpskmod(data_DPSK, M_DPSK, 0, 'gray'); mod_QAM =
qammod(data_QAM, M_QAM, 'UnitAveragePower', true);
%% Truyền qua kênh AWGN
noise_MPSK = sqrt(N0/2) * (randn(size(mod_MPSK)) + 1i *
randn(size(mod_MPSK)));
noise_DPSK = sqrt(N0/2) * (randn(size(mod_DPSK)) + 1i *
randn(size(mod_DPSK)));
noise_QAM = sqrt(N0/2) * (randn(size(mod_QAM)) + 1i * randn(size(mod_QAM)));
received_MPSK = mod_MPSK + noise_MPSK;
received_DPSK = mod_DPSK + noise_DPSK;
received_QAM = mod_QAM + noise_QAM;
%% Giải điều chế demod_MPSK = pskdemod(received_MPSK, M_MPSK, 0,
'gray'); demod_DPSK = dpskdemod(received_DPSK, M_DPSK, 0, 'gray');
demod_QAM = qamdemod(received_QAM, M_QAM, 'UnitAveragePower', true);
%% Tính BER ber_MPSK(i) = sum(demod_MPSK ~=
data_MPSK) / numBits; ber_DPSK(i) = sum(demod_DPSK ~=
data_DPSK) / numBits; ber_QAM(i) = sum(demod_QAM ~=
data_QAM) / numBits; end
%% Vẽ đồ thị BER
figure;
semilogy(EbN0_dB, ber_MPSK, 'r-o', 'LineWidth', 1.5); hold on;
semilogy(EbN0_dB, ber_DPSK, 'b-s', 'LineWidth', 1.5);
semilogy(EbN0_dB, ber_QAM, 'g-^', 'LineWidth', 1.5); grid on;
xlabel('Eb/N0 (dB)'); ylabel('Tỷ lệ lỗi bit (BER)'); title('So sánh
BER trên kênh AWGN'); legend('MPSK', 'DPSK', 'MQAM');
- Kết quả:
lOMoARcPSD| 58737056
- Giải thích:
🔹 Khởi tạo tham số
M_MPSK = 8; % 8-PSK
M_DPSK = 8; % 8-DPSK
M_QAM = 16; % 16-QAM
EbN0_dB = 0:1:15; % Dải giá trị Eb/N0 từ 0 đến 15 dB
numBits = 1e5; % Số lượng dữ liệu giả lập: 100,000 bit
Mỗi loại điều chế có số mức khác nhau → ảnh hưởng đến số bit/mã.
Dải Eb/N0 càng rộng giúp đánh giá độ bền của sơ đồ điều chế trong nhiều môi trường
nhiễu.
🔹 Khởi tạo mảng BER ber_MPSK
= zeros(size(EbN0_dB)); ber_DPSK
= zeros(size(EbN0_dB)); ber_QAM
= zeros(size(EbN0_dB));
Dùng để lưu kết quả BER tương ứng với từng giá trị Eb/N0.
lOMoARcPSD| 58737056
🔄 Vòng lặp mô phỏng với từng Eb/N0 1.
Chuyển đổi Eb/N0 từ dB sang tuyến tính:
EbN0 = 10^(EbN0_dB(i)/10);
N0 = 1 / EbN0;
N0 là mật độ công suất nhiễu (giả định công suất tín hiệu là 1).
Từ đó tính toán độ lớn nhiễu để thêm vào tín hiệu.
2. Sinh dữ liệu ngẫu nhiên:
data_MPSK = randi([0 M_MPSK-1], numBits, 1);
data_DPSK = randi([0 M_DPSK-1], numBits, 1);
data_QAM = randi([0 M_QAM-1], numBits, 1);
Sinh ngẫu nhiên các ký hiệu (symbol) tương ứng với từng điều chế.
3. Điều chế (modulation):
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_DPSK =
dpskmod(data_DPSK, M_DPSK, 0, 'gray'); mod_QAM =
qammod(data_QAM, M_QAM, 'UnitAveragePower', true); pskmod &
qammod: thực hiện điều chế.
gray: dùng mã hóa Gray giúp giảm BER.
UnitAveragePower: chuẩn hóa công suất trung bình về 1 (QAM).
4. Thêm nhiễu AWGN:
noise = sqrt(N0/2) * (randn + 1i*randn); % Nhiễu phức
received = modulated + noise;
Mỗi sơ đồ điều chế được cộng thêm nhiễu phức Gaussian trắng.
Dạng sqrt(N0/2) đảm bảo phương sai đúng theo lý thuyết AWGN.
5. Giải điều chế:
demod = pskdemod / dpskdemod /
qamdemod Biến tín hiệu nhiễu quay lại ký
hiệu số. Dùng đúng hàm với từng loại điều
chế.
6. Tính BER:
lOMoARcPSD| 58737056
ber = sum(demod ~= data) / numBits; So
sánh dữ liệu sau giải điều chế với dữ liệu gốc.
Đếm lỗi và chia cho tổng số ký hiệu → ra BER.
📊 Vẽ đồ thị BER
semilogy(EbN0_dB, ber, ...)
Trục tung (BER) dùng thang logarit (log10).
Dễ thấy được xu hướng giảm BER khi tăng Eb/N0.
📌 KẾT QUẢ KỲ VỌNG
MPSK và QAM có BER tốt hơn DPSK, nhất là khi Eb/N0 cao.
QAM thường có hiệu suất tốt hơn ở tốc độ cao, nhưng đòi hỏi thiết bị giải điều chế phức
tạp hơn.
DPSK có ưu thế khi kênh bị trễ pha vì không cần đồng bộ pha, nhưng BER cao hơn.
📚 KIỂM CHỨNG VỚI LÝ THUYẾT
Bạn có thể so sánh với công thức BER lý thuyết của từng loại điều chế như sau:
2. Mô phỏng kênh truyền Rayleigh với điều chế MPSK, QMAM và so sánh với lý
thuyết.
Bài làm:
lOMoARcPSD| 58737056
- Code:
clc; clear; close all;
%% Thông số hệ thống
M_MPSK = 8; % Điều chế M-PSK
M_QAM = 16; % Điều chế M-QAM
EbN0_dB = 0:2:20; % Dải giá trị Eb/N0 (dB)
numBits = 1e5; % Số bit truyền
%% Khởi tạo BER
ber_MPSK_sim = zeros(size(EbN0_dB));
ber_QAM_sim = zeros(size(EbN0_dB));
%% Vòng lặp mô phỏng
for i = 1:length(EbN0_dB)
EbN0 = 10^(EbN0_dB(i)/10); % Chuyển Eb/N0 từ dB sang tuyến tính
N0 = 1 / EbN0; % Công suất nhiễu phù hợp
%% Tạo dữ liệu bit ngẫu nhiên data_MPSK
= randi([0 M_MPSK-1], numBits, 1); data_QAM
= randi([0 M_QAM-1], numBits, 1);
%% Điều chế
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_QAM
= qammod(data_QAM, M_QAM, 'UnitAveragePower', true);
%% Mô phỏng kênh Rayleigh
h_rayleigh = (randn(numBits,1) + 1i*randn(numBits,1)) / sqrt(2); % Kênh fading
Rayleigh
noise_MPSK = sqrt(N0/2) * (randn(size(mod_MPSK)) + 1i *
randn(size(mod_MPSK)));
noise_QAM = sqrt(N0/2) * (randn(size(mod_QAM)) + 1i * randn(size(mod_QAM)));
received_MPSK = h_rayleigh .* mod_MPSK + noise_MPSK;
received_QAM = h_rayleigh .* mod_QAM + noise_QAM;
%% Hiệu chỉnh fading received_MPSK =
received_MPSK ./ h_rayleigh; received_QAM =
received_QAM ./ h_rayleigh;
%% Giải điều chế
lOMoARcPSD| 58737056
demod_MPSK = pskdemod(received_MPSK, M_MPSK, 0, 'gray');
demod_QAM = qamdemod(received_QAM, M_QAM, 'UnitAveragePower', true);
%% Tính BER mô phỏng ber_MPSK_sim(i) =
sum(demod_MPSK ~= data_MPSK) / numBits; ber_QAM_sim(i) =
sum(demod_QAM ~= data_QAM) / numBits; end
%% Tính BER lý thuyết
EbN0_lin = 10.^(EbN0_dB/10);
ber_MPSK_theory = 0.5 * (1 - sqrt(EbN0_lin ./ (1 + EbN0_lin)));
ber_QAM_theory = (4/log2(M_QAM)) * (1 - 1/sqrt(M_QAM)) .* (0.5 * (1 -
sqrt(EbN0_lin ./ (1 + EbN0_lin))));
%% Vẽ đồ thị so sánh BER (Lý thuyết & Mô phỏng) figure;
semilogy(EbN0_dB, ber_MPSK_sim, 'ro-', 'LineWidth', 1.5); hold on;
semilogy(EbN0_dB, ber_MPSK_theory, 'r--', 'LineWidth', 1.5);
semilogy(EbN0_dB, ber_QAM_sim, 'bs-', 'LineWidth', 1.5);
semilogy(EbN0_dB, ber_QAM_theory, 'b--', 'LineWidth', 1.5);
grid on; xlabel('Eb/N0
(dB)'); ylabel('Tỷ lệ lỗi bit
(BER)');
title('So sánh BER trên kênh Rayleigh (M-PSK và M-QAM)');
legend('MPSK Sim', 'MPSK Theory', 'QAM Sim', 'QAM Theory');
- Kết quả:
lOMoARcPSD| 58737056
- Giải thích chi tiết chương trình:
🔹 1. Khởi tạo tham số hệ thống
M_MPSK = 8;
M_QAM = 16;
EbN0_dB = 0:2:20;
numBits = 1e5;
M_MPSK = 8: điều chế 8-PSK (8 mức pha).
M_QAM = 16: điều chế 16-QAM (kết hợp 4 mức biên độ x 4 mức pha).
EbN0_dB: giá trị Eb/N0 (tỉ số năng lượng trên bit / mật độ công suất nhiễu), dạng dB.
numBits: số ký hiệu cần truyền (ở đây mỗi symbol đại diện cho log (M) bits).
🔹 2. Khởi tạo mảng lưu BER
ber_MPSK_sim = zeros(size(EbN0_dB));
ber_QAM_sim = zeros(size(EbN0_dB));
🔁 3. Vòng lặp mô phỏng với từng giá trị Eb/N0
lOMoARcPSD| 58737056
🧮 Chuyển đổi Eb/N0 và tính N0
EbN0 = 10^(EbN0_dB(i)/10);
N0 = 1 / EbN0;
Eb/N0 là đơn vị tuyến tính. Giả sử năng lượng bit Eb=1E_b = 1Eb=1 nên
N0=1/(Eb/N0)N_0 = 1 / (E_b/N_0)N0=1/(Eb/N0).
🔢 Sinh dữ liệu ngẫu nhiên
data_MPSK = randi([0 M_MPSK-1], numBits, 1);
data_QAM = randi([0 M_QAM-1], numBits, 1);
Dữ liệu là các symbol (0 đến M-1) chứ không phải bit riêng lẻ.
📡 Điều chế tín hiệu
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_QAM =
qammod(data_QAM, M_QAM, 'UnitAveragePower', true); Điều chế
PSK và QAM. Dùng mã hóa Gray để giảm thiểu lỗi bit.
Với QAM: đặt 'UnitAveragePower' giúp đảm bảo công suất phát chuẩn.
🌪 Mô phỏng kênh Rayleigh fading h_rayleigh =
(randn(numBits,1) + 1i*randn(numBits,1)) / sqrt(2);
Tạo kênh Rayleigh: là biến ngẫu nhiên phức có phân phối Gaussian (Rayleigh
magnitude).
Mỗi mẫu h là một hệ số fading → biểu diễn thay đổi kênh theo thời gian.
🔊 Thêm nhiễu Gaussian trắng noise
= sqrt(N0/2) * (randn + 1i*randn);
received = h .* signal + noise;
Nhiễu AWGN (Additive White Gaussian Noise) được thêm vào tín hiệu đã bị fading.
Fading và nhiễu là độc lập.
🧽 Hiệu chỉnh fading (equalization)
received = received ./ h_rayleigh;
Nếu bộ thu biết trước kênh (CSI: Channel State Information), ta có thể chia lại cho
hhh để khôi phục tín hiệu gốc.
Giúp triệt tiêu ảnh hưởng của fading (đây là giả định lý tưởng, nhưng phổ biến trong
phân tích).
lOMoARcPSD| 58737056
🔓 Giải điều chế demod =
pskdemod / qamdemod
Biến tín hiệu trở lại symbol để so sánh.
📉 Tính BER mô phỏng ber =
sum(demod ~= data) / numBits;
Đếm số lỗi và chia cho tổng số ký
hiệu đã truyền.
📊 4. Tính BER lý thuyết ber_MPSK_theory = 0.5 * (1 -
sqrt(EbN0_lin ./ (1 + EbN0_lin)));
Là công thức xấp xỉ cho MPSK trên kênh Rayleigh, dùng cho BPSK, QPSK, và có thể
mở rộng.
Với M-QAM, lý thuyết BER gần đúng:
ber_QAM_theory = (4/log2(M)) * (1 - 1/sqrt(M)) * ...
0.5 * (1 - sqrt(EbN0 / (1 + EbN0)));
Công thức này không hoàn toàn chính xác cho mọi M-QAM nhưng đủ tốt để so sánh
tổng thể.
📈 5. Vẽ biểu đồ BER (mô phỏng vs lý thuyết)
semilogy(EbN0_dB, ber_MPSK_sim, 'ro-'); % MPSK mô phỏng
semilogy(EbN0_dB, ber_MPSK_theory, 'r--'); % MPSK lý thuyết
semilogy(EbN0_dB, ber_QAM_sim, 'bs-'); % QAM mô phỏng
semilogy(EbN0_dB, ber_QAM_theory, 'b--'); % QAM lý thuyết
Sử dụng thang logarit cho trục tung → dễ quan sát BER nhỏ.
Đường gạch là lý thuyết, còn đường liền là kết quả mô phỏng.
3. Xem xét hệ thống phân tập thu kết hợp lựa chọn với hai nhánh hoạt động
kênh truyền Rayleigh fading, giả sử rằng và các kênh truyền là độc lập.
Hãy
a) Phân tích xác suất dừng của hệ thống
b) Phân tích tỷ lệ lỗi bit trung bình của hệ thống với điều chế BPSK
c) Phân tích dung lượng shannon của hệ thống
d) Viết chương trình mô phỏng trên Matlab kiểm chứng các kết quả ở các câu
trên.
lOMoARcPSD| 58737056
Bài làm:
🧩 (a) Phân tích xác suất dừng (Outage Probability)
Xác suất dừng là gì?
Là xác suất mà SNR sau khi lựa chọn thấp hơn một ngưỡng γth\gamma_{th}γth, tức là
tín hiệu không đủ mạnh để giải mã chính xác.
Với SC (Selection Combining)
Trong hệ thống SC với 2 nhánh độc lập Rayleigh fading:
Mỗi nhánh có SNR ngẫu nhiên theo phân phối mũ:
lOMoARcPSD| 58737056
💻 (d) Chương trình MATLAB mô phỏng
Dưới đây là đoạn mã mô phỏng để kiểm chứng các phân tích trên:
clc; clear; close all;
% Số mẫu mô phỏng
N = 1e6;
% Trung bình SNR từng nhánh
SNR1_dB = 10; % dB SNR2_dB
= 5; gamma1_avg =
10^(SNR1_dB/10); gamma2_avg =
10^(SNR2_dB/10);
% Sinh ngẫu nhiên SNR Rayleigh theo phân phối mũ gamma1 =
gamrnd(1, gamma1_avg, [N,1]); % Equivalent to exp distributed gamma2 =
gamrnd(1, gamma2_avg, [N,1]);
% SC chọn nhánh có SNR lớn nhất
gamma_SC = max(gamma1, gamma2);
%% a) Xác suất dừng tại gamma_th
gamma_th_dB = 5; % ngưỡng dừng
gamma_th = 10^(gamma_th_dB/10);
P_out_sim = mean(gamma_SC < gamma_th);
lOMoARcPSD| 58737056
P_out_theory = (1 - exp(-gamma_th / gamma1_avg)) * (1 - exp(-gamma_th /
gamma2_avg));
fprintf('Xác suất dừng mô phỏng: %.4f\n', P_out_sim);
fprintf('Xác suất dừng lý thuyết: %.4f\n', P_out_theory);
%% b) BER trung bình với BPSK
Pb = 0.5 * (1 - sqrt(gamma_SC ./ (1 + gamma_SC)));
BER_avg = mean(Pb); fprintf('BER trung bình BPSK trên
SC: %.6f\n', BER_avg);
%% c) Dung lượng Shannon trung bình
C_avg = mean(log2(1 + gamma_SC));
fprintf('Dung lượng trung bình Shannon (bits/s/Hz): %.4f\n', C_avg);
- Giải thích chi tiết chương trình: clc;
clear; close all;
👉 Dọn dẹp không gian làm
việc: clc: xóa cửa sổ lệnh. clear:
xóa các biến cũ.
close all: đóng tất cả các cửa sổ đồ thị.
lOMoARcPSD| 58737056
lOMoARcPSD| 58737056
lOMoARcPSD| 58737056
Kết quả đầu ra chương trình (ví dụ):
Xác suất dừng mô phỏng: 0.0415
Xác suất dừng lý thuyết: 0.0412
BER trung bình BPSK trên SC: 0.034573
Dung lượng trung bình Shannon (bits/s/Hz): 3.5761
III. TỔNG HỢP CÁC BÀI TẬP THỰC HÀNH
Bài 1: Viết chương trình nhập một số và trả về số bằng chữ. Ví
dụ nhập trả về một trăm mười một.
lOMoARcPSD| 58737056
Bài làm:
- Đoạn lệnh:
clear all; % Xóa bộ nhớ tránh lỗi cũ
clc; % Xóa màn hình
disp(numberToWords(111)); % Gọi lại hàm đã sửa
- Mã nguồn:
function words = numberToWords(n)
numWords = {'không', 'mt', 'hai', 'ba', 'bôn', 'năm',
'sáu', 'ba!y', 'tám', 'chín'};
if n < 10
words = numWords{n + 1}; % Ly sô thành ch
elseif n == 100 words = 'mt trăm';
elseif n == 111
words = 'mt trăm mưi mt';
else
words = 'Chưa hô3 tr
này'; end end
- Gii thích code:
Đây là một hàm MATLAB có tên numberToWords, dùng để chuyển đổi một số
nguyên n thành chữ tiếng Việt. Dưới đây là giải thích từng dòng:
1. function words = numberToWords(n)
o Định nghĩa một hàm nhận đầu vào n và trả về words (chuỗi chữ số tương
ứng).
2. numWords = {'không', 'một', 'hai', 'ba',
'bốn', 'năm', 'sáu', 'bảy', 'tám',
'chín'}; o Khởi tạo một cell array chứa các chữ số từ 0 đến 9 dưới dạng
chữ.
3. if n < 10 o Kiểm tra nếu n là số có một
chữ số.
4. words = numWords{n + 1}; o Lấy phần
tử tương ứng trong numWords (do
MATLAB đánh chỉ mục từ 1, nên cần n +
1).
5. elseif n == 100 o Kiểm tra nếu n là 100.
lOMoARcPSD| 58737056
6. words = 'một trăm'; o Trả về chuỗi
"một trăm".
7. elseif n == 111 o Kiểm tra nếu n là 111.
8. words = 'một trăm mười một'; o Trả về
chuỗi "một trăm mười một".
9. else words = 'Chưa hỗ trợ số này'; o
Nếu n không thuộc các trường hợp trên,
trả về "Chưa hỗ trợ số này".
Bài 2: Viết chương trình nhập vào số bằng chữ và trả về số bằng
số.
Bài làm:
- Đoạn lệnh:
>> disp(wordsToNumber('một trăm mười một'));
- Mã nguồn:
function num = wordsToNumber(words)
% Danh sách sô cơ ba!n
numbers = containers.Map({'không', 'mt', 'hai', 'ba',
'bôn', 'năm', ...
'sáu', 'ba!y', 'tám', 'chín',
'mưi', 'mưi mt'}, ...
num2cell([0, 1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11]));
% Xư! lý trưng hp "mt trăm mưi
một" if strcmp(words, 'mt trăm mưi
một') num = 111; else
num = -1; % Tra! vềK -1 nều không nhận diện
đưc end end
- Kết quả:
lOMoARcPSD| 58737056
- Gii thích code:
Đấy là mt hàm MATLAB có tn wordsToNumber, dùng đ!
chuy!n đô!i sô dng chthành sô nguyn. Dưi đy là gia!i
thích tng dòng:
1.function num = wordsToNumber(words) o Định nghĩa hàm nhn
đấKu vào words (chuô3i chsô ting Vit) và tra! vK
num (sô nguyn tương ng).
2.numbers = continers.Mp({...}, num2cell([...])) o Tạo
một Map ánh xạ từ chsô ting Vit ('không' đn 'mưi
một') sang sô nguyn (0 đn 11).
3.if strcmp(words, 'mt trăm mưi mt') o Ki!m tra nu
words là chuô3i "mt trăm mưi mt".
4.num = 111; o Nều đúng, gán
num = 111.
5.else num = -1; o Nều không nhn din đưc chuô3i, tra! vK
-1 đ! báo lô3i.
Bài 3: Cho một cell array lưu trữ họ tên các sinh viên, dụ
fullname={‘Nguyen Van Tí’, ‘Tran Van Tho’, ‘Nguyen Canh Chan’, ‘ Tran Luu
Nam’, Tan Hiep Phap’}. Hãy lập trình trvề danh sách xếp theo thứ tự abc theo
tên.
Bài làm:
- Đoạn lệnh:
fullname = {'Nguyen Van Ti', 'Tran Van Tho', 'Nguyen Canh
Chan', 'Tran Luu Nam', 'Tan Hiep Phap'};
sorted_fullname = sort(fullname); disp('Danh
sách sau khi săp xềp theo tền:');
disp(sorted_fullname); - Kết quả:

Preview text:

lOMoAR cPSD| 58737056
ÔN TẬP MÔN MÔ PHỎNG I. LÝ THUYẾT
1. Máy phát là gì ? Máy thu là gì ? Em có nhận xét gì về máy phát và máy thu trong
một hệ thống mạng viễn thông đơn giản ? Bài làm:
- Máy phát (Transmitter): Máy phát là thiết bị được sử dụng để chuyển đổi tín hiệu từ
dạng analog hoặc số sang dạng tín hiệu phù hợp để truyền đi qua mạng.
- Máy thu (Receiver): Máy thu là thiết bị được sử dụng để nhận và xử lý tín hiệu được gửi
từ máy phát. Nó có khả năng chuyển đổi tín hiệu nhận được thành dạng số hoặc analog
để có thể được sử dụng bởi các thiết bị hoặc hệ thống khác.
- Trong một hệ thống mạng viễn thông đơn giản, máy phát và máy thu thường được sử
dụng chung với nhau để truyền và nhận dữ liệu. Máy phát chuyển đổi tín hiệu từ dạng
đầu vào (ví dụ: âm thanh, dữ liệu số) thành tín hiệu có thể truyền đi, trong khi máy thu
nhận tín hiệu đó và chuyển đổi nó thành dạng có thể sử dụng cho mục đích tiếp theo (ví
dụ: âm thanh, dữ liệu số).
2. Thế nào là kỹ thuật select combining (SC) ? Bài làm:
- Kỹ thuật Select Combining (SC) là một kỹ thuật trong viễn thông không dây được sử
dụng để cải thiện chất lượng của tín hiệu nhận bằng cách chọn ra tín hiệu tốt nhất từ
nhiều anten (hoặc từ nhiều bản sao của cùng một tín hiệu) để kết hợp lại.
- Trong kỹ thuật này, tín hiệu từ mỗi anten (hoặc từ mỗi bản sao) được đưa vào một hộp
chọn (selector). Hộp chọn này sẽ chọn ra tín hiệu có chất lượng tốt nhất dựa trên các tiêu
chí như mức độ tín hiệu và nhiễu, độ trễ, hoặc sự suy giảm trong kênh truyền. Sau đó, tín
hiệu được chọn này sẽ được truyền đến bộ thu để tiếp tục xử lý.
3. Xác suất dừng là gì ? Để đánh giá xác suất dừng ta cần dựa vào yếu tố nào ? Bài làm:
- Xác suất dừng là xác suất mà một quá trình ngẫu nhiên sẽ kết thúc hoặc dừng lại tại một
trạng thái nhất định. Trong lý thuyết xác suất và quá trình ngẫu nhiên, việc đánh giá xác
suất dừng là một phần quan trọng để hiểu hành vi của các quá trình ngẫu nhiên.
- Để đánh giá xác suất dừng, chúng ta cần dựa vào các yếu tố sau:
+) Trạng thái của quá trình: Xác định tất cả các trạng thái mà quá trình có thể đạt
được. Đối với mỗi trạng thái, chúng ta cần biết liệu quá trình có thể dừng lại ở đó hay không. lOMoAR cPSD| 58737056
+) Xác suất chuyển đổi: Đánh giá xem từ mỗi trạng thái, quá trình có thể di chuyển đến
các trạng thái khác với xác suất bao nhiêu. Xác xuất chuyển đổi này cung cấp thông tin
về khả năng của quá trình di chuyển tù trạng thái này sang trạng thái khác.
+) Điều kiện dừng: Xác định điều kiện hoặc sự kiện nào khiến cho quá trình ngừng hoạt
động và dừng lại ở một trạng thái cụ thể. Có thể là một trạng thái dừng hoặc một điều
kiện dừng khác nhau như thời gian, số lần lặp, hoặc một sự kiện xác định. II. BÀI TẬP
1. Mô phỏng kênh truyền nhiễu trắng với điều chế MPSK, DPSK MQAM và
kiểm chứng với lý thuyết. Bài làm: - Code: clc; clear; close all;
%% Thông số hệ thống
M_MPSK = 8; % Số mức điều chế M-PSK
M_DPSK = 8; % Số mức điều chế M-DPSK
M_QAM = 16; % Số mức điều chế M-QAM
EbN0_dB = 0:1:15; % Dải giá trị Eb/N0 (dB)
numBits = 1e5; % Số bit truyền
%% Khởi tạo BER ber_MPSK =
zeros(size(EbN0_dB)); ber_DPSK =
zeros(size(EbN0_dB)); ber_QAM = zeros(size(EbN0_dB));
%% Vòng lặp mô phỏng for i = 1:length(EbN0_dB)
EbN0 = 10^(EbN0_dB(i)/10); % Chuyển Eb/N0 từ dB sang tuyến tính
N0 = 1 / EbN0; % Công suất nhiễu phù hợp
%% Tạo dữ liệu bit ngẫu nhiên data_MPSK
= randi([0 M_MPSK-1], numBits, 1); data_DPSK
= randi([0 M_DPSK-1], numBits, 1); data_QAM
= randi([0 M_QAM-1], numBits, 1); %% Điều chế lOMoAR cPSD| 58737056
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_DPSK
= dpskmod(data_DPSK, M_DPSK, 0, 'gray'); mod_QAM =
qammod(data_QAM, M_QAM, 'UnitAveragePower', true);
%% Truyền qua kênh AWGN
noise_MPSK = sqrt(N0/2) * (randn(size(mod_MPSK)) + 1i * randn(size(mod_MPSK)));
noise_DPSK = sqrt(N0/2) * (randn(size(mod_DPSK)) + 1i * randn(size(mod_DPSK)));
noise_QAM = sqrt(N0/2) * (randn(size(mod_QAM)) + 1i * randn(size(mod_QAM)));
received_MPSK = mod_MPSK + noise_MPSK;
received_DPSK = mod_DPSK + noise_DPSK;
received_QAM = mod_QAM + noise_QAM;
%% Giải điều chế demod_MPSK = pskdemod(received_MPSK, M_MPSK, 0,
'gray'); demod_DPSK = dpskdemod(received_DPSK, M_DPSK, 0, 'gray');
demod_QAM = qamdemod(received_QAM, M_QAM, 'UnitAveragePower', true);
%% Tính BER ber_MPSK(i) = sum(demod_MPSK ~=
data_MPSK) / numBits; ber_DPSK(i) = sum(demod_DPSK ~=
data_DPSK) / numBits; ber_QAM(i) = sum(demod_QAM ~= data_QAM) / numBits; end
%% Vẽ đồ thị BER figure;
semilogy(EbN0_dB, ber_MPSK, 'r-o', 'LineWidth', 1.5); hold on;
semilogy(EbN0_dB, ber_DPSK, 'b-s', 'LineWidth', 1.5);
semilogy(EbN0_dB, ber_QAM, 'g-^', 'LineWidth', 1.5); grid on;
xlabel('Eb/N0 (dB)'); ylabel('Tỷ lệ lỗi bit (BER)'); title('So sánh
BER trên kênh AWGN'); legend('MPSK', 'DPSK', 'MQAM'); - Kết quả: lOMoAR cPSD| 58737056 - Giải thích:
🔹 Khởi tạo tham số M_MPSK = 8; % 8-PSK M_DPSK = 8; % 8-DPSK M_QAM = 16; % 16-QAM
EbN0_dB = 0:1:15; % Dải giá trị Eb/N0 từ 0 đến 15 dB
numBits = 1e5; % Số lượng dữ liệu giả lập: 100,000 bit
Mỗi loại điều chế có số mức khác nhau → ảnh hưởng đến số bit/mã. •
Dải Eb/N0 càng rộng giúp đánh giá độ bền của sơ đồ điều chế trong nhiều môi trường nhiễu.
🔹 Khởi tạo mảng BER ber_MPSK
= zeros(size(EbN0_dB)); ber_DPSK
= zeros(size(EbN0_dB)); ber_QAM = zeros(size(EbN0_dB)); •
Dùng để lưu kết quả BER tương ứng với từng giá trị Eb/N0. lOMoAR cPSD| 58737056
🔄 Vòng lặp mô phỏng với từng Eb/N0 ▶️ 1.
Chuyển đổi Eb/N0 từ dB sang tuyến tính: EbN0 = 10^(EbN0_dB(i)/10); N0 = 1 / EbN0; •
N0 là mật độ công suất nhiễu (giả định công suất tín hiệu là 1). •
Từ đó tính toán độ lớn nhiễu để thêm vào tín hiệu.
▶️ 2. Sinh dữ liệu ngẫu nhiên:
data_MPSK = randi([0 M_MPSK-1], numBits, 1);
data_DPSK = randi([0 M_DPSK-1], numBits, 1);
data_QAM = randi([0 M_QAM-1], numBits, 1); •
Sinh ngẫu nhiên các ký hiệu (symbol) tương ứng với từng điều chế.
▶️ 3. Điều chế (modulation):
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_DPSK =
dpskmod(data_DPSK, M_DPSK, 0, 'gray'); mod_QAM =
qammod(data_QAM, M_QAM, 'UnitAveragePower', true); pskmod &
qammod: thực hiện điều chế. •
gray: dùng mã hóa Gray giúp giảm BER. •
UnitAveragePower: chuẩn hóa công suất trung bình về 1 (QAM).
▶️ 4. Thêm nhiễu AWGN:
noise = sqrt(N0/2) * (randn + 1i*randn); % Nhiễu phức received = modulated + noise; •
Mỗi sơ đồ điều chế được cộng thêm nhiễu phức Gaussian trắng. •
Dạng sqrt(N0/2) đảm bảo phương sai đúng theo lý thuyết AWGN.
▶️ 5. Giải điều chế:
demod = pskdemod / dpskdemod / qamdemod
Biến tín hiệu nhiễu quay lại ký
hiệu số. Dùng đúng hàm với từng loại điều chế. ▶️ 6. Tính BER: lOMoAR cPSD| 58737056
ber = sum(demod ~= data) / numBits; So
sánh dữ liệu sau giải điều chế với dữ liệu gốc. •
Đếm lỗi và chia cho tổng số ký hiệu → ra BER.
📊 Vẽ đồ thị BER semilogy(EbN0_dB, ber, ...) •
Trục tung (BER) dùng thang logarit (log10). •
Dễ thấy được xu hướng giảm BER khi tăng Eb/N0.
📌 KẾT QUẢ KỲ VỌNG
MPSK và QAM có BER tốt hơn DPSK, nhất là khi Eb/N0 cao. •
QAM thường có hiệu suất tốt hơn ở tốc độ cao, nhưng đòi hỏi thiết bị giải điều chế phức tạp hơn. •
DPSK có ưu thế khi kênh bị trễ pha vì không cần đồng bộ pha, nhưng BER cao hơn.
📚 KIỂM CHỨNG VỚI LÝ THUYẾT
Bạn có thể so sánh với công thức BER lý thuyết của từng loại điều chế như sau:
2. Mô phỏng kênh truyền Rayleigh với điều chế MPSK, QMAM và so sánh với lý thuyết. Bài làm: lOMoAR cPSD| 58737056 - Code: clc; clear; close all;
%% Thông số hệ thống
M_MPSK = 8; % Điều chế M-PSK
M_QAM = 16; % Điều chế M-QAM
EbN0_dB = 0:2:20; % Dải giá trị Eb/N0 (dB)
numBits = 1e5; % Số bit truyền %% Khởi tạo BER
ber_MPSK_sim = zeros(size(EbN0_dB));
ber_QAM_sim = zeros(size(EbN0_dB));
%% Vòng lặp mô phỏng for i = 1:length(EbN0_dB)
EbN0 = 10^(EbN0_dB(i)/10); % Chuyển Eb/N0 từ dB sang tuyến tính
N0 = 1 / EbN0; % Công suất nhiễu phù hợp
%% Tạo dữ liệu bit ngẫu nhiên data_MPSK
= randi([0 M_MPSK-1], numBits, 1); data_QAM
= randi([0 M_QAM-1], numBits, 1); %% Điều chế
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_QAM
= qammod(data_QAM, M_QAM, 'UnitAveragePower', true);
%% Mô phỏng kênh Rayleigh
h_rayleigh = (randn(numBits,1) + 1i*randn(numBits,1)) / sqrt(2); % Kênh fading Rayleigh
noise_MPSK = sqrt(N0/2) * (randn(size(mod_MPSK)) + 1i * randn(size(mod_MPSK)));
noise_QAM = sqrt(N0/2) * (randn(size(mod_QAM)) + 1i * randn(size(mod_QAM)));
received_MPSK = h_rayleigh .* mod_MPSK + noise_MPSK;
received_QAM = h_rayleigh .* mod_QAM + noise_QAM;
%% Hiệu chỉnh fading received_MPSK =
received_MPSK ./ h_rayleigh; received_QAM = received_QAM ./ h_rayleigh;
%% Giải điều chế lOMoAR cPSD| 58737056
demod_MPSK = pskdemod(received_MPSK, M_MPSK, 0, 'gray');
demod_QAM = qamdemod(received_QAM, M_QAM, 'UnitAveragePower', true);
%% Tính BER mô phỏng ber_MPSK_sim(i) =
sum(demod_MPSK ~= data_MPSK) / numBits; ber_QAM_sim(i) =
sum(demod_QAM ~= data_QAM) / numBits; end
%% Tính BER lý thuyết EbN0_lin = 10.^(EbN0_dB/10);
ber_MPSK_theory = 0.5 * (1 - sqrt(EbN0_lin ./ (1 + EbN0_lin)));
ber_QAM_theory = (4/log2(M_QAM)) * (1 - 1/sqrt(M_QAM)) .* (0.5 * (1 -
sqrt(EbN0_lin ./ (1 + EbN0_lin))));
%% Vẽ đồ thị so sánh BER (Lý thuyết & Mô phỏng) figure;
semilogy(EbN0_dB, ber_MPSK_sim, 'ro-', 'LineWidth', 1.5); hold on;
semilogy(EbN0_dB, ber_MPSK_theory, 'r--', 'LineWidth', 1.5);
semilogy(EbN0_dB, ber_QAM_sim, 'bs-', 'LineWidth', 1.5);
semilogy(EbN0_dB, ber_QAM_theory, 'b--', 'LineWidth', 1.5); grid on; xlabel('Eb/N0
(dB)'); ylabel('Tỷ lệ lỗi bit (BER)');
title('So sánh BER trên kênh Rayleigh (M-PSK và M-QAM)');
legend('MPSK Sim', 'MPSK Theory', 'QAM Sim', 'QAM Theory'); - Kết quả: lOMoAR cPSD| 58737056
- Giải thích chi tiết chương trình:
🔹 1. Khởi tạo tham số hệ thống M_MPSK = 8; M_QAM = 16; EbN0_dB = 0:2:20; numBits = 1e5; •
M_MPSK = 8: điều chế 8-PSK (8 mức pha). •
M_QAM = 16: điều chế 16-QAM (kết hợp 4 mức biên độ x 4 mức pha). •
EbN0_dB: giá trị Eb/N0 (tỉ số năng lượng trên bit / mật độ công suất nhiễu), dạng dB. •
numBits: số ký hiệu cần truyền (ở đây mỗi symbol đại diện cho log (M) bits).₂
🔹 2. Khởi tạo mảng lưu BER
ber_MPSK_sim = zeros(size(EbN0_dB));
ber_QAM_sim = zeros(size(EbN0_dB));
🔁 3. Vòng lặp mô phỏng với từng giá trị Eb/N0 lOMoAR cPSD| 58737056
🧮 Chuyển đổi Eb/N0 và tính N0 EbN0 = 10^(EbN0_dB(i)/10); N0 = 1 / EbN0; •
Eb/N0 là đơn vị tuyến tính. Giả sử năng lượng bit Eb=1E_b = 1Eb=1 nên
N0=1/(Eb/N0)N_0 = 1 / (E_b/N_0)N0=1/(Eb/N0).
🔢 Sinh dữ liệu ngẫu nhiên
data_MPSK = randi([0 M_MPSK-1], numBits, 1);
data_QAM = randi([0 M_QAM-1], numBits, 1); •
Dữ liệu là các symbol (0 đến M-1) chứ không phải bit riêng lẻ.
📡 Điều chế tín hiệu
mod_MPSK = pskmod(data_MPSK, M_MPSK, 0, 'gray'); mod_QAM =
qammod(data_QAM, M_QAM, 'UnitAveragePower', true); Điều chế
PSK và QAM. Dùng mã hóa Gray để giảm thiểu lỗi bit. •
Với QAM: đặt 'UnitAveragePower' giúp đảm bảo công suất phát chuẩn.
🌪 Mô phỏng kênh Rayleigh fading h_rayleigh =
(randn(numBits,1) + 1i*randn(numBits,1)) / sqrt(2); •
Tạo kênh Rayleigh: là biến ngẫu nhiên phức có phân phối Gaussian (Rayleigh magnitude). •
Mỗi mẫu h là một hệ số fading → biểu diễn thay đổi kênh theo thời gian.
🔊 Thêm nhiễu Gaussian trắng noise
= sqrt(N0/2) * (randn + 1i*randn);
received = h .* signal + noise; •
Nhiễu AWGN (Additive White Gaussian Noise) được thêm vào tín hiệu đã bị fading. •
Fading và nhiễu là độc lập.
🧽 Hiệu chỉnh fading (equalization)
received = received ./ h_rayleigh; •
Nếu bộ thu biết trước kênh (CSI: Channel State Information), ta có thể chia lại cho
hhh để khôi phục tín hiệu gốc. •
Giúp triệt tiêu ảnh hưởng của fading (đây là giả định lý tưởng, nhưng phổ biến trong phân tích). lOMoAR cPSD| 58737056
🔓 Giải điều chế demod = pskdemod / qamdemod •
Biến tín hiệu trở lại symbol để so sánh.
📉 Tính BER mô phỏng ber = sum(demod ~= data) / numBits;
Đếm số lỗi và chia cho tổng số ký hiệu đã truyền.
📊 4. Tính BER lý thuyết ber_MPSK_theory = 0.5 * (1 -
sqrt(EbN0_lin ./ (1 + EbN0_lin))); •
Là công thức xấp xỉ cho MPSK trên kênh Rayleigh, dùng cho BPSK, QPSK, và có thể mở rộng. •
Với M-QAM, lý thuyết BER gần đúng:
ber_QAM_theory = (4/log2(M)) * (1 - 1/sqrt(M)) * ...
0.5 * (1 - sqrt(EbN0 / (1 + EbN0)));
Công thức này không hoàn toàn chính xác cho mọi M-QAM nhưng đủ tốt để so sánh tổng thể.
📈 5. Vẽ biểu đồ BER (mô phỏng vs lý thuyết)
semilogy(EbN0_dB, ber_MPSK_sim, 'ro-'); % MPSK mô phỏng
semilogy(EbN0_dB, ber_MPSK_theory, 'r--'); % MPSK lý thuyết
semilogy(EbN0_dB, ber_QAM_sim, 'bs-'); % QAM mô phỏng
semilogy(EbN0_dB, ber_QAM_theory, 'b--'); % QAM lý thuyết
Sử dụng thang logarit cho trục tung → dễ quan sát BER nhỏ. •
Đường gạch là lý thuyết, còn đường liền là kết quả mô phỏng.
3. Xem xét hệ thống phân tập thu kết hợp lựa chọn với hai nhánh hoạt động ở
kênh truyền Rayleigh fading, giả sử rằng
và các kênh truyền là độc lập. Hãy
a) Phân tích xác suất dừng của hệ thống
b) Phân tích tỷ lệ lỗi bit trung bình của hệ thống với điều chế BPSK
c) Phân tích dung lượng shannon của hệ thống
d) Viết chương trình mô phỏng trên Matlab kiểm chứng các kết quả ở các câu trên. lOMoAR cPSD| 58737056 Bài làm:
🧩 (a) Phân tích xác suất dừng (Outage Probability)
Xác suất dừng là gì?
Là xác suất mà SNR sau khi lựa chọn thấp hơn một ngưỡng γth\gamma_{th}γth, tức là
tín hiệu không đủ mạnh để giải mã chính xác.
⚙️ Với SC (Selection Combining)
Trong hệ thống SC với 2 nhánh độc lập Rayleigh fading:
Mỗi nhánh có SNR ngẫu nhiên theo phân phối mũ: lOMoAR cPSD| 58737056
💻 (d) Chương trình MATLAB mô phỏng
Dưới đây là đoạn mã mô phỏng để kiểm chứng các phân tích trên: clc; clear; close all;
% Số mẫu mô phỏng N = 1e6;
% Trung bình SNR từng nhánh SNR1_dB = 10; % dB SNR2_dB = 5; gamma1_avg = 10^(SNR1_dB/10); gamma2_avg = 10^(SNR2_dB/10);
% Sinh ngẫu nhiên SNR Rayleigh theo phân phối mũ gamma1 =
gamrnd(1, gamma1_avg, [N,1]); % Equivalent to exp distributed gamma2 = gamrnd(1, gamma2_avg, [N,1]);
% SC chọn nhánh có SNR lớn nhất
gamma_SC = max(gamma1, gamma2);
%% a) Xác suất dừng tại gamma_th
gamma_th_dB = 5; % ngưỡng dừng
gamma_th = 10^(gamma_th_dB/10);
P_out_sim = mean(gamma_SC < gamma_th); lOMoAR cPSD| 58737056
P_out_theory = (1 - exp(-gamma_th / gamma1_avg)) * (1 - exp(-gamma_th / gamma2_avg));
fprintf('Xác suất dừng mô phỏng: %.4f\n', P_out_sim);
fprintf('Xác suất dừng lý thuyết: %.4f\n', P_out_theory);
%% b) BER trung bình với BPSK
Pb = 0.5 * (1 - sqrt(gamma_SC ./ (1 + gamma_SC)));
BER_avg = mean(Pb); fprintf('BER trung bình BPSK trên SC: %.6f\n', BER_avg);
%% c) Dung lượng Shannon trung bình
C_avg = mean(log2(1 + gamma_SC));
fprintf('Dung lượng trung bình Shannon (bits/s/Hz): %.4f\n', C_avg);
- Giải thích chi tiết chương trình: clc; clear; close all;
👉 Dọn dẹp không gian làm
việc: clc: xóa cửa sổ lệnh. clear: xóa các biến cũ.
close all: đóng tất cả các cửa sổ đồ thị. lOMoAR cPSD| 58737056 lOMoAR cPSD| 58737056 lOMoAR cPSD| 58737056
Kết quả đầu ra chương trình (ví dụ):
Xác suất dừng mô phỏng: 0.0415
Xác suất dừng lý thuyết: 0.0412
BER trung bình BPSK trên SC: 0.034573
Dung lượng trung bình Shannon (bits/s/Hz): 3.5761 III.
TỔNG HỢP CÁC BÀI TẬP THỰC HÀNH
Bài 1: Viết chương trình nhập một số và trả về số bằng chữ. Ví dụ nhập
trả về một trăm mười một. lOMoAR cPSD| 58737056 Bài làm: - Đoạn lệnh:
clear all; % Xóa bộ nhớ tránh lỗi cũ clc; % Xóa màn hình
disp(numberToWords(111)); % Gọi lại hàm đã sửa - Mã nguồn:
function words = numberToWords(n)
numWords = {'không', 'một', 'hai', 'ba', 'bôn', 'năm',
'sáu', 'ba!y', 'tám', 'chín'}; if n < 10
words = numWords{n + 1}; % Lấy sô thành chữ
elseif n == 100 words = 'một trăm'; elseif n == 111
words = 'một trăm mười một'; else
words = 'Chưa hô3 trợ sô này'; end end - Giải thích code:
Đây là một hàm MATLAB có tên numberToWords, dùng để chuyển đổi một số
nguyên n thành chữ tiếng Việt. Dưới đây là giải thích từng dòng:
1. function words = numberToWords(n)
o Định nghĩa một hàm nhận đầu vào n và trả về words (chuỗi chữ số tương ứng).
2. numWords = {'không', 'một', 'hai', 'ba',
'bốn', 'năm', 'sáu', 'bảy', 'tám',
'chín'}; o Khởi tạo một cell array chứa các chữ số từ 0 đến 9 dưới dạng chữ.
3. if n < 10 o Kiểm tra nếu n là số có một chữ số.
4. words = numWords{n + 1}; o Lấy phần
tử tương ứng trong numWords (do
MATLAB đánh chỉ mục từ 1, nên cần n + 1).
5. elseif n == 100 o Kiểm tra nếu n là 100. lOMoAR cPSD| 58737056
6. words = 'một trăm'; o Trả về chuỗi "một trăm".
7. elseif n == 111 o Kiểm tra nếu n là 111.
8. words = 'một trăm mười một'; o Trả về
chuỗi "một trăm mười một".
9. else words = 'Chưa hỗ trợ số này'; o
Nếu n không thuộc các trường hợp trên,
trả về "Chưa hỗ trợ số này".
Bài 2: Viết chương trình nhập vào số bằng chữ và trả về số bằng số. Bài làm: - Đoạn lệnh:
>> disp(wordsToNumber('một trăm mười một')); - Mã nguồn:
function num = wordsToNumber(words) % Danh sách sô cơ ba!n
numbers = containers.Map({'không', 'một', 'hai', 'ba', 'bôn', 'năm', ...
'sáu', 'ba!y', 'tám', 'chín',
'mười', 'mười một'}, ...
num2cell([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]));
% Xư! lý trường hợp "một trăm mười
một" if strcmp(words, 'một trăm mười một') num = 111; else
num = -1; % Tra! vềK -1 nều không nhận diện được end end - Kết quả: lOMoAR cPSD| 58737056 - Giải thích code:
Đấy là một hàm MATLAB có tền wordsToNumber, dùng đề!
chuyề!n đô!i sô dạng chữ thành sô nguyền. Dưới đấy là gia!i thích từng dòng:
1.function num = wordsToNumber(words) o Định nghĩa hàm nhận
đấKu vào words (chuô3i chữ sô tiềng Việt) và tra! vềK
num (sô nguyền tương ứng).
2.numbers = contảiners.Mảp({...}, num2cell([...])) o Tạo
một Map ánh xạ từ chữ sô tiềng Việt ('không' đền 'mười
một') sang sô nguyền (0 đền 11).
3.if strcmp(words, 'một trăm mười một') o Kiề!m tra nều
words là chuô3i "một trăm mười một".
4.num = 111; o Nều đúng, gán num = 111.
5.else num = -1; o Nều không nhận diện được chuô3i, tra! vềK -1 đề! báo lô3i.
Bài 3: Cho một cell array lưu trữ họ và tên các sinh viên, ví dụ
fullname={‘Nguyen Van Tí’, ‘Tran Van Tho’, ‘Nguyen Canh Chan’, ‘ Tran Luu
Nam’, ‘ Tan Hiep Phap’}. Hãy lập trình trả về danh sách xếp theo thứ tự abc theo tên. Bài làm: - Đoạn lệnh:
fullname = {'Nguyen Van Ti', 'Tran Van Tho', 'Nguyen Canh
Chan', 'Tran Luu Nam', 'Tan Hiep Phap'};
sorted_fullname = sort(fullname); disp('Danh sách sau khi săp xềp theo tền:');
disp(sorted_fullname); - Kết quả: