1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/ZJaWlpps
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
在 LDPC 码的 Tanner 图中,从一个顶点出发,经过不同顶点后回到同一个顶点的一些“边”组成的回路称为“环”。经过的边的个数称为环的长度。所有环中周长最小的环称为 LDPC码的围长(girth) 。Tanner 图中的环不可避免的会对译码结果造成非常大的干扰。由于迭代概率译码会使信息在节点间交互传递,若存在环,从环的某一个节点出发的信息会沿着环上的节点不断传递并最终重新回到这个节点本身,从而使得节点自身信息不断累加,进而使得译码的最终结果失败的概率变大。显然,环长越小,信息传递回本身所需走的路径就越短,译码失败的概率就变得越高。Tanner 图形成一个环至少需要 4 个节点组成4 条相连的边,即环长最小为4,这类短环对码字的译码结果干扰最大。定义 LDPC码的行列(RC)约束为:两行或两列中不存在元素 1 的位置有 1 个以上相同的情况。显然,满足 RC 约束的 LDPC 码最低就是 6 环,去除了4 环的干扰。由于4环的检测以及避免最为简单并且必要,因此绝大部分构造方法都会满足 RC 约束。而构造大圈长的码字则需要精确的设计。
4.部分源码
..................................................
%%
%基本参数
n = 576;
k = 288;
rate = k/n;
IterNum = 20;
msg = round(rand(1,k));
[H,c] = encode(msg);
Nerr = 500;
Npf = Nerr*n;
for ij=1:length(EbN0db)
ij
en1 = 10^(EbN0db(ij)/10);
sigma = 1/sqrt(2*rate*en1);
cnt = 0;
Err1 = 0;
while cnt < Nerr
[ij,cnt]
cnt = cnt+1;
code = c;
I = 1-2*code;
rec1 = I+sigma*randn(1,n);
est_code22 = BP_decode(rec1,H,sigma, IterNum);
est_code2 = est_code22(1:k);
err1 = length(find(est_code2~=msg));
Err1 = Err1+err1;
end
BER3(ij) = Err1/(Nerr*k);
end
for ij=1:length(EbN0db)
ij
en2 = 10^(EbN0db(ij)/10);
sigma = 1/sqrt(2*rate*en2);
cnt = 0;
Err2 = 0;
while cnt<Nerr
[ij,cnt]
cnt = cnt+1;
code = c;
I = 1-2*code;
rec1 = I + sigma*randn(1,n);
est_code = BF_decode(rec1,H,IterNum);
err2 = length(find(est_code~=c));
Err2 = Err2+err2;
end
BER4(ij)=Err2/(Nerr*k);
end
figure
semilogy(EbN0db,BER1,'-bs',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.0,0.0]);
hold on;
semilogy(EbN0db,BER2,'-r>',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.9,0.0]);
hold on;
semilogy(EbN0db,BER3,'-k<',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.9,0.3,0.3]);
hold on;
semilogy(EbN0db,BER4,'-mo',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.5,0.9,0.0]);
hold on;
grid on
xlabel('EbN0(dB)');
ylabel('误码率');
legend('BP译码,迭代2次','BF译码,迭代2次','BP译码,迭代20次','BF译码,迭代20次');
A490