RA-LDPC编译码和QC-LDPC编译码的误码率matlab仿真

目录

一、理论基础

二、案例背景 

三、MATLAB程序

四、仿真结论分析


一、理论基础

      QC-LDPC是一种准循环低密度奇偶校验码(LDPC),其校验矩阵是一个循环矩阵,因此得名。它采用循环结构来实现高效编码和解码。它具有较低的错误率和误码率,并且接近香农限。

具体来说,QC-LDPC编译码的过程如下:

生成校验矩阵

       首先,根据给定的码率和二元独立同分布随机输入序列的长度,生成一个稀疏的校验矩阵。该矩阵的行数和列数取决于码率和序列长度。为了使校验矩阵成为循环矩阵,需要在每行中添加一个随机的列向量。

编码

       将输入信息序列与零序列进行异或运算,得到一个校验序列。将该校验序列插入到校验矩阵的每一列中,得到一个完整的校验矩阵。然后,使用高斯消元法对校验矩阵进行初等变换,得到一个单位矩阵。最后,通过异或运算得到编码序列。

解码

       使用多级迭代解码算法进行解码。首先将二元输入序列转换为十进制整数,并将其映射到校验矩阵中的行。然后,使用迭代解码算法来计算每个位是0还是1。具体来说,每个迭代步骤包含以下两个步骤:

  • 硬判决:根据校验矩阵和已经解码的位,计算出每个未解码位的硬判决值。该步骤可以通过高斯消元法来实现。
  • 更新:根据硬判决值更新每个未解码位的概率,然后进行下一步迭代。具体来说,每个未解码位的概率由其对应列中所有已解码位的值决定。如果该位的硬判决值为0或1,则将其概率设置为1减去该硬判决值的概率。

重复以上步骤直到达到最大迭代次数或误差率低于阈值。

参考资料:

程序流程:

        RA-LDPC(稀疏有损译码器)和QC-LDPC(准循环低密度奇偶校验码)都是低密度奇偶校验码(LDPC)的变种,具有非常高效的编码和解码能力,特别适合于长距离通信和大数据存储。下面详细介绍它们的原理和公式。RA-LDPC是一种二元LDPC码,其校验矩阵是一个稀疏矩阵,因此得名。它由多级迭代解码算法进行解码,该算法将二元输入序列转换为十进制整数,并将其映射到校验矩阵中的行。然后,使用迭代解码算法来计算每个位是0还是1。

具体来说,RA-LDPC编译码的过程如下:

生成校验矩阵

       首先,根据给定的码率和二元独立同分布随机输入序列的长度,生成一个稀疏的校验矩阵。该矩阵的行数和列数取决于码率和序列长度。

编码

       将输入信息序列与零序列进行异或运算,得到一个校验序列。将该校验序列插入到校验矩阵的每一列中,得到一个完整的校验矩阵。

解码

       使用多级迭代解码算法进行解码。首先将二元输入序列转换为十进制整数,并将其映射到校验矩阵中的行。然后,使用迭代解码算法来计算每个位是0还是1。具体来说,每个迭代步骤包含以下两个步骤:

  • 硬判决:根据校验矩阵和已经解码的位,计算出每个未解码位的硬判决值。
  • 更新:根据硬判决值更新每个未解码位的概率,然后进行下一步迭代。

重复以上步骤直到达到最大迭代次数或误差率低于阈值。

参考资料:

程序流程:

 

