📄 llr_bp_decode.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%对数域bp译码算法 %%%%%
%%%%%《ldpc译码算法的研究与仿真》%%%
%%%%% %%%%%
%%%%% %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [uhat vhat]=llr_bp_decode(rx_waveform,SNR,amp,scale,H,rearranged_cols)
dim=size(H);
rows=dim(1);
cols=dim(2);
vhat(1,1:cols)=0;
zero(1,1:rows)=0;
[hr,hc]=find(H==1);
len=length(hr);
s=struct('zmn',0,'lmn',0,'zn',0);
newh(1:rows, 1:cols)=s;
%step1
%qmn0=1-qn=pr(sn=+1|y)=1/(1+exp(-2*y/deta^2))
%qmn1=qn=pr(sn=-1|y)=1/(1+exp(2*y/deta^2))
%deta^2为噪声的方差,等于N0/2
%初始化对于每一个m.n,zmn=Fn
qmn0=1./(1+exp(-2*amp*rx_waveform.*scale/(SNR/2)));
qmn1=1-qmn0;%1./(1+exp(2*amp.*rx_waveform.*scale/(SNR/2)));
Fn=log(qmn0./qmn1);
for i=1:len
newh(hr(i),hc(i)).zmn=Fn(hc(i));
end
%step2
%迭代译码,迭代次数100
for iteration=1:100
%step2-1
%从校验节点到信息节点
for i=1:rows
colind=find(hr==i);
colnum=length(colind);
for j=1:colnum
tmn_l=1;
for k=1:colnum
if k~=j
zmn_l=newh(i,hc(colind(k))).zmn;
tmn_l=tmn_l*((1-exp(zmn_l))/(1+exp(zmn_l)));
end
end
% tmn_l=newh(i,hc(colind(j))).tmn;
newh(i,hc(colind(j))).lmn=log((1-tmn_l)/(1+tmn_l));
end
end
%step2-2
%从信息节点到校验节点
for j=1:cols
rowind=find(hc==j);
rownum=length(rowind);
for i=1:rownum
lmn_l=0;
for k=1:rownum
if k~=i
lmn_l=lmn_l+newh(hr(rowind(k)),j).lmn;
end
end
newh(hr(rowind(i)),j).zmn=Fn(j)+lmn_l;
end
%update pseudo posterior probability
%更新伪后验概率
newh(hr(rowind(i)),j).zn=newh(hr(rowind(i)),j).zmn+newh(hr(rowind(i)),j).lmn;
%tentative decoding
%译码尝试,对信息节点的后验概率作硬判决
if newh(hr(rowind(i)),j).zn>0
vhat(j)=1;
else
vhat(j)=0;
end
end
%step2-3
%硬判决
if mul_GF2(vhat,H.')==zero
%如果判决条件满足,译码结束,否则继续迭代
break;
end
end
uhat = extract_mesg(vhat,rearranged_cols);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -