LDPC编译码基本原理

 

 

学习笔记

V1.1 2015/02/18

LDPC编译码基本原理

 

概述

 

本文是个人针对LDPC的学习笔记,主要针对LDPC译码算法做了简要的总结。该版本主要致力于阐述LDPC码译码原理,这是一份有很多"问题"的总结,希望能够慢慢完善。本文分为以下几个部分


修订历史

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

日期

版本号

修订内容

2015/02/04

V1.0

初始版本

2015/02/18 

V1.1

添加因子图部分,修正部分错误

简介

 

本文提到的LDPC编码均指二进制LDPC编码,多进制暂时不进行讨论。为方便起见本文中混用了似然函数和条件概率密度这两个概念,虽然这样做是不恰当的。

 

 

LDPC码是一种校验矩阵具有低密度的线性分组码。也就是说,LDPC码和普通的线性分组码没有什么不同,但冠以"低密度"三字,说明以下两点问题

  • 既然限定了校验矩阵1的个数较少,说明这肯定在某些方面带来好处。当然,"某些方面"具体是什么,值得我们继续探讨。已知的好处包括计算上的便利,存储量的减少。以及实际上多个相近的接收信号之间实际上有相关性,稀疏性可以减少其影响。
  • 校验矩阵其实是校验方程的集合,对其做初等行变换是不会改变码本身的特性的。"低密度"三字还表现出我们对其校验矩阵的表示往往比码本身感兴趣。(一类码可以有低密度的校验矩阵,也有不满足低密度约束的校验矩阵)。

校验矩阵是一个相对通用的表示工具,线性分组码都可以由校验矩阵确定。通用性往往意味着很多时候难以表现一些特性,譬如,低密度。一个好的表示方式往往是解决问题的关键。图论中有一个图的矩阵表示,校验矩阵是稀疏的,一个好的表示就是指出其中1的位置,我们在意的也就是这些位置。如果将稀疏矩阵采用图来描述,这一个目的就达到了,这一类图被称为Tanner图,如图 1。

Tanner图和校验矩阵具有以下对应关系。Tanner图有变量节点和个校验节点,对应校验矩阵的列数和行数。如果第个变量节点和第个校验节点之间有边相连,那么,否则。显然,变量节点内部是没有边相连的,校验节点也是如此。

图 1 校验矩阵和Tanner图

 

此时我们可以先明确一些关于校验矩阵和Tanner图的定义

  • 校验矩阵的行重:每行1的个数,列重是每列1的个数
  • 正规LDPC码:校验矩阵行重、列重都是定值
  • 二分图:图的节点可以分为两类,类中的节点之间没有直接连接。Tanner图是一个二分图,分为校验节点和变量节点
  • 度:某一节点引出的边的数目
  • 环和girth:从一个节点按边不重复回到同一节点的路径称为环,环上边的数量称为环的girth

 

现在,我们应该好好考虑编译码的问题了。编码过程中,知道校验矩阵后生成矩阵是可以求出来的。求出生成矩阵后,至少可以说明编码是可进行的。利用其它的一些性质,这个过程可以变得更容易。(此部分内容还没有仔细看)

关于译码规则,香农在证明第二定理的时候采用了最大似然译码准则。当然,译码准则的选取还取决于信道。譬如,二进制对称信道下汉明距离译码和最大似然是一致的。然而,实际信道往往被看作是加性高斯白噪声信道,这个时候我们更多的需要考虑采用最大似然译码准则了。同时,毋庸置疑的是我们应该采用软判决译码以达到好的效果。此时,似然函数可以表示为 ,其中是接收序列,是编码后序列,在码本空间内,即满足校验方程。显然,似然函数的计算是难以进行的。但早期Gallager作了很多工作。

概率译码

 

1962年Gallager提出了LDPC码的基本概率译码算法,本节将阐述这一思想。

  1. 从联合条件概率分布到边缘条件概率分布

解决一个大的问题的基本思路在于将其分解为一系列的小问题。对于似然函数而言,如果求的概率密度可以达到同样的效果,即求那么求解会方便很多。如果 ,那么求解和求解 具有相同的效果。那么问题在于是否可以这样做。

如果之间相互独立,这一关系显然是成立的;然而独立也就意味着不相关,那么这是不符合冗余度要求的。注意到我们求的是条件独立,条件是属于码本空间。条件独立的关系应该是成立的,虽然不清楚如何证明,然而其相关性已经作为条件出现在概率分布函数中了,在这一前提下之间相互独立。

  1. 加性高斯白噪声信道

发送信号通过信道后成为了接收信号,信道是加性高斯白噪声信道(从矢量信道模型去考虑)意味着

那么我们有,这是因为同样在码本空间内,的概率分布和 无关。

  1. 校验方程

