thấy mã Turbo là bộ mã có chất lượng tốt nhất so với các bộ mã đã được biết từ trước tới nay, với độ phức tạp của bộ mã hóa cũng như bộ giải mã có thể chấp nhận được. Kết quả mô phỏng cũng cho thấy chất lượng của bộ mã này tiến gần tới giới hạn Shannon khi các khung dữ liệu lớn được phát đi, và đối với các khung dữ liệu nhỏ thì chất lượng của nó vẫn khá tốt so với các bộ mã hóa khác.
Và cuối cùng là chương trình mô phỏng mã Turbo bằng Matlab của Yufei, áp dụng cho cả hai giải thuật MAP và SOVA, chương trình mô tả quá trình truyền nhận tin của mã Turbo với số lần lặp xác định, qua đó biểu diễn mối quan hệ của SNR và BER để từ đó, đánh giá chất lượng của mã Turbo.
Phụ lục
* Chương trình mô phỏng Matlab bộ mã hóa và giải mã Turbo của Yufei.
clear all
% Hiển thị thông báo dưới dạng file TXT turbo_logmap.txt
dec_alg = 0;
%Kích thước khung
L_total = input(' Chon kich thuoc khung (= info + tail, default: 400)'); if isempty(L_total)
L_total = 400; %Bộ tạo mã
g = input(' Hay nhap bo tao ma : ( default: g = [1 1 1; 1 0 1 ] )'); if isempty(g)
g [ 1 1 1;1 0 1 ]; end
[n,K] = size(g); m = K - 1; nstates = 2^m; %puncture = 0, puncturing into rate 1/2; %puncture = 1, no puncturing
puncture = input('Hãy chọn punctured / unpunctured (0/1): default 0 '); if isempty(puncture)
puncture = 0; end
% Tốc độ mã
rate = 1/(2+puncture);
% Biên độ Fading; a=1 trong kênh AWGN a = 1;
% Số lần lặp
niter = input(' Nhap so lan lap cho moi khung, mac dinh la 5 '); if isempty(niter)
niter = 5; end
%Số lượng khung lỗi để tính cho việc dừng
ferrlim = input(' Nhập số lượng khung lỗi để kết thúc – Mặc định là 15 '); if isempty(ferrlim)
ferrlim = 15; end
EbN0db = input(' Hãy nhập tỷ số Eb/N0 dB : Mặc định [2.0] '); if isempty(EbN0db)
EbN0db = [2.0]; end
fprintf('\n\n---\n'); if dec_alg == 0
end
fprintf (' Kích thước khung = %6d\n',L_total); fprintf (' Bộ tạo mã: \n'); for i = 1:n for j = 1:K fprintf ( '%6d', g(i,j)); end fprintf ('\n'); end if puncture==0 fprintf(' Punctured, Tốc độ mã = 1/2 \n'); else fprintf(' Unpunctured, Tốc độ mã = 1/3 \n'); end fprintf(' Số lần lặp = %6d\n', niter);
fprintf(' Kết thúc khung lỗi = %6d\n', ferrlim); fprintf(' Eb / N0 (dB) = ');
for i = 1:length(EbN0db) fprintf('%10.2f',EbN0db(i)); end
fprintf('\n---\n\n'); fprintf('+ + + + Xin hãy đợi để tạo kết quả. + + + +\n'); for nEN = 1:length(EbN0db)
en = 10^(EbN0db(nEN)/10); % Chuyển Eb/N0 từ dB sang số thông thường L_c = 4*a*en*rate; % Giá trị tin cậy của kênh
sigma = 1/sqrt(2*rate*en); % Độ lệch chuẩn của nhiễu AWGN % Xóa việc đếm lỗi bit và lỗi
= zeros(1,niter);
nframe = 0; % Xóa việc đếm khung đã phát while nferr(nEN, niter)<ferrlim
nframe = nframe + 1;
x = round(rand(1, L_total-m)); % Các bít thông tin
[temp, alpha] = sort(rand(1,L_total)); % Ánh xạ xáo trộn ngẫu nhiên en_output = encoderm( x, g, alpha, puncture ) ; % Lối ra bộ mã hóa (+1/-1)
r = en_output+sigma*randn(1,L_total*(2+puncture)); % Các bít nhận
yk = demultiplex(r,alpha,puncture); % Phân kênh tạo lối vào cho bộ giải mã 1 và 2 % Tỷ lệ bít nhận
rec_s = 0.5*L_c*yk;
% Tối ưu hóa thông tin ngoại lai L_e(1:L_total) = zeros(1,L_total); for iter = 1:niter
% Bộ giải mã 1
L_a(alpha) = L_e; % Thông tin tiền nghiệm if dec_alg == 0
L_all = logmapo(rec_s(1,:), g, L_a, 1); % Thông tin đầy đủ end
L_e = L_all - 2*rec_s(1,1:2:2*L_total) - L_a; % Thông tin ngoại lai % Bộ giải mã 2
L_a = L_e(alpha); % Thông tin tiền nghiệm if dec_alg == 0
L_all = logmapo(rec_s(2,:), g, L_a, 2); % Thông tin đầy đủ. else end
L_e = L_all - 2*rec_s(2,1:2:2*L_total) - L_a; % Thông tin ngoại lai % Ước lượng các bít thông tin
%Số lượng các lỗi bít trong lặp hiện tại
err(iter) = length(find(xhat(1:L_total-m)~=x)); % Đếm khung lỗi cho lặp hiện tại
if err(iter)>0
nferr(nEN,iter) = nferr(nEN,iter)+1; end
end
% Số lượng tổng cộng các bít lỗi cho tất cả quá trình lặp errs(nEN,1:niter) = errs(nEN,1:niter) + err(1:niter);
if rem(nframe,3)==0 | nferr(nEN, niter)==ferrlim % Tỷ lệ lỗi bít
ber(nEN,1:niter) = errs(nEN,1:niter)/nframe/(L_total-m); % Tỷ lệ lỗi khung
fer(nEN,1:niter) = nferr(nEN,1:niter)/nframe; %Hiển thị kêt quả
fprintf('************** Eb/N0 = %5.2f db **************\n', EbN0db(nEN));
fprintf('Frame size = %d, rate 1/%d. \n', L_total, 2+puncture); fprintf('%d Khung phát, %d Khung lỗi.\n', nframe, nferr(nEN, niter)); fprintf('Tỷ lệ lỗi bít (Lặp từ 1 cho tới %d):\n', niter);
for i=1:niter
fprintf('%8.4e ', ber(nEN,i)); end fprintf('\n');
fprintf('Tỷ lệ lỗi khung (Lặp từ 1 cho tới %d):\n', niter); for i=1:niter
fprintf('***********************************************\n\n'); % Lưu lại kết quả
save turbo_sys_demo EbN0db ber fer end
end %while end
%nEN diary off
%Chương trình chuyển tử File .txt sang dạng đổ thị. clear all
SNRdB=-1:0.5:2;
L1=[1.6918e-001 1.4188e-001 1.1636e-001 8.8204e-002 6.0383e-002 4.0226e-002 2.1772e-002];
L2=[1.6315e-001 1.3534e-001 1.0160e-001 6.3608e-002 3.1529e-002 1.3906e-002 3.8956e-003];
L3=[1.6399e-001 1.3467e-001 9.6577e-002 5.3954e-002 2.0587e-002 7.6621e-003 1.6597e-003];
L4=[1.6332e-001 1.3518e-001 9.3122e-002 4.9590e-002 1.9047e-002 5.1714e-003 1.1295e-003];
L5=[1.6298e-001 1.3534e-001 9.3907e-002 4.7342e-002 1.8074e-002 3.4330e- 0039.1233e-004];
hold on semilogy(SNRdB,L1,'y-s'); semilogy(SNRdB,L2,'b-^');
semilogy(SNRdB,L3,'k-o'); semilogy(SNRdB,L4,'r-+'); semilogy(SNRdB,L5,'m-v'); title('Moi lien he BER va SNR'); xlabel('SNRdB'); ylabel('Log(BER)');
Tài liệu tham khảo
[1]Bernard Sklar. “Fundamentals of Turbo Codes”, Prentice-Hall, 2002.
[2]John B. Anderson , Joachim Hagenauer. “Trellis and Turbo coding”, IEEE Press, 2004.
[3] Yufei, “Matlab code for experiment on Turbo codes”, 1999. [4] Website http://ebook.edu.vn
[5] Website http://www.mathworks.com.
[6] Website http://en.wikipedia.org/wiki/Turbo_code
[7] Nguyễn Xuân Đồng. Mã Chập cấu trúc cây và Ứng dụng, Khóa luận tốt nghiệp, Đại học Công Nghệ, ĐHQGHN.
[8] Nguyễn Tùng Hưng, Doãn Đình Thanh, “Tăng tốc độ hồi qui trong giải mã Turbo”, Hà Nội, 2006