Kênh truyền và đánh giá chất lượng kênh truyền
246
ber = zeros(1,numEbNos); % Các giá trị BER
intv = cell(1,numEbNos); % Dãy các khoảng tin cậy
Tiếp theo, ta sử dụng vòng lặp để thực hiện nhiều lần quá trình mô phỏng cho các giá trị khác
nhau của Eb/No. Trong mỗi vòng lặp lại có một vòng lặp while để bảo đảm quá trình mô
phỏng vẫn tiếp tục cho đến khi số bit lỗi vượt quá giá trị định trước. Sau mỗi vòng lặp các
vector ber và intv sẽ được cập nhật.
% Lặp lại với các giá trị khác nhau của Eb/No.
for jj = 1:numEbNos
EbNo = EbNovec(jj);
snr = EbNo; % Dieu che BPSK
ntrials = 0; % Số lần thực hiện vòng lặp while bên dưới
numerr = 0; % Số lỗi ứng với giá trị Eb/No đang xét
% Lặp lại mô phỏng cho đến khi số bit lỗi > numerrmin
while (numerr < numerrmin)
msg = randint(siglen, 1, M); % Tạo chuỗi tin tức.
txsig = dpskmod(msg,M); % Điều chế
rxsig = awgn(txsig, snr, 'measured'); %Cộng nhiễu.
decodmsg = dpskdemod(rxsig,M); % Giải điều chế.
newerrs = biterr(msg,decodmsg); % Số lỗi trong lần thử này
numerr = numerr + newerrs; % Tổng số lỗi ứng với giá trị Eb/No đang xét
ntrials = ntrials + 1; % Cập nhật số lần thử.
end
% Tỷ lệ lỗi và khoảng tin cậy 98% cho giá trị Eb/No hiện tại
[ber(jj), intv1] = berconfint(numerr,(ntrials * siglen),.98);
intv{jj} = intv1; % Lưu lại khoảng tin cậy
disp(['EbNo = ' num2str(EbNo) ' dB, ' num2str(numerr) ...
' errors, BER = ' num2str(ber(jj))])
end
Sau mỗi vòng lặp, trên màn hình sẽ xuất hiện dòng kết quả tương tự như sau:
EbNo = 7 dB, 9 errors, BER = 0.0045
Cuối cùng là quá trình vẽ đồ thị BER, trong đó có sử dụng hàm berfit để làm trơn đồ thị.
% Dùng hàm berfit để làm trơn và vẽ đồ thị BER.
fitEbNo = EbNomin:0.25:EbNomax; % Các giá trị nội suy
berfit(EbNovec,ber,fitEbNo);
% Vẽ khoảng tin cậy.
hold on;
for jj=1:numEbNos
semilogy([EbNovec(jj) EbNovec(jj)],intv{jj},'g-+');
end
hold off;