1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
LDPC码是麻省理工学院Robert Gallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和实现简单,易于进行理论分析和研究,译码简单且可实行并行操作,适合硬件实现。
LDPC ( Low-density Parity-check,低密度奇偶校验)码是由 Gallager 在1963 年提出的一类具有稀疏校验矩阵的线性分组码 (linear block codes),然而在接下来的 30 年来由于计算能力的不足,它一直被人们忽视。1996年,D MacKay、M Neal 等人对它重新进行了研究,发现 LDPC 码具有逼近香农极限的优异性能。并且具有译码复杂度低、可并行译码以及译码错误的可检测性等特点,从而成为了信道编码理论新的研究热点。
Mckay ,Luby 提出的非正则 LDPC 码将 LDPC 码的概念推广。非正则LDPC码 的性能不仅优于正则 LDPC 码,甚至还优于 Turbo 码的性能,是目前己知的最接近香农限的码。
Richardson 和 Urbank 也为 LDPC 码的发展做出了巨大的贡献。首先,他们提出了一种新的编码算法,在很大程度上减轻了随机构造的 LDPC 码在编码上的巨大运算量需求和存储量需求。其次,他们发明了密度演进理论,能够有效的分析出一大类 LDPC 译码算法的译码门限。仿真结果表明,这是一个紧致的译码门限。最后,密度演进理论还可以用于指导非正则 LDPC码 的设计,以获得尽可能优秀的性能。
LDPC水印系统结构框图LDPC码具有巨大的应用潜力,将在深空通信、光纤通信、卫星数字视频、数字水印、磁/光/全息存储、移动和固定无线通信、电缆调制/解调器和数字用户线(DSL)中得到广泛应用。
M.Chiain 等对 LDPC 码用于有记忆衰落信道时的性能进行了评估。B.Myher 提出一种速率自适应 LDPC 编码调制的方案用于慢变化平坦衰落信道,经推广还可用于 FEC-ARQ 系统。
Flarino 开发的集成了 V-DLPC 的 flash-OFDM 移动无线芯片组己可用于基于 IP 的移动宽带网。VOCAL Technologies.Ltd 提出了一种用于 WLAN 的LDPC/Turbo 不对称解决方案,即下行链路采用 LDPC 码,上行链路采用 Turbo码。研究表明采用该方案后用于IEEE802.11 a/b/gWLAN移动终端的电池寿命可延长至原来的4倍。
工业界也己经有 LDPC 编译码芯片问世。其中,处于领先地位的 Flarion公司 推出的基于 ASIC 的 Vector-LDPC 解决方案使用了约 260 万门,最高可以支持 50000的码长,0.9 的码率,最大迭代次数为 10,译码器可以达到 10Gbps 的吞吐量,其性能己经非常接近香农限,可以满足目前大多数通信业务的需求。AHA 公司、Digital Fountain公司也都推出了自己的编译码解决方案。
1.译码器是基于归一化最小和算法
3.码型选择:CCSDS标准中推荐的用于深空通信的(8176,7154)QC-LDPC码,码率为7/8(0.875)
4.(8176,7154)QC-LDPC码的校验矩阵程序(Matlab)
5.BP译码算法,最小和译码算法(MSA),归一化的最小和译码算法以及未经编码的采用BPSK调制。这几种译码算法的误码率对比程序及误码率曲线对比图。
6.归一化最小和译码算法中修正因子α的选取,考虑选取在不同迭代次数下的α的平均值,给出选取过程的文档,再在取定的α下仿真比较最小和译码算法和归一化最小和译码算法在不同迭代次数下的误码率(matlab)
7.码型分析文档
8.采用归一化最小和译码算法在不同迭代次数的仿真程序以及对比图,作为选择最大迭代次数的依据(matlab)
3.MATLAB核心程序
% H: 校验矩阵
% iteration: 译码迭代次数
% parameter: 归一化参数,值为1表最小和算法;值为其他值,是对最小和算法的改进,归一化最小和,参数一般为常数0.75
[M N] = size(H);
Lci = rx;
Lrji = zeros(M, N);
Pibetaij = zeros(M, N);
Lqij = H.*repmat(Lci, M, 1);
for n = 1:iteration
n
alphaij = sign(Lqij);
betaij = abs(Lqij);
% ----- Horizontal step -----
for i = 1:M
c1 = find(H(i, :));
for k = 1:length(c1)
minOfbetaij = realmax;
for l = 1:length(c1)
if l ~= k
if betaij(i, c1(l)) < minOfbetaij
minOfbetaij = betaij(i, c1(l));
end
end
end
prodOfalphaij = prod(alphaij(i, c1))*alphaij(i, c1(k)); %找到出去当前位的符合乘积
Lrji(i, c1(k)) =parameter*prodOfalphaij*minOfbetaij;
end
end
% ------ Vertical step ------
for j = 1:N
r1 = find(H(:, j));
for k = 1:length(r1)
Lqij(r1(k), j) = Lci(j) + sum(Lrji(r1, j)) - Lrji(r1(k), j);
end
LQi = Lci(j) + sum(Lrji(r1, j));
if LQi < 0
vHat(j) = 1;
else
vHat(j) = 0;
end
end
if H*vHat'==zeros(M,1)
break;
end
end
% fprintf('Min-sum is done...\n');