基于matlab的QC-LDPC编译码误码率仿真,译码为最小和译码算法

时间:2023-03-14 21:56:36

1.算法描述 LDPC译码分为硬判决译码和软判决译码。

    硬判决译码又称代数译码,主要代表是比特翻转(BF)译码算法,它的实现比较简单,但是译码性能很差。硬判决译码的基本假设是当校验方程不成立时,说明此时必定有比特位发生了错误,而所有可能发生错误的比特中不满足检验方程个数最多的比特发生错误的概率最大。在每次迭代时翻转发生错误概率最大的比特并用更新之后的码字重新进行译码。

    软判决译码是一种基于概率论的译码算法,通常需要与迭代译码进行结合,才能体现成译码性能的优势,基本算法是置信传播(BP)译码算法,它的实现比代数译码方法的复杂度高很多,但译码性能非常好。

    为了解决BP译码算法实现困难问题,在学术界牵起了优化算法的浪潮,对数域置信传播译码(LLR BP)算法、最小和(Min-Sum)译码算法、Normalized Min-Sum译码算法、Offset Min-Sum译码算法等相继涌现。

    在迭代译码的过程中,信息调度方式分为两种:泛滥式调度和分层式调度。泛滥式调度的特点在于每一次译码迭代过程中,首先计算从变量节点到校验节点的所有软信息,然后计算从校验节点到变量节点的所有软信息。分层调度的特点是在计算每层软信息时,更新此次迭代中的相关的节点信息,用于下一层的软信息计算。

    最小和译码(MS,Min-Sum)算法是以LLR BP算法译码为基础,对校验节点信息更新的表达式进行的简化,其余步骤均与LLR BP译码算法一致。
    比较LLR BP译码算法和Min-Sum译码算法的校验节点信息更新过程,可以看到他们的主要区别在于LLR BP译码算法中的tanh(.)运算和加法运算在Min-Sum译码算法中被最小值和运算符号进行替换,MS译码简化了LLR BP译码算法,降低了译码算法的复杂度。

2.仿真效果预览 matlab2022a仿真结果如下:

基于matlab的QC-LDPC编译码误码率仿真,译码为最小和译码算法

3.MATLAB核心程序

EbNo=10.^(0.1*SNR);%将信噪比dB转换为普通形式           
maxcycle=10;                        %-------- 设定试验次数--------
maxblockerr=10;                         %-------- 最大错误帧数--------
decInter=25;                           %-------- 设置译码迭代次数----------
parameter=1;                         %----归一化参数,值为1表最小和算法;值为其他值,是对最小和算法的改进,归一化最小和,参数一般为常数0.75---
sigma=1./(sqrt(2*rate*EbNo));
errornum=zeros(1,sNum);
numoferrorFrame=zeros(1,sNum);
numofFrame=zeros(1,sNum);
MS_BER=zeros(1,sNum);
MS_FER=zeros(1,sNum);
 
 
 
tic
for i=1:sNum
    cyc=0; 
    blockerr=0;
    while (blockerr<maxblockerr)
        cyc=cyc+1; 
        mBit=rand(1,5402)>0.5;
        codeword=mod(mBit*G,2);
        waveform=bpsk(codeword,1);     % 1~~~~~-1;进行BPSK调制
                                       % 0~~~~~1;
        
     %--------------接收到的加噪后的码字------------
        re_waveform=waveform+sigma(i)*randn(1,6075);  
        
 
        
     %--------------最小和译码--------------------
        de_code=MinSumDecoder(re_waveform, H, decInter, parameter);
 
 
        errors=find(de_code~=codeword);
        eacherrornum=length(errors);
        if eacherrornum~=0
            blockerr= blockerr+1;
        end
        blockerr
        errornum(i)=errornum(i)+eacherrornum;
    end
    numoferrorFrame(i)=blockerr;
    numofFrame(i)=cyc;
    MS_BER(i)=errornum(i)/(6075*cyc)
    MS_FER(i)=numoferrorFrame(i)/cyc
 
end