tic
%function [uhat,vhat]=ldpc_llrbpdecode(rx_waveform,SNR,amp,scale,H,rearranged_cols)
max_iter=100;
H=round(rand(128,256));%随机生成的矩阵
dim=size(H);
rows=dim(1);
cols=dim(2);%分别表示H的行数和列数
vhat(1,1:cols)=0;
zero(1,1:rows)=0;
u=round(rand(1,100));%根据H矩阵而定,这是编码出来的码字
num=length(u);
amp=1;
tx_waveform=bpsk(u,amp);
SNR=10;
rx_waveform=awgn(tx_waveform,SNR);
%sigma2=0.1;
scale(1:num)=1;
pl1=1./(1+exp(-2*amp*rx_waveform.*scale/(SNR/2))); %pl1为信道传递给变量节点的为1的初始概率,后面的参数是什么意思?rx-waveform是码率,SNR信噪比
pl0=1-pl1;%amp等于1?
%L=2.*rx_waveform./sigma2;
%newh(1:rows, 1:cols)=s;
[h1i h1j]=find(H==1);
h1num=length(h1i);
for i=1:h1num
Lqmn(h1i(i),h1j(i))=log2((pl0(h1j(i))/pl1(h1j(i))));
end
iter=0;
for iteration=1:max_iter
for i=1:h1num
a(i)=tanh(Lqmn(h1i(i),h1j(i)));
b(i)=tanh(Lqmn(h1i(i),h1j(i))*0.5);
a(i)=b(i);
end
for i=1:rows
colind=find(h1i==i);
colnum=length(colind);
for j=1:colnum
proh_tanh=1;
for k=1:colnum
if k~=j
proh_tanh=proh_tanh*a(colind(k));
end
end
Lrmn(i,h1j(colind(j)))=log((1+proh_tanh)/(1-proh_tanh));
end
end
for j=1:cols
rowind=find(h1j==j);
rownum=length(rowind);
sum_rmn=0;
for i=1:rownum
sum_rmn=sum_rmn+Lrmn(h1i(rowind(i)),j);
end %完成了每一列的求和运算
for i=1:rownum
Lq(h1i(rowind(i)),j)=Lqmn(h1i(rowind(i)),j)+sum_rmn;
Lqmn(h1i(rowind(i)),j)=Lq(h1i(rowind(i)),j)-Lrmn(h1i(rowind(i)),j);
if Lq(h1i(rowind(i)),j)>0
vhat(j)=0;
else
vhat(j)=1;
end
end
end
iter=iter+1;
c=vhat*H';
%if (mul_GF2(vhat,H')==0)
% number=iter;
% break;
%end
end
uhat=vhat(1:(cols-rows));
errmax=find(u~=vhat);
nerr=length(errmax)
toc