LDPC译码算法代码概述
|
程序说明 V0.0 2015/1/24 |
LDPC译码算法代码概述 |
|
概述 |
本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum.m, ldpcdecoderbp2.m,ldpcdecoderminsum2.m在内的MATLAB代码的编写思路,基本原理和功能,具体代码可见文后。本文暂不涉及LDPC校验矩阵的构造和编码程序,此部分由他人提供。 |

|
修订历史 |
以下表格展示了本文档的修订过程
|

|
简介 |
本程序基于MATLAB 2014a 编写,本文档中提到的"MATLAB"均指该特定版本MATLAB。本文提到的LDPC编码均指二进制LDPC编码,多进制暂时不进行讨论。 LDPC(低密度奇偶校验)编码,顾名思义有两个特性:纠错编码采用奇偶校验,该种编码方式具有低密度的特点。在学习LDPC编码之前,必须要对线性分组码的基本概念有详细的了解,包括线性分组码的映射思想、生成矩阵、校验矩阵等。这部分内容可参考《通信原理》等书籍。有限域上的编码可不做了解,这一点我现在也不懂。 低密度的意思是对于校验矩阵H而言,1的个数远小于0的个数。这对于译码算法而言是至关重要的,这表现在两个方面。其一是对于一个大的校验矩阵而言,太多的1会导致计算上的困难;其二是译码算法(此处特指置信传播类算法)中的很多假设实际上是不成立的,在H不满足低密度约束下对其性能会有很大影响。 LDPC的置信传播算法包括以下假设:
关于置信传播的具体原理和假设将在《学习笔记:LDPC编译码基本原理》中做具体阐述,此处不再详细说明。(由于《学习笔记:LDPC编译码基本原理》还未开始撰写,该部分内容可能会有较大变动) |

|
程序设计 |
程序结构 校验矩阵和编码程序已经给定程序(脚本)按顺序由以下几个部分构成
校验矩阵已知,且命名为H(800,480).mat,采用load('H(800,480).mat')即可载入,校验矩阵为H。随机序列(数据)生成和编码采用ldpcencoder(H)调用函数,返回数据及其编码。本文仅对AWGN信道和译码程序做说明。
AWGN信道 加性高斯白噪声信道,说明信道的仿真只需要加上一个高斯白噪声就可以了。"白"意味着任意两个不同时刻的噪声都是不相关的,"高斯"即服从高斯分布,满足这两个要求很简单,采用randn生成一组序列即可。唯一不确定的就是噪声的方差了。 对于零均值信号而言,方差代表的就是功率。问题就转变成了如何通过EbN0计算噪声的功率?EbN0是一个比值,每比特能量/噪声功率谱密度。如果我们将信号功率归一化,那么噪声功率就是信噪比SNR的倒数。
在本程序中,校验矩阵为480×800(比特速率为码速率的0.4),采样频率等于码速率(带宽为采样频率的一半),因此有 SNR_dB = EbN0_dB((nEbN0)) + 10*log10(2)+10*log10(0.4);
译码程序编写思想(置信传播为例) 译码算法实际上是很简单的,问题在于呢,如何早到那些要乘的数。就是下式中所表现的
对于这个问题,有两个考虑方式: 1. 传播都是在边上的,那么从边入手。 H矩阵中有多少个非零元素,就有多少条边,记为L。对于每一条边而言,用两个个长度也为L的向量保存边所连接的变量节点和校验节点的编号(r_Mark,c_Mark)。 初始化: 变量节点传递的信息是P(X|Y),那么只需要知道边所对应的变量节点(c_Mark(l))就知道了传递的信息。 迭代: 对于每一次的迭代,从第一条边开始。找出边的r=r_Mark(l),之后找到所有的r_Mark = r的边,计算校验节点的信息。 同理计算变量节点传播的信息 判决 ……
问题在于: 找在MATLAB中采用find就可以了,但是复杂度到底是多少呢?每个循环都要find一下实在是太浪费了……
2. 利用H矩阵的天然结构 也就是说实际上我们要取的集合是H对应的每一行或每一列的数。如果我们采用和H矩阵完全相同的方式去构造信息传递的两个矩阵,那么在寻址的过程中将会容易很多。 想法1对应的程序是ldpcdecoderbp1和ldpcdecoderminsum,想法2对应的程序是ldpcdecoderbp2和ldpcdecoderminsum2。实验证明,程序对应的校验矩阵如本代码所附时,采用方式1运行效率高。 |