二、案例背景 

       QC-LDPC(Quasi-Cyslic Low-Density Parity-Check Codes)即准循环LDPC码。之前介绍的LDPC码基本属于随机构造法,构造出的码性能很好,但校验矩阵具有不规律性,存在校验矩阵存储于读取困难、编码复杂度高等问题,相对难以实现。准循环LDPC码是结构化LDPC码的重要子集,其奇偶校验矩阵可以分成多个大小相等的方阵,每个方阵都是单位矩阵的循环移位矩阵或全0矩阵,非常便于存储器的存储和寻址,从而大大降低了LDPC码的编译码复杂度,并且具有重复累计结构的准循环LDPC码能够实现线性复杂度的快速编码。因此,目前实际中所使用的LDPC码大都使用这种校验矩阵构造方式。

      QC-LDPC码的主要构造方法包括有限几何法,均衡不完全区组设计法和三 维立方体网格图法:其中,三维立方体网格图法作为一种特殊的均衡不完全区 组设计方法,可以使构造出的码字达到girth值为10。QC.LDPC码的girth值和 环分布是影响码字性能的重要因素。QC.LDPC码的生成矩阵也具有准循环形 式,这决定了它可以利用移位寄存器进行编码。双对角线结构的QC.LDPC码 可以由校验矩阵直接生成码字,因此能实现简单快速编码。

        为了在分布式视频编码(DVC)中取得更好的压缩性能,将校验节点的合并和分裂进行有机结合,提出了一种码率自适应LDPC(RALDPC)编码新方法.该方法首先基于PEG算法构造高压缩比LDPC码字;然后由行均匀分裂得到低压缩比码字;最后通过合并或分裂校验矩阵对应的行来适度调整码率.为保证码字性能,还提出了校验节点合并的3个限制条件,并基于RALDPC提出了一种码率自适应DVC编码方案.

        通过对LDPC码和RA码构造的深入研究,发现基于BP译码的系统RA 码编码器中的交织器对译码性能影响巨大,只要交织器参数满足一定关系就能保 证其校验矩阵无小环,从而达到很好的译码性能。在很大的码长和码率范围内基于BP 译码的RA码的译码性能非常好。这些确定结构的交织器在短码情况下,能比随 机交织器提供更好的性能;而在长码的情况下,也没有损失性能。这些新交织器, 不仅优于现今的简单交织器,并且比随机结构交织器具有更确定的结构,因此, 对RA码来说是一种更好的选择。 特别地,基于线性同余和素数思想的新交织器具有更好的实用性。

三、MATLAB程序

RA-LDPC:

clc;
clear;
close all;
warning off;

frame_num  = 20;
min_errors = 10;
NoisedB    = [0  0.5  1  1.5  2];
BER1       = zeros(size(NoisedB));
ind        = 0; 

for k = 1:length(NoisedB)
    N0      = 1/10^(4*NoisedB(k)/10);
    errors  = 0;
    frames  = 0;
    ind     = 0; 
    while errors < min_errors || frames < frame_num
        ind = ind + 1;
        errors
        ind
        %产生随机数
        x               = round(rand(1,100));
        %编码
        [y,g]           = func_RA_LDPC_Enc(x);
        %BPSK
        z               = 2*y-1;
        %AWGN噪声
        rx              = z + sqrt(N0)*(randn(1,length(z))+i*randn(1,length(z)));
        llr             = (abs(rx-1).^2-abs(rx+1).^2);
        %译码
        [decoded_llrs]  = func_RA_LDPC_Dec(llr,g,999);
        %计算误码率
        errors          = errors + sum(x ~= (decoded_llrs < 0));
        frames          = frames+1;
    end
    BER1(k) = errors/(frames*100)
end    


figure;
semilogy(NoisedB,BER1,'r-*');
grid on
xlabel('SNR(db)');
ylabel('BER');
legend('RA-LDPC');
save RA.mat NoisedB BER1   

QC-LDPC:

clc;
clear;
close all;
warning off;


%%
%参数的初始化
q     = 127;
M     = 5*q; %矩阵行数
N     = 10*q;%矩阵列数
a     = 2;
b     = 7;


%QC构造稀疏矩阵
H         = func_QC_H(a,b,q,M,N);
%将系数矩阵转换为生成矩阵
[G,valid] = func_H2G(H);
[N1,N2]   = size(G);
%仿真信噪比
NoisedB   = [0  0.5  1  1.5  2];

frame_num = 20;
All_frame = N2*frame_num;

for i = 1 : length(NoisedB)
    
    Num_err = 0;
    SNR     = 10^(NoisedB(i)/10);
    sigma   = 1/sqrt(SNR);
    
    for k = 1:frame_num
        i
        k
        %产生随机数据作为测试数据
        x = (sign(randn(1,size(G,1)))+1)/2;
        %LDPC编码
        y = mod(x*G,2);
        %BPSK映射
        z = 2*y-1;
        %加入噪声
        z = z + sigma*randn(1,N);
        %LDPC译码
        z_hat = func_Ldpc_dec(z,sigma,H);
        x_hat = z_hat(M+1:N);
        x_hat1= x_hat';
        %误码率统计
        Num_err = Num_err + sum(xor(x,x_hat1));
    end
    
    BER1(i) = Num_err/All_frame;
    
    if BER1(i) < 0.01/All_frame
       BER1(i) = 0.06/All_frame;
    end
end

figure;
semilogy(NoisedB,BER1,'r-*');
grid on
xlabel('SNR(db)');
ylabel('BER');
legend('QC-LDPC');
        
save QC.mat NoisedB BER1      
        
        
  

四、仿真结论分析

两者的误码率对比如下:

A14-07 

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值