⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 siso.asv

📁 采用 DVB反向链路(DVB-RCS)标准中的双二元Turbo码matlab仿真程序和仿真结果。支持1/2和1/3码率。支持MAP
💻 ASV
字号:
function [OutLa ,OutLe]=SISO(InLi,Ar,Br,Wr,Yr,InVar,N,Sc)
%---[OutLa ,OutLe]=SISO(InLi,Ar,Br,Wr,Yr,in_var,N,Sc)----
%Turbo码解码器的核心模块:软入软出解码器
%采用Max-Log-MAP算法
%-----------输出--------------
%InLi:输入的先验对数似然比信息,3*N维
%Ar,Br:接收到的加入噪声的信息比特部分,1*N维
%Wr,Yr:接收到的加入噪声的校验比特部分,1*N维
%InVar:整个系统噪声方差
%N:编码帧长
%Sc:循环状态,由发端传过来,因此该程序现在没有预译码部分
%----------输入-------------
%OutLa:解码得到的全部似然对数比,3*N维
%OutLe:解码得到的似然对数比外信息部分,3*N维
%

%对NextStates,行号表示前一状态,分别对应为0~7,列号表示输入数据为0 1 2 3
%对PreStates,行号表示当前状态,分别对应为0~7,列号表示输入数据为0 1 2 3
trellis=struct('NextStates',[0 7 4 3;4 3 0 7;1 6 5 2;5 2 1 6;...
    6 1 2 5;2 5 6 1;7 0 3 4;3 4 7 0],...
    'Outputs',[ [-1 -1] [1 1] [1 1] [-1 -1];...
    [-1 -1] [1 1] [1 1] [-1 -1];...
    [-1 1] [1 -1] [1 -1] [-1 1];...
    [-1 1] [1 -1] [1 -1] [-1 1];...
    [1 1] [-1 -1] [-1 -1] [1 1];...
    [1 1] [-1 -1] [-1 -1] [1 1];...
    [1 -1] [-1 1] [-1 1] [1 -1];...
    [1 -1] [-1 1] [-1 1] [1 -1] ],...
    'PreStates',[0 6 1 7;2 4 3 5;5 3 4 2;7 1 6 0;...
                 1 7 0 6;3 5 2 4;4 2 5 3;6 0 7 1]);
Lc=2/InVar;
%初始化,初始状态是Sc
alpha(1,1:8)=-Inf*ones(1,8);
alpha(1,Sc+1)=0;
beta(N,1:8)=-Inf*ones(1,8);
beta(N,Sc+1)=1;

%
AB_0123=[0 1 2 3];   %分别对应于ab='00''01''10''11'四种情况
AB=[[-1 -1] [-1 +1] [+1 -1] [+1 +1]];
for k=1:N   %帧长
    %输入AB=0的先验概率
%     P0=1/(1+exp(InLi(1,k))+exp(InLi(2,k))+exp(InLi(3,k)));
    %输入AB=[0 1 2 3]的先验概率
%     P0123=[P0 P0*exp(InLi(1,k)) P0*exp(InLi(2,k)) P0*exp(InLi(3,k))];
    %求gama
    P0123=[0 InLi(1,k) InLi(2,k) InLi(3,k)];
    for i=1:8   %状态数,对应于m'(S')
        out=trellis.Outputs(i,:);   %实际要的就是每个状态S'对应的输出和下状态
        NextS=trellis.NextStates(i,:);   %也就是上面矩阵中的1~8行
        gama(k,i,NextS+1)=1/2*Lc*(Ar(k)*AB(1:2:7)+Br(k)*AB(2:2:8)+Wr(k)*out(1:2:7)+Yr(k)*out(2:2:8)).*P0123;
    end
    %normalize gama
%     if max(gama(k,:))~=0
%         gama(k,:,:)=gama(k,:,:)/max(gama(k,:));
%     end
    %alpha(k)
    for S=1:8
        PreS=trellis.PreStates(S,:);
        temp=alpha(k,PreS+1)+gama(k,PreS+1,S);
        alpha(k+1,S)=max(temp);
    end
end
for k=N:-1:2
    % beta(k)
    for Sp=1:8  %S'
        NextS=trellis.NextStates(Sp,:);
        for cnt=1:4
            temp(cnt)=gama(k,Sp,NextS(cnt)+1)+beta(k,NextS(cnt)+1);
        end
        beta(k-1,Sp)=max(temp);
    end
end
for k=1:N
    for Sp=1:8
        NextS=trellis.NextStates(Sp,:);
        temp0(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(1)+1)+beta(k,NextS(1)+1); %对应于输入0
        temp1(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(2)+1)+beta(k,NextS(2)+1); %对应于输入1
        temp2(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(3)+1)+beta(k,NextS(3)+1); %对应于输入2
        temp3(Sp)=alpha(k,Sp)+gama(k,Sp,NextS(4)+1)+beta(k,NextS(4)+1); %对应于输入3
    end
    %对双二元Turbo码,总共有3个后验对数似然比
    OutLa(1,k)=max(temp1)-max(temp0);
    OutLa(2,k)=max(temp2)-max(temp0);
    OutLa(3,k)=max(temp3)-max(temp0);
end
OutLe(1,:)=OutLa(1,:)-Lc*Br-InLi(1,:);
OutLe(2,:)=OutLa(2,:)-Lc*Ar-InLi(2,:);
OutLe(3,:)=OutLa(3,:)-Lc*Ar-Lc*Br-InLi(3,:);

⌨️ 快捷键说明

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