|
算法 |
置信传播 以下内容是置信传播算法的编程具体实现方式,按上述思路1编写对应ldpcdecoderbp1 LDPC译码过程可以用Tanner图直观表示,如图 1所示,接收到的序列表示为
图 1 Tanner图
本文不叙述过多原理性问题,仅列出计算步骤,此处假定编码后的星座映射为 1.初始化:(P0,P1 = 1-P0)
2.校验消息处理:(校验节点传递信息rmn0,rmn1 = 1-rmn0) 3.变量消息处理:(k为归一化常数) 4.译码判决:(求0,1后验概率之比值qn0_1,大于1判决为0) 如果满足 最小和算法 以下内容是最小和算法的编程具体实现方式,按上述思路2编写,对应ldpcdecoderminsum2。 对于最小和算法,尤其要注意的是发送端的映射关系。对于置信传播算法而言,如果把关系搞错了,会发现误码率大约是1减正确情况下误码率,这个时候很快就能发现毛病所在;但在最小和中,弄错了的话,误码率会变得怪怪的。 最小和算法本质上和置信传播没有什么区别。正如我们所观察到的,置信传播算法中有两个可以改进的地方:其一是对于概率来说,不是0就是1,没有必要采用两组变量,更好的选项可能是采用比值的形式;其二是算法中采用的乘法取对数之后会变成加法,这样能减少运算量。从这两点出发,提出了对数似然比算法,最小和算法实际上是对数似然比算法的近似。 同置信传播算法的前提假设,但以想法2为例,最小和算法阐述如下。 1.初始化: (按校验矩阵结构对应vl至vnm)
2.校验消息处理:(校验节点传递信息unm) 3.变量消息处理:(变量节点) 4.译码判决:(qn0_1,大于0判决为0) 如果满足 |

|
改进思路 |
改进的意思是这一程序是对的,但是能够做得更好。译码程序的初步验证过程是将EbN0设置为一个较大的值,在这一情况下迭代次数应该是1。很显然这里的四个译码函数都完成了这一个测试,但是否真正无误还有待更进一步的考验。 做得更好的"好"往往是必须有一个标准的,如果我们将程序计算复杂度和空间复杂度降低、且易于FPGA实现作为"好"的标准,那么可以从以下几个方面改进
|

|
参考 |
《LDPC码基础与应用》 贺鹤云 An Introduction to Low-Density Parity Check Codes Daniel J. Costello, Jr. |

|
代码 |
…… |
LDPC译码算法代码概述的更多相关文章
- MATLAB调用C程序、调试和LDPC译码
MATLAB是一个很好用的工具.利用MATLAB脚本进行科学计算也特别方便快捷.但是代码存在较多循环时,MATLAB运行速度极慢.如果不想放弃MATLAB中大量方便使用的库,又希望代码能迅速快捷的运行 ...
- 无锁算法CAS 概述
无锁算法CAS 概述 JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大 ...
- LaTeX 算法代码排版 --latex2e范例总结
LaTeX 写作: 算法代码排版 --latex2e范例总结 latex2e 宏包的使用范例: \usepackage[ruled]{algorithm2e} ...
- KMP算法代码
以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码 ...
- 算法代码[置顶] 机器学习实战之KNN算法详解
改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...
- 经常使用MD5算法代码
经常使用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请參考 维基百科:MD5 MD5加密后 ...
- 带你找到五一最省的旅游路线【dijkstra算法代码实现】
算法推导过程参见[dijkstra算法推导详解] 此文为[dijkstra算法代码实现] https://www.cnblogs.com/Halburt/p/10767389.html package ...
- 『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】
一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎. ...
- 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)
阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...
随机推荐
- DP入门——01背包 & 完全背包
01背包: 采药: https://www.luogu.org/problemnew/show/P1048 #include <iostream> #include <algorit ...
- Asp.Net Core + Ocelot 网关搭建:负载均衡的配置
前言 上一篇中简单做了一个网关Demo.本篇中也记录一下负载均衡的配置实现. 演示 首先开三个服务,端口分别为 60001,60003,60005,然后分别启动三个服务.接下来在ApiGate ...
- [转]使用QT开发GoogleMap瓦片显示和下载工具
第一节 之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背 ...
- python -- peewee处理数据库连接
目前,实现了的Database子类有三个:SqliteDatabase.MySQLDatabase.PostgresqlDatabase class SqliteDatabase(Database) ...
- Reading Meticulous Measurement of Control Packets in SDN
SOSR 17 概要 网络流量中有一部分是用于网络管理,(根据packet process survey,该部分流量属于包转发的slow path部分)由于sdn的数控分离,交换机需要向控制器发送大量 ...
- ubuntu snmp Error: unknown payload OID
ubuntu snmp Error: unknown payload OID 2013-11-12 15:51:48 标签:ubuntu Error snmp unknown payload OID ...
- [java之设计模式]策略模式
策略模式(strategy pattern) 定义>> 将一系列的算法封装到一些列的类里面,并且可以相互替换 作用>> 将算法的变化独立于客户端,将算法的指责和算法的行为分开, ...
- IT经理苏大强:我不吃,我不喝,我要赶项目!
IT经理老苏的日常 1周,2周,3周 -- 为了公司的发展和孩子的奥利奥 这点短痛不算什么 Iron Cloud 微服务开发云[www.ironz.com] 高效满足业务需求 高速交付 驱动增长
- Oracle特有函数 case when decode exists 分页rownum
select * from EMP eselect * from dept dselect * from salgrade s--Oracle特有函数 case whenselect case 2 w ...
- CoreAnimation|动画
IOS开发UI篇--IOS动画(Core Animation)总结 - CSDN博客 iOS动画,绝对够分量! - 简书 iOS动画篇:UIView动画 - 简书 iOS动画开发之五--炫酷的粒子效果 ...

集合中的数据
,校验节点为
,我们要求的是
的条件后验概率。
。




或达到最大迭代次数,返回译码后结果,退出循环;否者回到步骤2。



或达到最大迭代次数,返回译码后结果,退出循环;否者回到步骤2。