function x_hat=bp_dec(rx,H,iterate) %应该可以使用稀疏矩阵实现
%Simplified log-BP decoder of LDPC
%rx is the received code which carries the soft information
%H is the LDPC matrix
%iterate is the iterating times
%Author:LEE Ming-yang,10,09,26
%Mail:wo.lmy@163.com QQ:905432530
lcj=-rx; %后验似然信息
[M N]=size(H);
lrij=zeros(M,N); %初始化校验信息
lqij=H.*repmat(lcj,M,1); %关键,体现了校验节点和变量节点在H阵中的关系
alphaij=zeros(M,N); %sign(lqij)
betaij=zeros(M,N); %lqij
lqj=zeros(1,N);
for it=1:iterate
alphaij=sign(lqij); %i行j列,迭代之前赋值
betaij =abs(lqij);
%水平处理,得到校验节点信息
for i=1:M %遍历行
cl=find(H(i,:)); %从某行中找非0列
for j=1:length(cl) %j都遍历相关联的变量节点
min_beta=realmax; %每次使用之前初始化
temp_beta=betaij(i,cl); %只要有用的,无关量是0,会干扰判断
temp_beta(j)=realmax; %j个对应的那列不用于比较
min_beta=min(temp_beta);
%betaij(i,j)=min_beta; %只是个标志,没什么用
temp_alpha=alphaij(i,cl);
temp_alpha(j)=1;
prod_alpha=prod(temp_alpha);
lrij(i,cl(j))=prod_alpha*min_beta;
end
end
%垂直处理,得到变量节点信息
for j=1:N
rl=find(H(:,j));
for i=1:length(rl)
lqij(rl(i),j)=lcj(j)+sum(lrij(rl,j))-lrij(rl(i),j);
end
%累加处理
lqj(j)=lcj(j)+sum(lrij(rl,j));
if lqj(j)>0
x_hat(j)=0;
else
x_hat(j)=1;
end
end
end