1.算法描述
近年来,ldpc码的优越性得到国内外科研工作者关注,并且已成为现代通信系统不可或缺的部分,被用来检测和修正由信道效应如噪声、衰减和干扰等引起的信息传输错误。然而,其性能提高的同时,编码复杂度也同样提高了,进而导致实际应用中成本增加和资源浪费。为了解决该问题,国内外学者提出了准循环低密度奇偶校验(quasi-cycliclow-densityparity-check,qc-ldpc)码,其校验矩阵由于具有准循环特性,因而在实际通信系统的应用中具有硬件容易实现的优点。
利用大衍数列的独特性质设计指数矩阵,并将其用来扩展原模图矩阵,得到的校验矩阵中不存在四环。因为原模图基矩阵由计算机搜索算法产生,具有列数可灵活改变的优点,并且该方案构造的校验矩阵中六环的数量相比于基于大衍数列构造法大大地减少了。基于大衍数列构造准循环低密度校验码的方法.该方法利用大衍数列固定项差对应的值单调递增的特点,构造出的校验矩阵不含有长度为4的环,具有准循环结构,节省了校验矩阵的存储空间.
LDPC译码分为硬判决译码和软判决译码
硬判决译码又称代数译码,主要代表是比特翻转(BF)译码算法,它的实现比较简单,但是译码性能很差。硬判决译码的基本假设是当校验方程不成立时,说明此时必定有比特位发生了错误,而所有可能发生错误的比特中不满足检验方程个数最多的比特发生错误的概率最大。在每次迭代时翻转发生错误概率最大的比特并用更新之后的码字重新进行译码。
软判决译码是一种基于概率论的译码算法,通常需要与迭代译码进行结合,才能体现成译码性能的优势,基本算法是置信传播(BP)译码算法,它的实现比代数译码方法的复杂度高很多,但译码性能非常好。
为了解决BP译码算法实现困难问题,在学术界牵起了优化算法的浪潮,对数域置信传播译码(LLR BP)算法、最小和(Min-Sum)译码算法、Normalized Min-Sum译码算法、Offset Min-Sum译码算法等相继涌现。
在迭代译码的过程中,信息调度方式分为两种:泛滥式调度和分层式调度。泛滥式调度的特点在于每一次译码迭代过程中,首先计算从变量节点到校验节点的所有软信息,然后计算从校验节点到变量节点的所有软信息。分层调度的特点是在计算每层软信息时,更新此次迭代中的相关的节点信息,用于下一层的软信息计算。
LDPC译码结构的设计方面主要分为三种:全并行译码结果、行并行译码结构、块并行译码结构。泛滥式的调度比较适合全并行结构,但是译码器的硬件复杂度始终是一个技术瓶颈。分层式的调度适合行并行和块并行结构,可以减少译码所需的迭代次数。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
%确定矩阵参数
dim=size(H);
rows=dim(1);
cols=dim(2);
cycle6num = 0;
cycle6(:,3) = 0;
for irow1 = 1:rows
for jcol1 = 1:cols
if H(irow1,jcol1) ==1;
onesInRow1 = find(H(irow1,:));
for ilevel1=1:length(onesInRow1)
jcol2 = onesInRow1(ilevel1);
if jcol2 > jcol1
onesInCol2 = find(H(:,jcol2));
for jvertical1 = 1:length(onesInCol2)
irow2 = onesInCol2(jvertical1);
if irow1~=irow2
onesInRow2 = find(H(irow2,:));
for ilevel2 = 1:length(onesInRow2)
jcol3 = onesInRow2(ilevel2);
if jcol3 > jcol2
onesInCol3 = find(H(:,jcol3));
for jvertical2 = 1:length(onesInCol3)
irow3 = onesInCol3(jvertical2);
if irow2~=irow3
onesInRow3 = find(H(irow3,:));
for ilevel3 = 1:length(onesInRow3)
jcol4 = onesInRow3(ilevel3);
if jcol4 ==jcol1&&jcol4~=jcol3
cycle6num = cycle6num + 1;
cycle6(cycle6num,:) = [jcol1,jcol2,jcol3];
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
%%
%开始循环,进行误码率仿真
for i=1:length(SNR)
i
Bit_err(i) = 0; %设置误码率参数
Num_err = 0; %蒙特卡洛模拟次数
Numbers = 0; %误码率累加器
%信道参数
Hsd = 1;
Hsr = 1;
Hrd = 1;
while Num_err <= 100
fprintf('Eb/N0 = %f\n', SNR(i));
Num_err
N0 = 10^(-SNR(i)/10);
Trans_data = round(rand(N-M,1)); %产生需要发送的随机数
[ldpc_code,newH] = func_Enc(Trans_data,H1); %LDPC编码
u = [ldpc_code;Trans_data]; %LDPC编码
Trans_BPSK = 2*u-1; %BPSK
%S->D
Rec_sd = awgn(Trans_BPSK,SNR(i),'measured');
%接收端
[vhatsd,nb_itersd,successsd] = func_Dec(Rec_sd,newH,N0,Max_iter);
[nberr,rat] = biterr(vhatsd(M+1:N)',Trans_data);
%LDPC译码
Num_err = Num_err+nberr;
Numbers = Numbers+1;
end
Bit_err(i) = Num_err/(N*Numbers);
end