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

📄 lt_decoder_bec.m

📁 二进制删除信道下的喷泉码(LT码)的译码程序(含注释)。
💻 M
字号:
function output_data=LT_decoder_BEC(input_data,LT_gener_matrix,degrees,length_info)
%output_data=LT_decoder_BEC(input_data,LT_gener_matrix),模拟BEC进行对输入的硬判决译码
%input_data:1*N的向量,
%LT_gener_matrix:LT码的编码生成矩阵

length_input=length(input_data);
length_output=length_info;      %length((LT_gener_matrix(:,1))');

hard_decision=input_data;
% hard_decision=zeros(1,length_input);    %先做硬判决
% for i=1:length_input
%     if input_data(i)>0
%         hard_decision(i)=0;
%     else
%         hard_decision(i)=1;
%     end;
% end;


temp_decode=zeros(1,length_info);       %记录比特节点的当前值
temp_check=zeros(1,length_input);       %记录校验节点的当前值
chetobit_info=zeros(1,length_info);     %校验节点传递给父节点的信息
bittoche_info=zeros(1,length_input);    %比特节点传递给子节点的信息

%==========================================================================
temp_check=hard_decision;               %初始化校验节点信息
trans_matrix=LT_gener_matrix;           %初始化信息传递矩阵,记录每次更新后的tanner图
for i=1:length_input                    %初始化校验节点的分配度数
    degree_checkbit(i)=length(find(trans_matrix(:,i)));
end;


locate_degree1=0;

j=1;
for i=1:length_input
    if degree_checkbit(i)==1
        locate_degree1(j)=i;            %记录度数为1的校验节点位置
        j=j+1;
    end;    
end;


if length(locate_degree1)==0            %无度数为1的分配,则报失败
    output_data=zeros(1,length_output);
    return;
else
    while (locate_degree1~=0)
        for i=1:length(locate_degree1)      %针对度数为1的分配
            temp_vect_check(i)=find(trans_matrix(:,locate_degree1(i)));          %找到非零度数分配对应的行标
            chetobit_info(temp_vect_check(i))=temp_check(locate_degree1(i));     %更新check to bit的传递信息
            temp_decode(temp_vect_check(i))=chetobit_info(temp_vect_check(i));          %更新临时译码值,即更新比特节点
        end;
        %temp_decode=chetobit_info;          %更新临时译码值,即更新比特节点
        for i=1:length(locate_degree1)      %更新生成矩阵(重构图),拆掉传递过的检验节点到比特节点的路径
            trans_matrix(:,locate_degree1(i))=0;
        end;
        for i=1:length(locate_degree1)      %根据新的tanner图,更新校验节点信息
            temp_vect_bit=find(trans_matrix(temp_vect_check(i),:));     %找到一个更新节点的其余子节点
            bittoche_info=zeros(1,length_input);                        %传递信息清零
            for j=1:length(temp_vect_bit)                               %把更新值传递给子节点
                bittoche_info(temp_vect_bit(j))=temp_decode(temp_vect_check(i));
            end;
            temp_check=xor(bittoche_info,temp_check);                   %更新校验节点信息
            trans_matrix(temp_vect_check(i),:)=0;                       %更新生成矩阵(重构图)
        end;
        locate_degree1=0;                       %在新的tanner图中找到度数为1的校验节点
        j=1;
        for i=1:length_input
            temp_vec=find(trans_matrix(:,i));
            if length(temp_vec')==1
                locate_degree1(j)=i;
                j=j+1;
            end;
        end;
    end;
    output_data=temp_decode;
end;    
    
    

    

⌨️ 快捷键说明

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