Mã Turbo có cấu trúc gồm ít nhất hai mã RSC được kết nối song song kết hợp với bộ xáo trộn và thuật toán giải mã SISO:
Dữ liệu S Bộ mã chập hệ thống (RSC 1) Xáo trộn L ượ c b ỏ và ghép kênh Bộ mã chập hệ thống (RSC 2) Chuỗi mã R = 1/3; (... SP1 P2 SP1 P2S ...) R = 1/2; (... SP1 SP2 SP1 SP2 ...) S C2 C1 Bộ mã 1 Bộ mã 2 Hình 4.5 Sơđồ má hóa mã Turbo
Như vậy, chuỗi dữ liệu hệ thống đầu vào S được đưa trực tiếp tới bộ mã chập RSC1 tạo ra các bit kiểm tra C1 và đưa qua bộ xáo trộn tới RSC2 tạo ra C2.
Các bít hệ thống và kiểm tra C1,C2 được đưa tới bộ lược bỏ và ghép kênh để loại bỏ bớt các bít kiểm tra để tăng tốc độ mã hóa. Nếu ta loại bỏ xen kẽ C1 và C2 ta được tốc độ mã tổng cộng là 1/2 , còn không loại bỏ thì tốc độ tổng cộng là 1/3.
Tín hiệu đẩu ra bộ mã hóa được điều chế và truyền qua kênh như hình 4.1 Hình 4.2 là ví dụ về sơ đồ mã RSC , trong đó chuỗi đầu vào được đưa ngay tới đầu ra gọi là chuỗi bít hệ thống. Sơđồ trạng thái và sơđồ lưới của ví dụ trong hình 4.2 được biểu diễn trong hình 4.3:
Hồi tiếp Đẩu vào ,u Hệ thống Kiểm tra ,c Hình 4.2 Mã RSC ` 11 00 10 01 1/0 0/1 0/1 1/0 0/0 1/1 1/1 0/0 [u/c] 00 11 01 10 11 00 10 01 n-1 n (a) (b) [un,cn] Hình 4.3 Sơđồ trạng thái(a) và sơđồ lưới của mã chập (b)
Tại bộ gải mã , bộ tách kênh sẽ tách ra các bít hệ thống và kiểm tra tương ứng với các bộ giải mã SISO .Bộ SISO là thiết bị giải mã với lối vào mềm , lối ra mềm, trong đó đầu vào là độ tin cậy kênh ( Lc(x)) , thông tin tiền nghiệm ( L(d)). Đầu ra gồm thông tin hậu nghiệm L(dˆ), thông tin hệ thống dư ( Le( ) còn gọi là thông tinh ngoại lai ( extrinsic information ) . Vấn đề này chúng ta đã xét ở chương 3.
Do đầu phát sử dụng bộ xáo trộn ( xem chương 2) , nên trong bộ giải mã có các bộ xáo trộn giống hệt ởđầu phát và các bộ giải xáo trộn tương ứng.
Bộ giải mã dùng thuật giải mã lặp nên thông tin dưđược sử dụng làm thông tin tiền nghiệm cho bộ giải mã SISO ( RSC1) khác. Để nâng cao chất lượng giải mã người ta tăng số lần lặp n , số lần lặp có thểđược quy định trước hoặc tựđộng dừng theo nhiều biện pháp đánh giá .
Do vậy bộ giải mã lặp có cấu trúc như sau : Kênh bk k c1 ~ k c2 ~ C2k C1k k b~ RSC 1 RSC 2 π S/P P/S
Bộ giải xáo trộn Bộ giải xáo trộn Bộ xáo trộn Bộ xáo trộn Bộ giải mã 1 Bộ giải mã 2 Đầu ra ngoài từ bộ giải mã 2 §Çu ra ngoµi tõ bé gi¶i m· thø 1 Chuçi bÝt k tra cña m· thø 1 thu ®−îc c1k iÓm ~ c~1k Chuçi bÝt kiÓm tra cña m· thø 2 thu ®−îc c~2k k c2 ~ Chuỗi bit hệ thống thu được b~k Hình 4.4 Sơđồ giải mã lặp
Như vậy , chuỗi mã tại đẩu ra của bộ ghép kênh sẽđược đưa tới bộ phân kênh thông qua kênh truyền .
Do đó, tại lối ra của bộ phân kênh chứa bit hệ thống , hai chuỗi bít kiểm tra ( bít được mã hóa) và các chuỗi bit này sẽ bị lỗi do ảnh hường của kênh truyền.
Giả sử chuối bít hệ thống đầu vào là bk, hai chuỗi bit mã hóa là C1k và C2k. Chuỗi bit hệ thống và kiểm tra thu được qua kênh truyền tương ứng là
k k
k C C
b~ , ~1 , ~2 .
Theo hình 4.4 thí đầu tiên cho chuỗi bít hệ thống b~kvà C~1k qua bộ giải mã 1 hi đó ta sẽ thu được chuỗi bít , giả sừ là b~k′.Cả hai chuỗi b~k,b~k′cho qua bộ xáo
của bộ giải mã sẽ là chuỗi b~′′k .Để thu được chuỗi thông tin hệ thống ban đầu cần phải
cho chuỗi b~′′k qua bộ giải xáo trộn.
Thực ra trong sơđồ trên thì các bộ giải mã chính là bộ giải mã SISO.
Ởđây thông tin ngoại lai dược đưa vào bộ giải mã để tạo nên quá trình lặp.Quá trình lặp cho đến khi nào mà xác suất lỗi bít của chuỗi hệ thống là cực tiểu điều này tương đương với việc lặp cho đến khi khôi phục đựợc chuỗi đầu vào.
-1 -0.5 0 0.5 1 1.5 2 10-4 10-3 10-2 10-1 100
Moi lien he BER va SNR
SNRdB Lo g( B E R) lap 1 lap 2 lap 3 lap 4 lap 5 Hình 4.5 Kết quả mô phỏng bằng Matlab
4.3 ỨNG DỤNG MÃ TURBO
Theo tài liệu của NASA về thông tin vũ trụ thì mã Turbo được ứng dụng trong các bộ phát đáp. Ủy ban tư vấn về hệ thống dữ liệu vũ trụ (CCSDS) đã khuyến nghị sử dụng các mã với các bộ mã Turbo 16 trạng thái, tốc độ 1/2 , 1/3 ,1/4 , và 1/6.
Theo khuyến nghị của CDMA 2000 trong hệ thống thông tin di động tế bào thế hệ thứ ba 3G
CDMA băng rộng thì mã Turbo được sử dụng cho cả hai hướng đi và về, với mã Turbo 8 trạng thái tốc độ 1/2, và 1/3 và mã chập kết nối tiếp 4 trạng thái tốc độ 1/3
Trong hệ thống thông tin di độngINMARSAT đa phương tiện thì mã Turbo được sử dụng trong hệ thống điều chế 16-QAM, tốc độ 64kb/s.Còn trong dịch vụ số thì hiện đang nghiên cứứng dụng.
KẾT LUẬN :
Như vậy, Mã turbo là bộ mã có chất lượng tốt nhất so với các bộ mã đã 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ã chấp nhận được.Các kết quả mô phỏng đều cho thấy chất lượng của bộ mã này tiến gần giới hạn Shannon khi khung dữ liệu phát khá lớn.Khi khung dữ liệu nhỏ chất lượng của nó vấn tốt hơn rất nhiều so với các bộ mã hóa khác.
Luận văn với đề tài “ Mã Turbo” đẫ nêu được vai trò của mã kênh trong hệ thông tin số, lý thuyết của Shannon và các bộ mã thường được sử dụng để nâng cao chất lượng của hệ thống như mã chập, mã kề. Các chương cũng đã phân tích được cấu trúc và nguyên lý của mã Turbo thông qua quá trình mã hóa và giải mã lặp.Phân tích được thuật toán SISO thường được sử dụng trong sơ đồ giải mã lặp ( giải mã Turbo).
Và cuối cùng là chương trình mô phỏng bằng Matlab của Yufei cho kết quả dưới dạng File Txt và đã được chuyển thành đồ thị biểu diễn của tỷ số Eb0/B0 vào BẺ qua đó đánh giá chất lượng của mã Turbo .
PHỤ LỤC
Chương trình mô phỏng bằ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 diary turbo_logmap.txt
% Chọn thuật toán giải mã
dec_alg = input(' Please enter the decoding algorithm. (0:Log-MAP, 1:SOVA) default 0 ');
if isempty(dec_alg) dec_alg = 0; end
% Kích thước khung
L_total = input(' Please enter the frame size (= info + tail, default: 400) '); if isempty(L_total)
L_total = 400; % Các bít thông tin và bít đuôi end
%Bộ tạo mã
g = input(' Hãy nhập bộ tạo mã : ( default: g = [1 1 1; 1 0 1 ] ) '); if isempty(g) g = [ 1 1 1; 1 0 1 ]; end %g = [1 1 0 1; 1 1 1 1]; %g = [1 1 1 1 1; 1 0 0 0 1]; [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ã
% Biên độ Fading; a=1 trong kênh AWGN a = 1;
% Số lần lặp
niter = input(' Nhập số lần lặp cho mỗi khung . Mặc định là 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
fprintf(' === Log-MAP decoder === \n'); else
fprintf(' === SOVA decoder === \n'); 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 khung
errs(nEN,1:niter) = zeros(1,niter); nferr(nEN,1:niter) = 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 đủ else
L_all = sova0(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
L_all = sova0(rec_s(2,:), g, L_a, 2); % Thông tin đầy đủ 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 xhat(alpha) = (sign(L_all)+1)/2; %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 %iter
% 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('%8.4e ', fer(nEN,i)); end fprintf('\n'); 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-003 9.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');
Tài liệu tham khảo
[1] Alister Burr, “ Modulation and Coding for wireless Communications”, Prentice Hall ,2001.
[2] C.Richard Johnson et al., “Telecommunication Breakdown”, Prentice Hall, 2004.
[3] John B. Anderson, “Digital Transmission Engineering”, Prentice Hall,
1999.
[4] Sergio Benedetto and Ezio Biglieri, “Principles of Digital Transmission
with wireless amplication”, Kluwer, 1999.
[5] Sklar, “Digital Communication” 2 edition, Mc Graw-Hill, 2001.
[6] Yufei, “ Matlab code for experiment on turbo codes” ( updated June 07,1999)
[7] Nguyễn Trọng Thái , “Nghiên cứu ảnh hưởng của bộ ghép xen tới chất lượng mã Turbo”, Luận Văn Thạc Sĩ Kỹ Thuật, Học viện khoa học kỹ thuật quân sự, Bộ Quốc phòng, 2003