Phu Luc

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 11

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');
else
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;
sigma = 1/sqrt(2*rate*en);
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
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
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
Beta(k,:) = Beta(k,:) - tempmax(k+1);
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);
if kt_xoa > 0
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;

You might also like