【编码译码】基于matlab实现LDPC编码和解码

简介: 【编码译码】基于matlab实现LDPC编码和解码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

1. LDPC码背景及概要

LDPC是Low Density Parity Check Code英文缩写,意为低密度奇偶校验码,最早在20世纪60年代由Gallager在他的博士论文中提出,但限于当时的技术条件,缺乏可行的译码算法,此后的35年间基本上被人们忽略。直到1993年Berrou等人发现了Turbo码,在此基础上,1995年前后MacKay和Neal等人对LDPC码重新进行了研究,提出了可行的译码算法,从而进一步发现了LDPC码所具有的良好性能,迅速引起强烈反响和极大关注。经过十几年来的研究和发展,研究人员在各方面都取得了突破性的进展,LDPC码的相关技术也日趋成熟,逐渐有了商业化的应用成果,如今LDPC码已经作为众多新一代通信标准中的信道编码方案:DVB-S2 (Digital Video Broadcasting)、IEEE 802.3an (Ethernet)、IEEE 802.16e (WiMax)、IEEE 802.11n (WiFi)、3GPP 5G标准。

LDPC码是一种稀疏校验矩阵线性分组码,在LDPC编码中,会用到一个叫做H矩阵的校验矩阵(Parity Check Matrix),该校验矩阵为稀疏矩阵。

LDPC编码分为正则编码和非正则编码。正则编码中,校验矩阵的每行和每列中1的个数是固定的。非正则编码中,校验矩阵的每行和每列中1的个数不固定。

LDPC解码过程中,主要包括了两方面内容:硬解码(Hard Decode)和软解码(Soft Decode). LDPC解码的方法就是收到码字之后,与校验矩阵H相乘,如果是0矩阵,则说明收到的是正确码字。反之,则不正确码字,再根据相乘结果进行进一步纠错解码

2. 仿真要求及内容

本次仿真要求通过MATLAB软件对LDPC码进行编译码仿真,通过计算模拟求解归一化最小和算法α参数的最佳值和偏置最小和算法β参数的最佳值,并仿真出四种不同的译码算法下的误码率和误帧率曲线。实验的要求如下:

  1. 采用系统码设计,信息序列长1008比特,码长2016比特,码率1/2,即
  2. 给定的编码矩阵 H_block 是一个18x36的矩阵(Matrix(2016,1008)Block56.mat文件中也是只有18x36个数据),矩阵中每个元素 H(i,j) 是大小为 z*z 的循环移位矩阵(给定z=56),行重为1,它的值表示该矩阵的循环位移偏移量,也是第一行中元素1所处的列的位置,若H(i,j)值为0,表示是全0矩阵。
  3. 给定 $H_block{18×36}$ 矩阵,根据给定规则求解校验矩阵 $H{1008, 2016}$ 。
  4. 根据校验矩阵直接进行编码:利用输入信息比特序列$s$和校验矩阵$H$求得校验比特序列 $p$ , $x = \lbrack p\ s\rbrack$ 即为编码序列。
  5. 编码序列采用BPSK调制并通过AWGN信道添加噪声。
  6. 完成以下四种译码算法的MATLAB代码实现
  1. 和积算法(Sum-Product, SP)
  2. 最小和算法(Min-Sum, MS)
  3. 归一化最小和算法(Normalized Min-Sum, NMS)
  4. 偏置最小和算法(Offset Min-Sum, OMS)
  1. 对于归一化最小和算法和偏置最小和算法,选定一个Eb/N0(1dB附近),仿真BER得出α和β最佳值。α和β取值范围均为0到1,步进为0.1,α和β的BER曲线各画一张图。
  2. 仿真得出Eb/N0在-1dB到2dB(步进0.5dB)时四种译码算法的BER和FER,两个修正最小和算法的α和β都取最佳值。应画BER一张图,FER一张图,每一张图都包含四种算法。

2.1. LDPC编码算法

LDPC码通常由校验矩阵H进行定义。尽管线性分组码可以使用传统的生成矩阵进行编码,但是要通过H求解G在实现上较为困难,因此根据校验矩阵直接进行编码。本次作业采用系统码,且校验矩阵H可分为两部分$$H=\left[ H_p|H_s \right] $$,其中$$H_p$$对应校验比特部分,对$$H_s$$应信息比特部分;编码序列x可分为$$x=\left[ p\ s \right] $$,其中$p$为校验比特序列,$s$为信息比特序列。本作业的编码部分有两种编码算法用以实现LDPC编码。

2.1.1. LDPC编码算法1

由于校验矩阵H的性质:

因此可采用基于H矩阵的通用LDPC编码方法:

由上式可知,本算法需要$H{p}$可逆,且上式p为1x(N-K)向量、s为1xK向量、$H{s}^{T}$为Kx(N-K)矩阵、$H_{p}^{T}$为Kx(N-K)矩阵,因此该算法需要$K(N - K) + (N - K)(N - K)$次比特乘法运算和$(K - 1)(N - K) + (N - K - 1)(N - K)$次比特加法运算。

