www.pudn.com > ctc-matlab.rar > CtcDecoder.m, change:2005-03-21,size:2522b


function CtcDecode=CtcDecoder(CtcCode,niter,index,L1) 
% niter is the num of decoding iterations 
% first extract the system code and parity from the CtcCode and insert 
% necessary zeros into parity sequences 
% g=[1 0 1 1;1 1 0 1]; 
%首先调用trellis函数生成网格图state_map 
state_map=trellis; 
%第一,四种ctc的码率是1/2,不打孔,直接把接收码字分离成syscode(信息),parity1(校验1)和parity2(校验2)即可 
if index==1|index==4 
    leng=length(CtcCode)/2;% leng is the length of all information bits 
    CtcDecode=zeros(1,leng); 
    syscode=CtcCode(1:leng); 
    parity1=CtcCode(leng+1:leng*3/2); 
    parity2=CtcCode(leng*3/2+1:end); 
%     puncture=[1 1 1 1 1 1]; 
%第二,六种ctc的码率是2/3,需要对parity1和parity2插零 
elseif index==2|index==6 
    leng=length(CtcCode)*2/3; 
    CtcDecode=zeros(1,leng); 
    syscode=CtcCode(1:leng); 
    parity1=zeros(1,leng/2); 
    parity2=zeros(1,leng/2); 
    parity1(1:2:end)=CtcCode(leng+1:leng*5/4); 
    parity2(1:2:end)=CtcCode(leng*5/4+1:end); 
%     puncture=[1 0 1 0 1 0]; 
%其余三种ctc码速率是3/4 
else 
    leng=length(CtcCode)*3/4; 
    CtcDecode=zeros(1,leng); 
    syscode=CtcCode(1:leng); 
    parity1=zeros(1,leng/2); 
    parity2=zeros(1,leng/2); 
    parity1(1:3:end)=CtcCode(leng+1:leng*7/6); 
    parity2(1:3:end)=CtcCode(leng*7/6+1:end); 
%     puncture=[1 0 0 1 0 0]; 
end 
%生成CTC码内交织器,alpha是原始下标交织后的位置 
alpha=CtcInterleaver(syscode); 
%对系统码交织 
sysinterleave=syscode(alpha); 
% reshape 
%将syscode和parity1整合为1路-rec(1,:),sysinterleave和parity2整合为1路-rec(2,:) 
rec=zeros(2,leng*3/2); 
rec(1,1:3:end)=syscode(1:2:end); 
rec(1,2:3:end)=syscode(2:2:end); 
rec(1,3:3:end)=parity1(1:end); 
rec(2,1:3:end)=sysinterleave(1:2:end); 
rec(2,2:3:end)=sysinterleave(2:2:end); 
rec(2,3:3:end)=parity2(1:end); 
start_state1=0; 
start_state2=0; 
%边信息 
L_e=zeros(1,leng); 
%迭代译码 
for iter=1:niter 
    %decoder 1 
%将L_e解交织 
    L_a(alpha)=L_e; 
    [L_all,start_state1]=logmap(rec(1,:),state_map,L_a,iter,start_state1,L1); 
%更新L_e的值 
    L_e(1:2:end)=L_all(1:2:end)-2*rec(1,1:3:end)-L_a(1:2:end); 
    L_e(2:2:end)=L_all(2:2:end)-2*rec(1,2:3:end)-L_a(2:2:end); 
    %decoder 2 
%将L_e交织,对第二个译码器译码 
    L_a=L_e(alpha); 
    [L_all,start_state2]=logmap(rec(2,:),state_map,L_a,iter,start_state2,L1); 
    L_e(1:2:end)=L_all(1:2:end)-2*rec(2,1:3:end)-L_a(1:2:end); 
    L_e(2:2:end)=L_all(2:2:end)-2*rec(2,2:3:end)-L_a(2:2:end); 
end 
%所有迭代完成后,对L_all进行硬判决,并且解交织作为判决结果 
CtcDecode(alpha)=(sign(L_all)+1)/2;