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


function CtcCode=CtcEncoder(data,index)
%编码器第二次编码初始状态查找表,第一维:8种终止状态,第二维:编码器的三个寄存器的初始值,第三维:码块长度leng/2再模7的值
LookUpTable=zeros(8,3,6);
LookUpTable(:,:,1)=[0 0 0;1 1 0;1 0 0;0 1 0;1 1 1;0 0 1;0 1 1;1 0 1];
LookUpTable(:,:,2)=[0 0 0;0 1 1;1 1 1;1 0 0;1 0 1;1 1 0;0 1 0;0 0 1];
LookUpTable(:,:,3)=[0 0 0;1 0 1;0 1 1;1 1 0;0 1 0;1 1 1;0 0 1;1 0 0];
LookUpTable(:,:,4)=[0 0 0;1 0 0;0 0 1;1 0 1;1 1 0;0 1 0;1 1 1;0 1 1];
LookUpTable(:,:,5)=[0 0 0;0 1 0;1 0 1;1 1 1;0 0 1;0 1 1;1 0 0;1 1 0];
LookUpTable(:,:,6)=[0 0 0;1 1 1;1 1 0;0 0 1;0 1 1;1 0 0;1 0 1;0 1 0];
leng=length(data);
%CtcCode存放编码结果
if index==1|index==4
    CtcCode=zeros(1,leng*2);
elseif index==2|index==6
    CtcCode=zeros(1,leng*3/2);
else
    CtcCode=zeros(1,leng*4/3);
end
CtcCode(1:leng)=data(:);
%交织
alpha=CtcInterleaver(data);
CtcInterleaved=data(alpha);
%第一次编码
InitialState=[0 0 0];
[code1,FinalState]=ctcenc(data,InitialState);
%计算终止状态值
count=FinalState(1)*4+FinalState(2)*2+FinalState(3);
%查表得第二次编码的初始状态值
FinalState=LookUpTable(count+1,:,mod(leng/2,7));
% FinalState
%第二次编码
[code1,FinalState]=ctcenc(data,FinalState);
%交织序列第一次编码
[code2,FinalState]=ctcenc(CtcInterleaved,InitialState);
count=FinalState(1)*4+FinalState(2)*2+FinalState(3);
FinalState=LookUpTable(count+1,:,mod(leng/2,7));
% FinalState
%交织序列第二次编码
[code2,FinalState]=ctcenc(CtcInterleaved,FinalState);
%puncturing
if index==1|index==4
    CtcCode(leng+1:leng+leng/2)=code1(:);
    CtcCode(leng+leng/2+1:end)=code2(:);
elseif index==2|index==6
    %r=2/3
    CtcCode(leng+1:leng+leng/4)=code1(1:2:end);
    CtcCode(leng+leng/4+1:end)=code2(1:2:end);
else
    %r=3/4
    CtcCode(leng+1:leng+leng/6)=code1(1:3:end);
    CtcCode(leng+leng/6+1:end)=code2(1:3:end);
end