Kết luận:

Một phần của tài liệu báo cáo mã hóa kênh (Trang 60)

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

Một phần của tài liệu báo cáo mã hóa kênh (Trang 60)

Tải bản đầy đủ (DOC)

(68 trang)
w