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

📄 trellis_uncoded.m

📁 无线通信信道编码中的网格编码TCM的译码
💻 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 + -