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

📄 siso_dec.m

📁 介绍了turbo码的编码和通用siso译码模块
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%SISO模块设计%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [AO_c,AO_u,OUT]=siso_dec(AI_c,AI_u,g)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% 函数功能:实现级联编码的通用SISO译码模块
%%%% AI_c:编码符号概率对数似然比值(n0*N)
%%%% AI_u:信息符号概率对数似然比值(1*N)

%%%% g:生成矩阵
%%%% AO_c,更新的编码符号概率对数似然比
%%%% AO_u,更新的信息符号概率对数似然比
%%%% OUT,判决输出

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[n0,K] = size(g);
m = K - 1;
Max_states=2^m;
N=length(AI_u);%%%% 每次译码长度
Infty = 1e10;
[next_out, next_state, last_state] = cctrellis(g);

%%%%初始化A,B
A(1,1) = 0; 
A(2:Max_states,1) = -Infty*ones(1:Max_states-1,1); 
B(1:Max_states,N+1) = zeros(1:Max_states,1);
%%%%求分支度量值,分为码字输入概率对数似然比和信息输入概率对数似然比
for k = 1:N
    for state2 = 1:Max_states
        gamma_c(state2,next_state(state2,1),k)=0;
        gamma_c(state2,next_state(state2,2),k)=0;
        for i=1:n0
            gamma_c(state2,next_state(state2,1),k)=gamma_c(state2,next_state(state2,1),k)+...
                AI_c(i,k)*((1+next_out(state2,i))/2);
            gamma_c(state2,next_state(state2,2),k)=gamma_c(state2,next_state(state2,2),k)+...
                AI_c(i,k)*((1+next_out(state2,i+n0))/2);
         end;
            gamma_u(state2,next_state(state2,1),k)=AI_u(k)*0;
            gamma_u(state2,next_state(state2,2),k)=AI_u(k)*1;
            %%%%这里输入为一位,输出为n0位
      end;
end;

%%%%前项递推求A(k)
for k=1:N
    for state2=1:Max_states
        A_e1=A(last_state(state2,1),k)+gamma_u(last_state(state2,1),state2,k)+...
            gamma_c(last_state(state2,1),state2,k);
        A_e2=A(last_state(state2,2),k)+gamma_u(last_state(state2,2),state2,k)+...
            gamma_c(last_state(state2,2),state2,k);
        A(state2,k+1)=max_e(A_e1,A_e2);
    end
    tempmax(k+1) = max(A(:,k+1));
    A(:,k+1) = A(:,k+1) - tempmax(k+1);
end

%%%%后项递推求B(k)
for k=N:-1:1
    for state2=1:Max_states
        B_e1=B(next_state(state2,1),k+1)+gamma_u(state2,next_state(state2,1),k)+...
            gamma_c(state2,next_state(state2,1),k);
        B_e2=B(next_state(state2,2),k+1)+gamma_u(state2,next_state(state2,2),k)+...
            gamma_c(state2,next_state(state2,2),k);
        B(state2,k)=max_e(B_e1,B_e2);
    end
     B(:,k) = B(:,k) - tempmax(k+1);
end

%%%%%%计算基于比特的码字和信息概率对数似然比
%%%初始化码字符号和信息符号的后验对数似然比
Pr_UA0=-Infty*ones(1,N);
Pr_UA1=-Infty*ones(1,N);
Pr_CA0=-Infty*ones(n0,N);
Pr_CA1=-Infty*ones(n0,N);
%%%%找输出cj为0或为1的路径计算
for k=1:N
    for j=1:n0
        for state2=1:Max_states
            %%%%j从1到n0查找,这里判Cj=0,找输出码字为0的路径,求路径距离
            if next_out(state2,j)==-1   
                Distance_c0=A(state2,k)+gamma_u(state2,next_state(state2,1),k)+...
                    gamma_c(state2,next_state(state2,1),k)+B(next_state(state2,1),k+1);
                Pr_CA0(j,k)=max_e(Pr_CA0(j,k),Distance_c0);
            end
            if next_out(state2,n0+j)==-1
                Distance_c0=A(state2,k)+gamma_u(state2,next_state(state2,2),k)+...
                    gamma_c(state2,next_state(state2,2),k)+B(next_state(state2,2),k+1);
                Pr_CA0(j,k)=max_e(Pr_CA0(j,k),Distance_c0);
            end
            %%%%j从1到n0查找,这里判Cj=1,找输出码字为1的路径,求路径距离
            if next_out(state2,j)==1   
                Distance_c1=A(state2,k)+gamma_u(state2,next_state(state2,1),k)+...
                    gamma_c(state2,next_state(state2,1),k)+B(next_state(state2,1),k+1);
                Pr_CA1(j,k)=max_e(Pr_CA1(j,k),Distance_c1);
            end
            if next_out(state2,n0+j)==1
                Distance_c1=A(state2,k)+gamma_u(state2,next_state(state2,2),k)+...
                    gamma_c(state2,next_state(state2,2),k)+B(next_state(state2,2),k+1);
                Pr_CA1(j,k)=max_e(Pr_CA1(j,k),Distance_c1);
            end
%%%%%以上是基于比特的码字概率对数似然比    
 
%%%%%%计算基于比特的信息概率对数似然比 
            if j==1
                Distance_u0=A(state2,k)+gamma_u(state2,next_state(state2,1),k)+...
                    gamma_c(state2,next_state(state2,1),k)+B(next_state(state2,1),k+1);
                Pr_UA0(k)=max_e(Pr_UA0(k),Distance_u0);
                %%%%插入输入为0时的分支距离
                Distance_u1=A(state2,k)+gamma_u(state2,next_state(state2,2),k)+...
                    gamma_c(state2,next_state(state2,2),k)+B(next_state(state2,2),k+1);
                Pr_UA1(k)=max_e(Pr_UA1(k),Distance_u1);
                %%%%插入输入为1时的分支距离
            end
        end
    end
end
Pr_CA=Pr_CA1-Pr_CA0;
Pr_UA=Pr_UA1-Pr_UA0;  %%%%码字和信息的先验输入概率对数似然比信息

AO_c=Pr_CA-AI_c;      %%%%更新的对数似然比信息
AO_u=Pr_UA-AI_u;

for i=1:n0
    for j=1:N
        if AO_c(i,j)>300
            AO_c(i,j)=300;
        elseif AO_c(i,j)<-300
            AO_c(i,j)=-300;
        end
    end
end

for i=1:N
    if AO_u(i)>300
        AO_u(i)=300;
    elseif AO_u(i)<-300
        AO_u(i)=-300;
    end
end

for i=1:N
    if AO_u(i)>0
        OUT(i)=1;
    else
        OUT(i)=0;
    end
end  %%%%判决输出


    
            
        
        
    

⌨️ 快捷键说明

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