基于LDPC+64QAM的通信链路误码率matlab仿真
Posted fpga和matlab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于LDPC+64QAM的通信链路误码率matlab仿真相关的知识,希望对你有一定的参考价值。
up目录
一、理论基础
信道编码是数字通信系统的重要组成部分。LDPC信道编码技术是编码界的重要成果之一。1/2码率的二元LDPC码在AWGN信道下的性能距信息理论中的Shannon极限仅差0.0045dB,它是目前距Shannon极限最近的纠错码。Gallagar在1962年提出LDPC码,1996年经过Mackey、Spielman和Wiberg等人的再发现后,LDPC码以其性能优越、全并行迭代译码结构、便于硬件实现等优点,在无线通信、存储工业等领域得到了广泛应用。
LDPC 码作为纠错能力最强的信道编码,在深空通信中具有广泛的应用前景。研究了LDPC 码的BP 译码算法,并对该算法进行了仿真,分析了LDPC 码的误码率随BP 译码迭代次数的演化情况,提出了一种改进的B P 译码算法。经过仿真验证,改进的BP 译码算法,在信噪比低于译码阈值时能够大幅地减少译码迭代次数,降低运算复杂度,而性能却几乎没有降低。
校验矩阵的构造是编码的前提,采用了随机构造法构造,并对矩阵的多种变换方法进行分析,比较了优缺点。译码算法是LDPC码的关键,译码复杂度的大小直接影响系统的实现。主要分硬判决译码、软判决和复合译码。
一个LDPC码v vv 是一种(n nn,k kk)线性分组码,码长为n nn,信息序列长度为k kk,可由其校验矩阵H所唯一确定,校验矩阵中1的数目远小于0的数目,具有稀疏性。H的维数是m × n m\\times nm×n,每一行对应一个校验方程(也称校验节点),每一列对应码字的一位(也称变量节点)。每一行中非零元素的个数称为行重,每一列中非零元素的个数称为列重。
DPC码的译码方法可以分为两大类:基于硬判决的译码和基于软判决的译码。基于硬判决的译码运算量小比较实用;而软判决译码采用了后验概率信息,并通过迭代运算,使得LDPC码的性能得以逼近香农限。本博文主要关注基于软判决的译码及其改进算法。
概率域上的BP算法包含了大量的连乘运算,硬件实现时具有较高的计算复杂度,资源消耗大。将概率信息用似然比表示,就得到对数域上的BP算法,大量的乘法运算可以转化为加法运算。
(1)信道初始消息:
(2)校验节点传递给变量节点的外信息:
(3)变量节点传递给校验节点的外信息:
(4)译码判决,经过迭代后变量节点的后验概率相应的修改为:
故后验概率大于0,将vi判决为0,反之判决为1。(对数值大于0,说明真数大于1,及分子对应的vi为0的概率大于分母对应vi为1的概率,故将vi判决为0)
二、核心程序
%******************************************************
for EbN0=start:step:finish;
Liner_EbN0=10^(EbN0/10);
pe_number=0;
variance=0.5*(Eb/Liner_EbN0)/r; % 噪声方差, 来源于a^2/(2*delta^2)=Liner_EbN0,a^2信息幅值的平方即比特能量, 2*delta^2=N0. N0/r得到编码后的噪声功率谱密度
for number_frame=1:1:n_frame % variance是单独加在同相(正交相)的噪声功率普密度
[EbN0,number_frame]
x_msg = (sign(randn(1,size(G,1)))+1)/2; % random bits
x_code_msg= mod(x_msg*G,2); % coding
in=x_code_msg;
x_tx_msg= QAM64m(in); % 16QAM modulation
real_tx=real(x_tx_msg); imag_tx=imag(x_tx_msg);
waveform= x_tx_msg+sqrt(variance)*( randn(size(real_tx)) + randn(size(imag_tx))*i ) ; % AWGN transmission
[f0,f1]=QAM64d(waveform,2*variance);
LLR=log(f0./(f1+eps));
[z_hat, success, k] = log_ldpc_decode(H,LLR,max_iter);; % likelihoods
x_dec_msg = z_hat(1:size(G,1)); % 码率1/2 时使用
pe_number=pe_number+sum(x_msg~=x_dec_msg);
current_time=fix(clock);
fprintf('i am working %g,total(%g) %g年 %g月 %g日 %g时 %g分 %g秒\\n\\n',Q,(((finish-start)/step)+1)*n_frame,current_time(1),current_time(2),current_time(3),current_time(4),current_time(5),current_time(6))
Q=Q+1;
fprintf('\\n\\n')
end
pe=pe_number/(L_frame*n_frame);
plot_pe=[plot_pe,pe];
end
up29
三、测试结果
matlab2021a测试结果如下
以上是关于基于LDPC+64QAM的通信链路误码率matlab仿真的主要内容,如果未能解决你的问题,请参考以下文章