clear;clc;
G = [1 0 0 1 0;0 1 0 1 1;0 0 1 0 1]; % 生成矩阵
H = [1 1 0 1 0;0 1 1 0 1]; % 监督矩阵 目前还不是稀疏的可以修改
x = round(rand(1,90000)); % 信源产生的比特
len = length(x)/3;
x = reshape(x,len,3);
c = x*G;
c = m2j(c); % 码字 m2j是模二加函数,matlab没找到,自己写的,很简单
c1 = c;
c1(c1==1) = -1; % 这两个顺序不能乱
c1(c1==0) = 1;
c1 = c1+normrnd(0,1,size(c1)); % BPSK调制,码字通过信道到达接收端,带有方差为1的高斯白噪声
v_hat = zeros(1,150000);
for i = 1:len % BP译码
L = zeros(1,5);
L_vc = zeros(5,2); % 信息由变量节点到校验节点
L_cv = zeros(5,2); % 信息由校验节点到变量节点
v = zeros(1,5);
% init = zeros(1,5);
% init(c1(i,:)>0) = 1;
% init(c1(i,:)<0) = -1;
for j = 1:10 % 最大迭代次数
if j == 1
L = c1(i,:)*2/1; % LLR=2*x/σ^2 x为接收到的码字
for k = 1:5
loc = find(H(:,k)==1); % find返回的是元素的位置
if length(loc) == 1
L_vc(k,loc) = L(k);
else
L_vc(k,loc(1)) = L(k);
L