2.1.2. LDPC编码算法2

将基于H矩阵的通用LDPC编码方法进行分解,具体步骤如下:

1)  首先利用信息序列s计算中间结果

2)  利用编码序列x计算校验比特

故可得:

此算法易错处为:上式中运算过程是应由右侧值决定左侧值,即只有当右侧表达式中各变量的值被赋过一次值时才能对左侧值赋值。例如:

  • 当i=1时,w1已知,p1=w1
  • 当i=2时,w2已知,但p(mb-1)*z并没有值,因此此时还不能立刻求p2,而是应该求p(z+1)=w(z+1) 模二求和 p(1)。即:-当i=(z+1)时,w(z+1)已知,p(1)已知,p(z+1)=w(z+1) 模二求和 p(1)
  • ...

3)  组合p与s

将校验比特序列p和信息比特序列s组合即得到编码序列x。

4)  检验由于编码过程利用的是

因此,得到编码序列x后需要对x进行检验,保证其满足上式即表明完成了正确编码工作。

2.1.3. 两种算法比较

两种算法在时间复杂度上的区别如图所示($\left( H_{p}^{T} \right)^{- 1}$可以离线求解,所以不占用复杂度), 两种编码算法的时间复杂度对比

算法1适用于$H_{p}^{T}$可逆的通用H矩阵,而算法2适用于本次仿真作业特定的H矩阵。由时间复杂度的比较,本次仿真作业采用时间复杂度低的算法2。

2.2. 调制过信道

本次仿真作业采用实数BPSK调制并AWGN信道下进行误码率和误帧率的性能仿真。

2.2.1. BPSK

实数BPSK调制即将比特0映射为符号1,比特1映射为符号-1,变换式为:

其中d为BPSK调制后的符号(序列),x为编码比特(序列)。

在实数BPSK中,信噪比SNR和Eb/N0的转换关系为:

2.2.2. AWGN

BPSK调制后的信号通过AWGN信道将会对信号添加噪声,matlab中给信号添加AWGN噪声方式为:

其中,d为BPSK调制后的符号(序列),n为噪声信号(序列),y为通过AWGN信道后的信号值(序列)。噪声n在matlab中表示为:

其中$\sigma^{2}$为噪声功率,计算方法为:

2.2.3. 初始置信度

信息序列经过编码、BPSK调制,在AWGN信道下接收信号y的对数似然比(LLR,或初始置信度)为:

其中,

2.3. LDPC解码算法

本次仿真实验要求采用四种译码算法,分别为:

  1. 和积算法(Sum-Product, SP)
  2. 最小和算法(Min-Sum, MS)
  3. 归一化最小和算法(Normalized Min-Sum, NMS)
  4. 偏置最小和算法(Offset Min-Sum, OMS)

⛄ 部分代码

clear all

close all

clc


%% 预定义变量

N = 2016;

K = 1008;

R = K/N;


%% 添加工作路径

addpath('Encoder')

addpath('Decoder')


%% H矩阵生成

[ H, Hp, Hs ] = HxMatrixGen();


%% 仿真

Eb_N0_dB = 1.5;

alpha = 0:0.1:1;


BER = zeros(1, length(alpha));

