doubinturboencode.m

来自「采用 DVB反向链路(DVB-RCS)标准中的双二元Turbo码matlab仿真」· M 代码 · 共 42 行

M
42
字号
function [VecOutA,VecOutB,Sc1,Sc2]=DouBinTurboEncode(VecIn,N,Rate)
%---VecOut=DouBinTurboEncode(VecIn,N)----
%DVB-RCS标准的双二元编码器
%输入:
%   输入VecIn串行的二进制 0 1 数据,进入后被分为2路数据A,B
%   N为交织器的长度
%   Rate是编码速率,作为特例,只考虑码率为1/2和1/3两种情况
%输出:
%   VecOutA/VecOutB是编码之后的2路发送序列,采用BPSK调制
%   Sc1和Sc2分别对应于两个CRSC的循环状态
%对符号1映射为+1,而符号0映射为-1(这与常规相反,不过对性能不会影响)
%对凿孔的数据,发送+1和-1的中间值0
%
FrameNum=floor(length(VecIn)/N/2);  %总帧数目
if FrameNum<1
    error('Not enough data inputed');
else
%产生码率1/3的码字序列
    for cnt=1:FrameNum
        FrameA=VecIn(1+(cnt-1)*N*2:2:cnt*2*N-1);
        FrameB=VecIn(2+(cnt-1)*N*2:2:cnt*2*N);
        [W1,Y1,Sc1(cnt)]=CRSC(FrameA,FrameB);
        [InterFrameA,InterFrameB]=interleaver(FrameA,FrameB,N);
        [W2,Y2,Sc2(cnt)]=CRSC(InterFrameA,InterFrameB);
        VecOutA(1+(cnt-1)*N*3:cnt*3*N)=[FrameA Y1 W1];
        VecOutB(1+(cnt-1)*N*3:cnt*3*N)=[FrameB Y2 W2];
    end
end
%凿孔
if Rate==1/2
    for cnt=1:FrameNum
        VecOutA(1+(cnt-1)*N*3:cnt*2*N)=2*VecOutA(1+(cnt-1)*N*3:cnt*2*N)-1;
        VecOutA(cnt*2*N+1:cnt*3*N)=0;
        VecOutB(1+(cnt-1)*N*3:cnt*2*N)=2*VecOutB(1+(cnt-1)*N*3:cnt*2*N)-1;
        VecOutB(cnt*2*N+1:cnt*3*N)=0;
    end
elseif Rate==1/3
    VecOutA=2*VecOutA-1;
    VecOutB=2*VecOutB-1;
else
    error('wrong encoder rate is inputed')
end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?