当我们致力于求解的时候,实际上我们只需要在0,1之间选择一个取值,所以我们可以分别计算0,1的概率,计算比值

    

注意到乘号左侧是和信道有关的,右边的(包含的方程)代替的原因是其他校验方程和条件是无关的。写到这里的时候,我们似乎计算不下去了。不妨做一个不切实际的假设,那就是除以外的其他概率分布已经求得了。当我们考虑一个校验方程的时候会发现时该校验方程成立的条件是方程中其他的变量具有偶数个1,时正好相反。但是是多个校验方程的集合,如果说这些校验方程条件独立,将每一方程成立的概率相乘即可。那么问题是,什么时候校验方程条件独立?在回答这个问题之前,我们可以举出几个例子。

(1)当两个校验方程一样的时候

此时(一般情况下)

    

(2)校验方程具有相同项

此时(一般情况下)

可以认为,如果校验方程行线性无关,那么

 

引理:

一个长为 的相互独立的二进制序列,其中第个比特为1的概率为 ,那么整个序列中包含偶数个1的概率是

证明:

将上述函数展开为关于的多项式,则的系数表示这个长为m的序列中"1"的个数为的概率。

这个函数与前一个函数的区别在于:的奇数次幂的系数符号不同,两者正好互为正负。将这两个函数相加,那么的偶次幂的系数为原函数的2倍,奇次项相加后消去。令,就可以得到序列中"1"的个数为偶数的概率:

同样可得,序列中"1"的个数为奇数的概率是

 

上文已经阐述之间的条件独立特性,同时

    

所以在基于除以外的其他概率分布已经求得的前提下,求解是可行的。4

这个前提是无法达到的,上述过程中我们也看到了求解每一个比特的概率通过校验方程环环相扣。或许,如果我们可以找到一个线头,这个问题可能就可以求解了。但很可惜的是,由于比特的相互依赖关系,计算概率的过程实际上是一个环。(大部分情况下是这样的)这个时候,概率译码直接将其修剪成了一棵树以计算概率分布。

修剪的原则在于,上层节点不能运用底层节点已经用过的校验信息,防止陷入循环。此时,通过绘制校验树,就能够求解后验概率分布。

概率译码给出了一种求解方式,那么这种针对单一比特的求解方式在真实的计算过程中是否可行?如果基于计算所有码元考虑是否有更好的计算方法?这种方法求得的解是否最优?在我看来,由于其余比特的概率是不准确的(不是最佳估计),此时我们也不能够得到求解比特的真实后验概率。


置信传播

 

如果我们回到要求解的式子

在求解的过程中我们希望得到(第个方程的第个节点为1的后验概率)的好的估计值。采用是一个很简单的选择,但是很显然不好,因为没有用到校验矩阵的约束信息。概率译码下考虑到了这一点,所以采用了树结构将校验矩阵的约束信息包含在其中。但是即使概率译码这样考虑了,实际上最顶层的节点采用的还是

或许另一种思路在于,对所有的都采用进行估计得到了一个更加好的估计,再用这些更好的估计进行迭代估计(所有节点并行估计)。问题在于,是否每次迭代都可以得到对于的更好的估计?

感性的认识是由于接收到了其他节点和校验方程的信息,迭代之后的估计会更好。另一个认识是如果Tanner图的某一个环的girth很短,那么自身的信息会大量的传递回来。因为距离越远,传递信息的比重就会越小(乘了太多小于1的数),环girth很长就不用考虑这个问题。但这还需要更多的理性分析。

下面具体阐述置信传播算法,假定编码后的星座映射为假定编码后的星座映射为

初始值

    

首先我们计算

    

图 2 信息传递过程

 

之后我们更新各个变量节点的概率分布

这个时候我们发现了一个问题,如果对于每一个校验节点来说,我们都给这一信息,那么刚从校验节点传递过来的信息立刻就被返回去了。所以显然不是 的更好的估计值。参考概率译码,我们至少能够做的是将其他节点传递的消息传递出去。(关于这个问题,不从得到更好估计的角度,从消息传递的角度会更好解释,这将在因子图中介绍)因此置信传播的迭代过程应该是这样的。(参考《An Introduction to Low-Density Parity Check Codes》,本部分以下内容来自XXX师兄)

 

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

这一部分不是我写的,可以参考任意一本LDPC书,这里就不放上来了

这一部分不是我写的,可以参考任意一本LDPC书,这里就不放上来了×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

 

我们注意到在任何一种算法中,终止条件都有一条是校验式等于零。为何要设置这一个终止条件?实际上在设计的过程中,我们会保证任意两个可用码字之间的距离足够远。在这一个前提假设下,迭代过程中一旦落入了可用码字空间内,即使错误,那么也是几乎没有转移到正确码字的可能的。因此设置了这一终止条件。

因子图

 

从概率译码到置信传播,一个采用了校验集合树的概念,一个运用了Tanner图。然而我们实际上还是计算的公式,具体来说是

加法和乘法的运用构成了整个概率模型。但为何在这些算法中都引入了图?图在这里面起到了什么作用?《Pattern Recognition and Machine Learning》在图模型章节的开篇是这样说的

 

However, we shall find it highly advantageous to augment the analysis using diagrammatic representations of probability distributions, called probabilistic graphical models. These offer several useful properties:

1. They provide a simple way to visualize the structure of a probabilistic model and can be used to design and motivate new models.

2. Insights into the properties of the model, including conditional independence properties, can be obtained by inspection of the graph.

3. Complex computations, required to perform inference and learning in sophisticated models, can be expressed in terms of graphical manipulations, in which underlying mathematical expressions are carried along implicitly.

 

  • 将概率模型可视化,同时能够用于设计新的模型;
  • 通过观察图,我们可以洞悉很多模型的内部性质,譬如是否条件独立;
  • 复杂的计算可以通过图来表示。

     

很多时候我们更关注问题的表示而非其本身。就像LDPC关注校验矩阵的形式,以及数据的各种变换。概率模型也一样,三种图模型被用来表示概率模型,包括有向图模型、无向图模型(马尔可夫随机场)和因子图。三种模型各有优点,本节将介绍因子图。

对于多项式而言,我们有因式分解。譬如在解高次方程的时候,我们非常希望方程能够分解为多个低次方程的乘积。那么,对于概率分布函数而言,我们也希望能够这样做,即

    

其中中变量的子集,至于到底能够如何分解是取决于问题的,就好象多项式的分解取决于其具体形式。对于一个实际的问题,如果有以下关系

    

那么这一个式子的因子图表示如下

图 3 因子图

 

从这个例子,我们总结一下因子图是什么?因子图有两类节点,一是变量节点,另一个成为因子节点。这两类节点的内部没有边直接相连,变量的概率密度可以因式分解为因子节点的函数的乘积,因子节点的函数变量包括与其直接相连的变量节点。

写到这里忽然发现了一个很严重的问题,因子图这一表示是用来干什么的?不是我不想写,是我也不知道。如果从和积算法来说,因子图可以用来计算边缘概率分布。这也是《Pattern Recognition and Machine Learning》中引入因子图的理由。置信传播算法可以看作是和积算法的一个特例。

目的:计算边缘概率

手段:和积算法(要求两个节点之间只有一条路径,即多项式树结构)

实现方式:

  1. 边缘概率

    

表示除之外的变量集合。

  1. 因子分解

图 4 因子图的分解

 

这里为何要这样做呢?一个算法要尽可能多的利用已知的结构和信息,和积算法的一个假设是图无环。同时我们发现,对于一个最简单的只有一个变量节点和因子节点的图来说(这时实际上没有意义了),我们已经达到我们要的结果。如果图无环的话,意味着只要我断开一条边,那么这个大的因子图就变成了两个小的因子图。

如果我们将节点取出,那么因子图变成了个小因子图,这几个小因子图通过节点相连,故因子图的概率分布可以写成

其中代表和相连的因子节点,代表在这一个小因子图上的所有因子节点的乘积。

  1. 将2代入1,得

    

我们设 如下

    

我们可以将其看作是因子节点传递的信息(也就是小因子图传递的)。

  1. 计算

或许,我们将"计算"改为"表示"更为合适。上文中一直提到"小因子图"显然是可以因子化的,也就是说可以表示为

那么可以表示为

    

也就是说,实际上这个过程是小因子图的继续划分的过程,具体可以表示为下图

图 5 因子图的分解(续)

 

同理可设 ,可将其看作变量节点向因子节点传递的信息。

  1. 因子图的继续分解

如果我们继续将其分解下去,那么将再次计算到因子节点向变量节点传递的信息,而我们的目的正是如此,希望能够得到 之间相对简单的公式,这样我们就能够计算出边缘概率分布了。

图 6因子图的分解(续2)

 

由图 6 易知

    

也就是说

    

  1. 总结

和积和积,何为和积?变量节点的信息传递是求乘积的过程,因子节点传递的过程是对求乘积后的结果进行求和的过程(依据该因子节点的方程)。

我们注意到实际上都有一个连接的其他节点求乘积的过程,这也就意味着如果一个节点只和一个节点相连,那么其传递的消息是(和1相乘值不变)

  • 对应变量节点;
  • ,对应因子节点

 

到这里,因子图和和积算法已经写完了,要把因子图和和积算法和LDPC译码算法对应起来,我们要解决的问题实际上有两个

  • 在译码过程中观测量如何处理?上述因子图的所有变量节点都可以看作是隐藏节点,如何对观测到的结果进行处理,计算条件概率?
  • 如何处理因子节点和校验节点之间的关系?

 

这两个问题还有待进一步思考……

参考

 

《LDPC码基础与应用》 贺鹤云

《An Introduction to Low-Density Parity Check Codes》 Daniel J. Costello, Jr.

《LDPC码理论与应用》 袁东风

《Pattern Recognition and Machine Learning》

 

LDPC编译码基本原理的更多相关文章

  1. CCSDS标准的LDPC编译码仿真

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  2. SSD ECC中的LDPC编解码原理

    转自:http://blog.csdn.net/zhuzongpeng/article/details/78899198 目前SSD中ECC纠错代码主要两种BCH和LDPC.不过,随着SSD对ECC纠 ...

  3. i++ 反编译码

    1.特点: 操作数栈,主要用于保存计算过程中的结果,同时作为集计算过程中变量临时的存储空间. 操作数栈就是JVM执行引擎的一个工作区,当方法执行开始,一个新栈帧也会随之被创建,这个方法的操作数栈是空的 ...

  4. LDPC译码算法代码概述

    程序说明 V0.0 2015/1/24 LDPC译码算法代码概述   概述   本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum ...

  5. LDPC译码器的FPGA实现

    应用笔记 V0.0 2015/3/17 LDPC译码器的FPGA实现   概述   本文将介绍LDPC译码器的FPGA实现,译码器设计对应CCSDS131x1o1s文档中提到的适用于深空通信任务的LD ...

  6. 如何加速MATLAB代码运行

    学习笔记 V1.0 2015/4/17 如何加速MATLAB代码运行 概述 本文源于LDPCC的MATLAB代码,即<CCSDS标准的LDPC编译码仿真>.由于代码的问题,在信息位长度很长 ...

  7. c和fortran混编(基于GNU/Linux,转自 linzch)

    网 上说要分c为主程序和fortran为主程序两种情况讨论,其实我觉得不用,只要你了解生成可执行文件的机制.这个机制就是:不论是单一语言模块之间的 链接还是不同语言之间的混合链接,本质目的都是要链接器 ...

  8. Huffman树的构造及编码与译码的实现

    哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...

  9. 集显也能硬件编码:Intel SDK && 各种音视频编解码学习详解

    http://blog.sina.com.cn/s/blog_4155bb1d0100soq9.html INTEL MEDIA SDK是INTEL推出的基于其内建显示核心的编解码技术,我们在播放高清 ...

随机推荐

  1. 移动平台自动化测试从零开始-MonkeyRunner工具使用 (第二节)

    选自:http://yuedu.baidu.com/search?word=%D3%DA%D3%BF&pbook=0 第2节  MonkeyRunner 安装部署 如果您已经正确的安装部署了A ...

  2. 《Xenogears》(异度装甲)隐含的原型与密码

    <Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...

  3. C#中将结构类型数据存储到二进制文件中方法

    以往在vb6,vc6中都有现成的方法将结构类型数据写入和读取到二进制文件中,但是在c#中却没有现成的方法来实现,因此我查阅了一些资料,借鉴了网上一些同学的做法,自己写了个类似的例子来读写结构类型数据到 ...

  4. nexus安装实例

    Nexus安装 1.下载Nexus:[笔者版本nexus-2.11.2-03-bundle.tar.gz] 2. 安装nexus [root@localhost local]# pwd /usr/lo ...

  5. BZOJ 2648: SJY摆棋子 kdtree

    2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...

  6. mysql性能监控工具:mycheckpoint的使用方法

    mycheckpoint 是针对mysql的一个性能监控.指标采集的python写成的工具. 工作原理说明: mycheckpoint是一段脚本,通过将其设置为crontab定时任务,每几分钟采集一次 ...

  7. centos7 Linux 尝试使用crontab

    一.安装crontab [root@CentOS ~]# yum install vixie-cron[root@CentOS ~]# yum install crontabs 说明:vixie-cr ...

  8. 用户管理 之 Linux 用户管理工具介绍

    Linux是一个多用户的操作系统,她有完美的用户管理工具,这些工具包括用户的查询.添加.修改,以及用户之间相互切换的工具等:通过这些工具,我们能安全.轻松的完成用户管理: 在这里我们要引入用户控制工具 ...

  9. 解决URL路径包含+等特殊符号,编码也无效的办法

    <?xml version="1.0" encoding="UTF-8"?><configuration>      <syste ...

  10. 操作系统性能分析与优化V1.0

    操作系统性能分析与优化V1.0 : http://www.docin.com/p-759561760.html