for alpha_i = 1:1:length(alpha)

   disp(['alpha = ' num2str(alpha(alpha_i)) ' is simulating...']);

   

   % 设定停止条件

   if Eb_N0_dB <= 1

       maxErrorBlocks = 50;

   else

       maxErrorBlocks = 3;

   end

   

   % 设定译码算法最大迭代次数

   iterMax = 30;

   

   %设定每个信噪比下最大仿真帧个数

   maxBlocks = 10^6;

   

   % 四种算法的总误码数ErrorBits 和 总误帧数ErrorBlocks 和 所有帧的总循环数blocks 在每个Eb/N0仿真前清零

   ErrorBits_NMS = 0;

   ErrorBlocks_NMS = 0;

   blocks_NMS = 0;

   

   for i = 1:1:maxBlocks

       % 算法2编码(s --> x)

       s = randi([0, 1], 1, 1008);

       x = Encoder2(Hs, Hp, s);

       if sum(mod(H*(x'), 2)) > 0

           sprintf('> the '+ num2str(i) + ' th encoding is not right');

       end


       % BPSK调制

       d = 1 - 2.*x;


       % AWGN

       SNR_dB = Eb_N0_dB + 10*log10(R) - 10*log10(1/2);

       SNR_linear = 10^(SNR_dB/10);

       sigma = sqrt(1/SNR_linear);

       y = d + sigma*randn(size(d)); % 加噪声


       % 译码端接收

       LLR_y = 2*y/(sigma^2);

       

       % NMS译码

       v_NMS = LDPCDecoder_NMS( H, LLR_y, alpha(alpha_i), iterMax );

       %误比特数、误帧数统计

       errorbits_NMS = sum(s ~= v_NMS);

       ErrorBits_NMS = ErrorBits_NMS + errorbits_NMS;

       blocks_NMS = blocks_NMS + 1;

       

       if errorbits_NMS ~= 0

           ErrorBlocks_NMS = ErrorBlocks_NMS + 1;

       end

       if ErrorBlocks_NMS > maxErrorBlocks

           break;

       end

   end

   BER(1, alpha_i) = ErrorBits_NMS/(K * blocks_NMS);

end


% 绘制BER

xlswrite('./BERforFindBestAlpha.xlsx', BER);

semilogy(alpha, BER, 'K-^', 'LineWidth', 1.0, 'MarkerSize', 5); % 三角marker 黑线

xlabel('\alpha'); ylabel('BER')

⛄ 运行结果

⛄ 参考文献

[1] 魏瑶. 准循环LDPC码的编译码技术研究与MATLAB仿真[D]. 河北大学, 2014.

[2] 陈洪雨. 跳频通信系统中LDPC编译码算法及FPGA的实现[D]. 哈尔滨工程大学, 2016.

[3] 张小华, 彭首峰. 基于Matlab的LDPC码研究及实现[J]. 科技传播, 2012(15):2.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料



相关文章
|
2月前
|
编解码 算法 数据安全/隐私保护
基于BP译码的LDPC误码率matlab仿真,分析码长,码率,信道对译码性能的影响,对比卷积码,turbo码以及BCH码
本程序系统基于BP译码的LDPC误码率MATLAB仿真,分析不同码长、码率、信道对译码性能的影响,并与卷积码、Turbo码及BCH编译码进行对比。升级版增加了更多码长、码率和信道的测试,展示了LDPC码的优越性能。LDPC码由Gallager在1963年提出,具有低复杂度、可并行译码等优点,近年来成为信道编码研究的热点。程序在MATLAB 2022a上运行,仿真结果无水印。
59 0
|
4月前
|
算法 5G vr&ar
基于1bitDAC的MU-MIMO的非线性预编码算法matlab性能仿真
在现代无线通信中,1-bit DAC的非线性预编码技术应用于MU-MIMO系统,旨在降低成本与能耗。本文采用MATLAB 2022a版本,深入探讨此技术,并通过算法运行效果图展示性能。核心代码支持中文注释与操作指导。理论部分包括信号量化、符号最大化准则,并对比ZF、WF、MRT及ADMM等算法,揭示了在1-bit量化条件下如何优化预编码以提升系统性能。
|
5月前
|
机器学习/深度学习 算法 计算机视觉
通过MATLAB分别对比二进制编码遗传优化算法和实数编码遗传优化算法
摘要: 使用MATLAB2022a对比了二进制编码与实数编码的遗传优化算法,关注最优适应度、平均适应度及运算效率。二进制编码适用于离散问题,解表示为二进制串;实数编码适用于连续问题,直接搜索连续空间。两种编码在初始化、适应度评估、选择、交叉和变异步骤类似,但实数编码可能需更复杂策略避免局部最优。选择编码方式取决于问题特性。
|
7月前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
96 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
6月前
|
缓存 算法
基于机会网络编码(COPE)的卫星网络路由算法matlab仿真
**摘要:** 该程序实现了一个基于机会网络编码(COPE)的卫星网络路由算法,旨在提升无线网络的传输效率和吞吐量。在MATLAB2022a中测试,结果显示了不同数据流个数下的网络吞吐量。算法通过Dijkstra函数寻找路径,计算编码机会(Nab和Nx),并根据编码机会减少传输次数。当有编码机会时,中间节点执行编码和解码操作,优化传输路径。结果以图表形式展示,显示数据流与吞吐量的关系,并保存为`R0.mat`。COPE算法预测和利用编码机会,适应卫星网络的动态特性,提高数据传输的可靠性和效率。
|
6月前
|
算法
m基于PSO粒子群优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真
MATLAB2022a仿真实现了基于遗传优化的NMS LDPC译码算法,优化归一化参数以提升纠错性能。NMS算法通过迭代处理低密度校验码,而PSO算法用于寻找最佳归一化因子。程序包含粒子群优化的迭代过程,根据误码率评估性能并更新解码参数。最终,展示了迭代次数与优化过程的关系,并绘制了SNR与误码率曲线。
54 2
|
6月前
|
算法
m基于PSO粒子群优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了Offset Min-Sum (OMS)译码算法与粒子群优化(PSO)结合,以优化偏移参数,提升LDPC码解码性能。PSO通过迭代寻找最小化误码率(BER)的最佳偏移量。核心程序运用PSO进行参数更新和适应度函数(BER)评估,最终在不同信噪比下展示OMS解码性能,并保存结果。
75 0
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
205 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
131 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
4月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
95 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

热门文章

最新文章