Thực hiện chạy chương trình nhiều lần với các thông số đầu vào khác nhau,ta
được kết quả như bảng.
Lần 1 Lần 2 Lần 3 Lần 4 Lần 5 Lần 6 Lần 7
Thuật toán
Log-Map Log-Map SOVA SOVA Log-Map SOVA Log-Map
Kích thước khung 300 300 300 300 500 1000 1000 Kỹ thuật xoá
Có Có Không Không Có Không Có
Số lần lặp mỗi khung 5 10 5 10 5 5 5 Số khung bị lỗi để kết thúc 10 10 10 10 5 3 3 Eb/No (dB) 2 2 3 2 3 3 3
Bảng 5.1 Thông số các lần chạy chương trình Và kết quả cuối cùng của các lần chạy chương trình như sau:
57
Lần1 ***************************** Eb/N0 = 2.00 db *********************************** Kich thuoc khung = 300, rate 1/2.
132 Khung da trao doi , 10 Khung bi loi. Ti le loi bit (Tu lan lap 1 cho den 5):
2.3337e-002 5.1098e-003 2.1100e-003 1.3219e-003 1.6270e-003 Ti le loi khung (Tu lan lap 1 cho den 5):
9.1667e-001 3.0303e-001 1.2879e-001 8.3333e-002 7.5758e-002
*******************************************************************************
Lần2 ***************************** Eb/N0 = 2.00 db *********************************** Kich thuoc khung = 300, rate 1/2.
665 Khung da trao doi , 10 Khung bi loi. Ti le loi bit (Tu lan lap 1 cho den 10):
2.1310e-002 3.8149e-003 1.2414e-003 7.2160e-004 5.8536e-004 4.3902e-004 4.4911e-004 3.9360e-004 4.4406e-004 3.4314e-004
Ti le loi khung (Tu lan lap 1 cho den 10):
8.7669e-001 2.6316e-001 7.6692e-002 3.4586e-002 2.8571e-002 1.9549e-002 1.6541e-002 1.5038e-002 1.3534e-002 1.5038e-002
*******************************************************************************
Lần3 ***************************** Eb/N0 = 3.00 db *********************************** Kich thuoc khung = 300, rate 1/3.
3406 Khung da trao doi , 10 Khung bi loi. Ti le loi bit (Tu lan lap 1 cho den 5):
3.5705e-003 1.8030e-004 7.8819e-005 6.9952e-005 4.4335e-005 Ti le loi khung (Tu lan lap 1 cho den 5):
2.9008e-001 1.9671e-002 5.8720e-003 4.1104e-003 2.9360e-003
*******************************************************************************
Lần4 ***************************** Eb/N0 = 2.00 db *********************************** Kich thuoc khung = 300, rate 1/3.
408 Khung da trao doi , 10 Khung bi loi. Ti le loi bit (Tu lan lap 1 cho den 10):
2.4345e-002 4.9595e-003 2.1467e-003 1.5380e-003 1.0034e-003 8.0603e-004 8.1425e-004 7.5668e-004 7.1555e-004 6.2508e-004
Ti le loi khung (Tu lan lap 1 cho den 10):
8.0147e-001 2.3775e-001 9.8039e-002 6.1275e-002 4.4118e-002 3.6765e-002 3.4314e-002 2.9412e-002 2.4510e-002 2.4510e-002
Chương 5: Chương trình mô phỏng và kết quả
58
Lần5 ***************************** Eb/N0 = 3.00 db *********************************** Kich thuoc khung = 500, rate 1/2.
1557 Khung da trao doi , 5 Khung bi loi. Ti le loi bit (Tu lan lap 1 cho den 5):
3.5505e-003 7.3512e-005 1.9345e-005 2.5794e-005 2.0635e-005 Ti le loi khung (Tu lan lap 1 cho den 5):
4.6692e-001 1.2845e-002 3.2113e-003 3.2113e-003 3.2113e-003
*******************************************************************************
Lần6 ***************************** Eb/N0 = 3.00 db *********************************** Kich thuoc khung = 1000, rate 1/3.
1420 Khung da trao doi , 3 Khung bi loi. Ti le loi bit (Tu lan lap 1 cho den 5):
3.0484e-003 4.2338e-005 1.4113e-005 1.8347e-005 6.3507e-006 Ti le loi khung (Tu lan lap 1 cho den 5):
6.1972e-001 1.9014e-002 7.0423e-003 4.2254e-003 2.1127e-003
*******************************************************************************
Lần7 ***************************** Eb/N0 = 3.00 db *********************************** Kich thuoc khung = 1000, rate 1/2.
1177 Khung da trao doi , 3 Khung bi loi. Ti le loi bit (Tu lan lap 1 cho den 5):
3.5560e-003 2.1283e-005 6.8106e-006 5.1079e-006 5.1079e-006 Ti le loi khung (Tu lan lap 1 cho den 5):
7.3322e-001 1.0195e-002 4.2481e-003 2.5489e-003 2.5489e-003
*******************************************************************************
Bảng 5.2 Kết quả cuối cùng
59
Hình 5.2: Kết quả lần 1
Chương 5: Chương trình mô phỏng và kết quả
60
Hình 5.4: Kết quả lần 3
61
Hình 5.6: Kết quả lần 5
Chương 5: Chương trình mô phỏng và kết quả
62
Hình 5.8: Kết quả lần 7
Qua những hình trên và một số kết quả chạy chương trình khác,ta có nhận xét:
số lần lặp càng lớn thì tỉ lệ lỗi bit cũng như tỉ lệ lỗi khung đều giảm.
nếu số lương khung đưa vào càng lớn thì BER và FER càng thấp(thể hiện rõ trong Hình 5.7 và Hình 5.8).
mã sẽ hoạt động tốt khi ta lựa chọn kích thước khung lớn. tỉ lệ lỗi khung(FER) thường lớn hơn tỉ lệ lỗi bit(BER) nhưng
lần lặp càng lớn thì BER~FER(trong hình 5.7 và 5.8 khi lần lặp thứ 5 thì BER~ FER ~0).
5.4 KẾT LUẬN CHƯƠNG
Sau khi chạy chương trình với các thông số đầu vào cho như bảng 5.1 và chạy nhiều lần chương trình với các thông số khác nhau và các kết quả này đều
Chương 5: Chương trình mô phỏng và kết quả
Bắt Đầu
Chọn thuật toán giải mã Chọn kích thước khung Chọn kỹ thuật xoá Chọn số lần lặp mỗi khung Chọn số khung lôĩ để kết thúc Mã hoá Cộng nhiễu Gauss Giải mã TC Đếm lỗi Đếm lỗi < giới hạn lỗi Đúng Sai Kết thúc Hiển thị BER Hiển thị FER
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
Do thời gian có hạn nên trong đồ án này vẫn chưa trình bày hết các vấn đề về mã Turbo ,trong đồ án này chỉ tập trung trình bày về mã Turbo PCCC( kết nối song song ).Nhìn nhận một cách tổng quát về các thuật toán giải mã , các kỹ thuật mã hoá ,bộ chèn và kỹ thuật xoá của mã Turbo PCCC rate 1/2 ,1/3 và chương trình mô phỏng cũng dựa trên mã này.
Một phần quan trọng của mã Turbo là thiết kế bộ chèn và biện pháp cải tiến bộ mã vẫn chưa được trình bày chi tiết kỹ trong đồ án này.
Một số hướng phát triển tiếp theo của đồ án như:
Tìm hiểu về mã Turbo kết nối nối tiếp( SCCC). Tìm hiểu về mã Turbo kết nối hổn hợp(HCCC). Nghiên cứu các thuật toán gần tối ưu khác.
Ứng dụng mã Turbo vào các hệ thống truyền thông thế hệ thứ 3 và thứ 4.
Mã Turbo cải tiến từ mã khối(Turbo Block Codes).
Mã TCM(Turbo Codes Modulation): Kết hợp giữa mã Turbo và điều chế.
Các loại mã kết hợp giữa mã hoá nguồn và mã hoá kênh.
TÀI LIỆU THAM KHẢO
1. Vũ Đức Thọ ,“Thông tin di động số Cellular”, NXB Khoa Học và Kỹ Thuật Hà Nội, 1997.
2. “Giáo trình thông tin di động” ,Hoc viện Bưu chính viễn thông cơ sở 2 Tp Hồ Chí Minh.
3. Đặng Văn Chuyết , Nguyễn Tuấn Anh ,“Cơ sở lý thuyết truyền tin”, NXB Giáo Dục, 1999.
4. Nguyễn Thuý Vân ,“Lý thuyết mã”, NXB Khoa Học và Kỹ Thuật Hà Nội,1999.n Multiple Access
5. Mr. Harte ,”Introduction to Code Division Multiple Access”, Althos Inc,2004. 6. Ali H.Mugaibel and Maan A.Kousa,”Understanding Turbo Codes”, King Fahd University of Petroleum and Minerals PO Box ,1271,Dhahran 31261,Saudi Arabia.
7. S. Adrian Barbulescu, Steven.S. Pietrobon,”Turbo Codes:A tutorial on a new class of powerful error correcting coding schemes”,”Part1: Code Structures and Interleaver Design”,26 October 1998.
8. Nguyễn Hoàng Hải-Nguyễn Khắc Kiểm- Nguyễn Trung Dũng-Hà Trần Đức,”Lập trình Matlab”, NXB Khoa Học và Kỹ Thuật ,Hà Nội 2003.
9. Một số website về viễn thông. 10. Đồ án của các khoá trước.
PHẦN PHỤ LỤC
1. Chương trình chính clear all
/ Luu chuong trinh lai/ diary Turbo.txt
/Chon thuat toan giai ma /
Ttgiaima = input(' Hay chon thuat toan giai ma. (0:Log-MAP, 1:SOVA) default 0 '); if isempty(Ttgiaima)
Ttgiaima = 0; end
/Kich thuoc khung/
L_f = input(' Hay chon kich thuoc khung (= info + tail, default: 1000) '); if isempty(L_f)
L_f = 1000; end
/ Ma tran sinh/
g = input(' Hay chon ma tran sinh: ( 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; ns = 2^m;
/puncture = 0, Dung ky thuat xoa voi toc do ma hoa 1/2 . / /puncture = 1, Khong dung ky thuat xoá./
kt_xoa = input(' Hay chon ky thuat xoa / khong dung ky thuat xoa (0/1): default 0 ');
if isempty(kt_xoa) kt_xoa = 0; end
/ Toc do ma hoa(Code rate)/ rate = 1/(2+kt_xoa);
/ a=1 trong kenh nhieu AWGN / a = 1;
/ So lan lap/
lan_lap = input(' Hay chon so lan lap cua moi khung: default 5 '); if isempty(lan_lap)
lan_lap = 5; end
ket_thuc = input(' Hay chon so khung bi loi de ket thuc chuong trinh:default3 '); if isempty(ket_thuc)
ket_thuc = 3; end
EbN0db = input(' Hay chon ti le nang luong tren moi bit Eb/N0 don vi dB:default [3.0] '); if isempty(EbN0db) EbN0db = [3.0]; end fprintf('\n\n---\n'); if Ttgiaima == 0
fprintf(' ================================ GIAI MA Log-MAP ============================= \n');
fprintf(' ================================ GIAI MA SOVA ================================ \n');
end
fprintf(' Kich thuoc khung = %6d\n',L_f); fprintf(' Ma tran sinh: \n');
for i = 1:n for j = 1:K fprintf( '%6d', g(i,j)); end fprintf('\n'); end if kt_xoa==0
fprintf(' Dung ky thuat xoa, code rate = 1/2 \n'); else
fprintf(' Khong dung ky thuat xoa, code rate = 1/3 \n'); end
fprintf(' So lan lap = %6d\n', lan_lap);
fprintf(' Khung loi ket thuc = %6d\n', ket_thuc); fprintf(' Eb / N0 (dB) = '); for i = 1:length(EbN0db) fprintf('%10.2f',EbN0db(i)); end fprintf('\n---\n\n');
fprintf('+ + + + + + + + + CHUONG TRINH DANG CHAY VA CHO RA KET QUA!.+ + + + + + + + +\n');
for nEN = 1:length(EbN0db)
en = 10^(EbN0db(nEN)/10); / chuyen doi tu don vi dB sang so thuong/ L_c = 4*a*en*rate;
errs(nEN,1:lan_lap) = zeros(1,lan_lap); nferr(nEN,1:lan_lap) = zeros(1,lan_lap); nframe = 0;
while nferr(nEN, lan_lap)<ket_thuc nframe = nframe + 1;
x = round(rand(1, L_f-m));
[temp, alpha] = sort(rand(1,L_f));
en_output = bo_ma_hoa( x, g, alpha, kt_xoa ) ; r = en_output+sigma*randn(1,L_f*(2+kt_xoa)); yk = tach_kenh(r,alpha,kt_xoa);
rec_s = 0.5*L_c*yk; L_e(1:L_f) = zeros(1,L_f); for iter = 1:lan_lap
L_a(alpha) = L_e; if Ttgiaima == 0
L_all = logmapo(rec_s(1,:), g, L_a, 1); else
L_all = sova(rec_s(1,:), g, L_a, 1); end
L_e = L_all - 2*rec_s(1,1:2:2*L_f) - L_a; L_a = L_e(alpha);
if Ttgiaima == 0
L_all = logmapo(rec_s(2,:), g, L_a, 2); else
L_all = sova(rec_s(2,:), g, L_a, 2); end
L_e = L_all - 2*rec_s(2,1:2:2*L_f) - L_a; xhat(alpha) = (sign(L_all)+1)/2;
err(iter) = length(find(xhat(1:L_f-m)~=x)); if err(iter)>0
nferr(nEN,iter) = nferr(nEN,iter)+1; end
end
errs(nEN,1:lan_lap) = errs(nEN,1:lan_lap) + err(1:lan_lap); if rem(nframe,3)==0 | nferr(nEN, lan_lap)==ket_thuc
ber(nEN,1:lan_lap) = errs(nEN,1:lan_lap)/nframe/(L_f-m); fer(nEN,1:lan_lap) = nferr(nEN,1:lan_lap)/nframe;
fprintf('***************************** Eb/N0 = %5.2f db ********************************\n', EbN0db(nEN));
fprintf('Kich thuoc khung = %d, rate 1/%d. \n', L_f, 2+kt_xoa);
fprintf('%d Khung da trao doi , %d Khung bi loi.\n', nframe, nferr(nEN, lan_lap));
fprintf('Toc do loi bit (Tu lan lap 1 cho den %d):\n', lan_lap); for i=1:lan_lap
fprintf('%8.4e ', ber(nEN,i)); end
fprintf('\n');
fprintf('Toc do loi khung (Tu lan lap 1 cho den %d):\n', lan_lap); for i=1:lan_lap fprintf('%8.4e ', fer(nEN,i)); end fprintf('\n'); fprintf('************************************************************* ******************\n\n');
save Chuong_trinh_chinh EbN0db ber fer end
end diary off
2.Thuật toán SOVA
function L_all = sova(rec_s, g, L_a, ind_dec) L_f = length(L_a); [n,K] = size(g); m = K - 1; ns = 2^m; Infty = 1e10; delta = 30;
[next_out, next_state, last_out, last_state] = so_do_trellis(g); for t=1:L_f+1 for state=1:ns path_metric(state,t) = -Infty; end end path_metric(1,1) = 0; for t=1:L_f y = rec_s(2*t-1:2*t); for state=1:ns sym0 = last_out(state,1:2); sym1 = last_out(state,3:4); state0 = last_state(state,1); state1 = last_state(state,2);
Mk0 = y*sym0' - L_a(t)/2 + path_metric(state0,t); Mk1 = y*sym1' + L_a(t)/2 + path_metric(state1,t);
if Mk0>Mk1
path_metric(state,t+1)=Mk0; Mdiff(state,t+1) = Mk0 - Mk1;
prev_bit(state, t+1) = 0; else path_metric(state,t+1)=Mk1; Mdiff(state,t+1) = Mk1 - Mk0; prev_bit(state,t+1) = 1; end end end if ind_dec == 1 mlstate(L_f+1) = 1; else
mlstate(L_f+1) = find( path_metric(:,L_f+1)==max(path_metric(:,L_f+1)) ); end
for t=L_f:-1:1
est(t) = prev_bit(mlstate(t+1),t+1);
mlstate(t) = last_state(mlstate(t+1), est(t)+1); end for t=1:L_f llr = Infty; for i=0:delta if t+i<L_f+1 bit = 1-est(t+i);
temp_state = last_state(mlstate(t+i+1), bit+1); for j=i-1:-1:0
bit = prev_bit(temp_state,t+j+1);
temp_state = last_state(temp_state, bit+1); end
if bit~=est(t)
llr = min( llr,Mdiff(mlstate(t+i+1), t+i+1) ); end
end L_all(t) = (2*est(t) - 1) * llr; end 3.Đưa kết quả bằng hình figure; subplot(121);
plot([3.5560e-003 2.1283e-005 6.8106e-006 5.1079e-006 5.1079e-006 ]); hold on;
subplot(122);
plot([7.3322e-001 1.0195e-002 4.2481e-003 2.5489e-003 2.5489e-003]);
4.Thuật toán Logmap
function L_all = logmapo(rec_s,g,L_a,ind_dec) L_f = length(rec_s)/2;
[n,K] = size(g); m = K - 1; ns = 2^m;
[next_out, next_state, last_out, last_state] = so_do_trellis(g); Infty = 1e10; Alpha(1,1) = 0; Alpha(1,2:ns) = -Infty*ones(1,ns-1); if ind_dec==1 Beta(L_f,1) = 0; Beta(L_f,2:ns) = -Infty*ones(1,ns-1); elseif ind_dec==2 Beta(L_f,1:ns) = zeros(1,ns); else
fprintf('ind_dec la gioi han den 1 va 2!\n'); end
for k = 2:L_f+1 for state2 = 1:ns
gamma = -Infty*ones(1,ns); gamma(last_state(state2,1))=(-rec_s(2*k- 3)+rec_s(2*k2)*last_out(state2,2)).... -log(1+exp(L_a(k-1))); gamma(last_state(state2,2))=(rec_s(2*k-3)+rec_s(2*k- 2)*last_out(state2,4)).... +L_a(k-1)-log(1+exp(L_a(k-1))); if(sum(exp(gamma+Alpha(k-1,:)))<1e-300) Alpha(k,state2)=-Infty; else
Alpha(k,state2) = log( sum( exp( gamma+Alpha(k-1,:) ) ) ); end
end
tempmax(k) = max(Alpha(k,:)); Alpha(k,:) = Alpha(k,:) - tempmax(k); end for k = L_f-1:-1:1 for state1 = 1:ns gamma = -Infty*ones(1,ns); gamma(next_state(state1,1))=(-rec_s(2*k+1)+rec_s(2*k+2)*next_out(state1,2)).... -log(1+exp(L_a(k+1))); gamma(next_state(state1,2)) = (rec_s(2*k+1)+rec_s(2*k+2)*next_out(state1,4)).... +L_a(k+1)-log(1+exp(L_a(k+1))); if(sum(exp(gamma+Beta(k+1,:)))<1e-300) Beta(k,state1)=-Infty; else Beta(k,state1) = log(sum(exp(gamma+Beta(k+1,:)))); end end
end for k = 1:L_f for state2 = 1:ns gamma0 = (-rec_s(2*k-1)+rec_s(2*k)*last_out(state2,2)).... -log(1+exp(L_a(k))); gamma1 = (rec_s(2*k-1)+rec_s(2*k)*last_out(state2,4))... +L_a(k)-log(1+exp(L_a(k))); temp0(state2)=exp(gamma0 + Alpha(k,last_state(state2,1)) + Beta(k,state2));
temp1(state2)= exp(gamma1 + Alpha(k,last_state(state2,2)) + Beta(k,state2));
end
L_all(k) = log(sum(temp1)) - log(sum(temp0)); end
5 Bộ mã hoá
function en_output = bo_ma_hoa( x, g, alpha, kt_xoa ) [n,K] = size(g); m = K - 1; L_info = length(x); L_f = L_info + m; input = x; output1 = rsc_ma_hoa(g,input,1); y(1,:) = output1(1:2:2*L_f); y(2,:) = output1(2:2:2*L_f); for i = 1:L_f input1(1,i) = y(1,alpha(i)); end
output2 = rsc_ma_hoa(g, input1(1,1:L_f), -1 ); y(3,:) = output2(2:2:2*L_f);
for i = 1:L_f for j = 1:3 en_output(1,3*(i-1)+j) = y(j,i); end end else for i=1:L_f en_output(1,n*(i-1)+1) = y(1,i); if rem(i,2) en_output(1,n*i) = y(2,i); else en_output(1,n*i) = y(3,i); end end end
en_output = 2 * en_output - ones(size(en_output)); 6 .Số nguyên
function nhi_phan = nhi_phan( so_nguyen, m ) %chuyen vec to nguyen sang ma tran nhi phan for j = 1:length( so_nguyen)
for i = m:-1:1
state(j,m-i+1) = fix( so_nguyen(j)/ (2^(i-1)) );
so_nguyen(j) = so_nguyen(j) - state(j,m-i+1)*2^(i-1); end
end
nhi_phan = state;