目录

​一、理论基础​

​二、案例背景 ​

​三、MATLAB程序​

​四、仿真结论分析​


一、理论基础

参考资料:

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

程序流程:

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

RA-LDPC

参考资料:

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

程序流程:

 

RA-LDPC编译码和QC-LDPC编译码的误码率matlab仿真_开发语言_04

二、案例背景 

       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


四、仿真结论分析

两者的误码率对比如下:

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

A14-07