📄 siso_dec.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 + -