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