在1981年Tanner的论文中,介绍了一种可以用来表示码字的图形,称为Tanner图。 Tanner图包含两类节点:码元(变量)节点和校验节点,然后通过边连接这两种不同的节点,并且同种节点间不能有直接的边连接。如果给定一个码字的码元数和它的校验方程,则用Tanner图可以唯一地确定该码字。例如一个(7, 3)线性分组码,其校验方程为:
在用Tanner图表示的过程中, 码的译码算法是可以用明确的公式反映并可程式化进行, 即有很强的可实现性。Tanner图从本质上讲是用码字的校验方程来表述码字
-
消息传递算法
和 积 算 法 (Sum-Product Algorithm) 作 为 一 种 通 用 的 消 息 传 递 算 法(Message Passing Algorithm), 描述了因子图中顶点(变量节点和校验节点) 处的信息计算公式, 而在基于图的编译码系统中, 我们首先需要理解的是顶点之间是如何通过边来传递信息。
- 例如, 若干士兵排成一队列, 每个士兵只能与他相邻的士兵交流, 问如何才能使每个士兵都知道总的士兵数?
- 将上面的情况抽象成一般模型,如下图所示,图中每个点可看作是一个士兵,对应到编码理论中则可看作因子图中对应的节点(如前述的变量节点和校验节点,或卷积码的BCJR算法中的状态点)。
- 对应上图, 引入几个概念: 先验信息P、 外信息E以及后验信息A。 在上例中, 先验信息P表示每个士兵自身的数字1, 如图(a) 所示;外信息E表示从其他相邻的士兵获取的信息, 如图(c) 所示, 即每个士兵的外信息均为5;后验信息A=P+E, 在这里表示队列的总人数, 即为6。 从图中可以看出, 得到最后的结果是通过前向计算和后向计算得到的。
- 从图中可以看出,经过5步计算第3、第4个士兵可以得到总人数6(5+1),经过6步计算第2、第5个士兵可以得到总人数,经过7步计算所有士兵均知道了总人数。
问题:如果士兵不是按照队列排列,怎么办呢?
- 该图(a)与前图不同之处在于, 有些士兵不止有2个相邻的士兵, 可能有3个或更多。 具体信息传递流程如图(b)所示。 每个士兵同样可以获得其相邻士兵给他的外信息, 同时加上自身的信息然后传递给相邻的士兵。
- 在上面的两个例子中, 每个士兵节点的信息只需在所有其相邻节点上进行一次前向和后向的计算, 则每个士兵就可知道总人数。 这样的图有一个共同特点:所有节点构成一棵树, 而树结构中是没有环路的。
如果有环路, 会导致什么结果?
由于有环路的存在, 如果用上述信息更新方法来确定总人数, 将会导致无法确定何时中止信息的传递, 因此也就无法确定士兵人数。 对应到编码理论, 则在设计LDPC码的校验矩阵时, 应尽量避免校验矩阵对应的因子图中出现短环(如4循环、 6循环、 8循环等) 。
将前述消息传递算法中的节点构成的图(Tanner图)更一般化就得到了因子图。 因子图是一种用于描述多变量函数的“二部图” (Bipartite Graph)。一般来说, 在因子图中存在两类节点: 变量节点和对应的函数节点, 变量节点所代表的变量是函数节点的自变量。 同类节点之间没有边直接相连。
例如:图(a) 表示有5个自变量的函数g的因子图。 假定函数g可以分解成几个“局部函数” 之积的形式, 即: