📄 trellis_uncoded.m
字号:
function [decoder_output,apP_out_code,apP_out_mod]=trellis_Uncoded(decoder_input,apP_in,k,n,M ,x)
xxx=x;
% 网格译码,目前结构为 4-8-8 型:输入等效为4进制,输出等效为8进制,网格一共有8个状态
% 初状态为0,暂时为8状态网格图,码率为k/n
% input为符号概率值,M*depth_of_trellis的矩阵
% 进行2/3网格编码的译码,译码输入为8进制,译码输出为4进制
% 初状态为0
number_of_states=2^n;
% generate state transition matrix, output matrix, and input matrix
for j=0:number_of_states-1
for l=0:M-1 % 输入为4进制
[next_state_deci,branch_output]=nxt_stat_trellis_3_4_16(j,l); % 四个参数:状态序号和输入值,后面两个是状态参数
input(j+1,next_state_deci+1)=l; % input: 0-3(输入为4进制)
nextstate(j+1,l+1)=next_state_deci; % nextstate: 0-7(一共8个状态)
output(j+1,l+1)=branch_output; % output: 0-7 (输出为8进制)
end
end
% 引用 SISO_CPM 进行网格译码的编写 没有信道输入值 只有符号的概率值
% 修正一下:符号的概率等效为信道输入值。
% 这个程序可分为三部分,前向度量、后向度量和最后一步整合。
% afa和beta为 number_of_states*depth_of_trellis 矩阵
depth_of_trellis=size(decoder_input,2); % 网格深度(数据长度)
apP=apP_in;
afa=zeros(number_of_states,depth_of_trellis+1);
beta=afa;
% first
% afa_initial
% 先验概率apP和channel_output_matrix是一一对应的,1-depth_of_trellis,和output_MAP一样
% afa和beta是1-depth_of_trellis+1
afa(:,1)=[1;zeros(number_of_states-1,1)];
for i=2:depth_of_trellis+1
for j=0:number_of_states-1
[state_before,input_current,output_current]=get_state_before(j,nextstate,output);
for k=1:size(state_before,2)
afa(j+1,i)=afa(j+1,i)+afa(state_before(k),i-1)*exp(8*decoder_input(output_current(k)+1,i-1))*apP(input_current(k),i-1);
end
end
afa(:,i)=afa(:,i)./(sum(afa(:,i))+eps);
end
% second
% beta_end
beta(:,end)=1/number_of_states*ones(number_of_states,1);
for i=depth_of_trellis:-1:1
for j=0:number_of_states-1
for k=1:size(nextstate,2)
beta(j+1,i)=beta(j+1,i)+beta(nextstate(j+1,k)+1,i+1)*exp(8*decoder_input(output(j+1,k)+1,i))*apP(k,i);
end
end
beta(:,i)=beta(:,i)./(sum(beta(:,i))+eps);
end
% last
% 输出M*depth_of_trellis矩阵output_MAP
apP_mod_MAP=zeros(2^n,depth_of_trellis);
apP_code_MAP=zeros(M,depth_of_trellis);
for i=2:depth_of_trellis+1
for m=0:2^n-1
[ state_before,state_current ]=get_output_before(m,nextstate,output);
for j=1:size(state_before,2)
temp_metric=exp(8*decoder_input(m+1,i-1));
temp_metric=afa(state_before(j)+1,i-1)*temp_metric*beta(state_current(j)+1,i);
apP_mod_MAP(m+1,i-1)=apP_mod_MAP(m+1,i-1)+temp_metric;
end
end
apP_out_mod(:,i-1)=apP_mod_MAP(:,i-1)./(sum(apP_mod_MAP(:,i-1))+eps); % 归一化,输出后验概率,作为下一次迭代(解调)的先验输入
for m=0:M-1
for j=0:number_of_states-1
temp_output=output(j+1,m+1);
temp_metric=exp(8*decoder_input(temp_output+1,i-1));
temp_metric=afa(j+1,i-1)*temp_metric*beta(nextstate(j+1,m+1)+1,i);
apP_code_MAP(m+1,i-1)=apP_code_MAP(m+1,i-1)+temp_metric;
end
end
apP_out_code(:,i-1)=apP_code_MAP(:,i-1)./(sum(apP_code_MAP(:,i-1))+eps); % 归一化,输出后验概率,作为下一次迭代(译码)的先验输入
for m=0:M-1 % 加入先验信息,进行译码输出
output_MAP(m+1,i-1)=apP_code_MAP(m+1,i-1)*apP(m+1,i-1);
end
output_MAP(:,i-1)=output_MAP(:,i-1)./(sum(output_MAP(:,i-1))+eps); % 归一化
[temp,decoder_output(i-1)]=max(output_MAP(:,i-1));
end
decoder_output=decoder_output-1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -