内容摘要:上世纪60年代初,香农的学生Gallager在他的博士毕业论文中首次提出了LDPC码的概念和完整的译码方法,但是直到上世纪末期,随着LDPC码译码理论的进步和计算机技术的发展,LDPC码才以其优良的误码性能和良好的可实现性成为人们研究的焦点。针对QC类LDPC码进行研究的时候,注意到很多码的循环子矩阵中不只有一组1,这就产生了水平运算后判断运算结果属于哪个存储模块的问题;另外,由于校验矩阵中每个循环子矩阵的列初始位置都是不同的,而且通常LDPC码的校验矩阵的循环子矩阵的数目都是非常庞大的,因此如果通过程序固化的方法,不但容易出现不易排查的错误,而且开发效率会大大下降。为解决该问题,并将解决方案通用化,文中以校验矩阵中循环子矩阵中1的排列特点为研究对象,找到引起变化的量之间的共性特征,从而实现通用化模块的设计。
关键词:LDPC;通用;准循环;数据分配
近几年,人们对可靠高效的信息传输和存储技术提出了越来越高的要求。差错控制编码作为一种纠正由信道噪声带来传输错误的有效方式,被广泛应用与数字通信和存储等领域。Low-Density Parity-Check(LDPC)码发明于上世纪60年代初期,它是一类性能接近香农极限的差错控制编码,采用置信传播的译码方式进行译码。随着VLSI和计算机技术革命性进步的到来,LDPC码的实现成为了可能,并且由于在AWGN信道下的极佳误码性能和高并行度实现引起了人们的强烈关注。目前,LDPC码的普及程度大大增加,很多标准也都将LDPC码纳入进来,这都导致了与LDPC码泽码的相关课题与日俱增,随之而来的问题是大量的重复性的开发工作,因此需要将一些共性的开发工作进行通用的模块化设计,以提高开发效率。
1 传统的译码方案在通用性方面的不足
在LDPC码的实现过程中,水平运算结果利用4维定位方法,存储了最小值、次小值、最小值位置和符号位。然而像CCSDS近地通信码这样的LDPC码的校验矩阵中的每个循环子矩阵都有两组1,它们都按照准循环的方式排列,如图1所示。
图中所示0为校验矩阵的一个列重为2的循环子矩阵,该矩阵可以拆分成两个列重为1的循环子矩阵Q1和Q2,这一结构对下文所述的数据分配策略和改进的垂直运算过程有决定性的影响。
在每个循环子矩阵中只有一组1或没有1的情况下,只需要按照存储器中数据存储的顺序读取,然后进行水平运算即可,然而若循环子矩阵中的1不止一组的时候,数据的读取就会发生混乱,有时存储器1的数据在前,而有时存储器2中的数据在前,这对判断最小值属于哪个存储器极为不利。
因此需要开发一种通用化的辨识数据先后顺序的模块,该模块附着在校验矩阵中的每一个列块上,对输出的数据自动做好标识,使得水平运算的结果能够精确的反应数据的来源。
2 文中所采用的范例码
基于EG(欧式几何)的QC(准循环)LDPC码属于QCLDPC码,该类码的构造是基于欧式几何有限域分解的。(8176,7154)LDPC码最初是为NASA设计的,它是一个规则的QC LDPC码,行重32,列重4。目前(8176,7154)LDPC码是CCSDS推荐的近地通信码,它具有很好的规则性,目前已
被应用于遥感卫星等航天器的近地通信领域。
本部分内容给出的CCSDS近地通信(8176,7154)QC-LDPC码的译码方法,同样适用于其他的每个循环子矩阵中有1组或2组1的OC-LDPC码情况。
3 文中所采用的译码算法
LDPC码的译码算法主要分为软译码算法和硬译码算法,软译码算法主要是指Gallager最早提出的LDPC码概率译码算法、BP算法以及BP算法的改进型最小和算法;硬译码算法主要是指BF算法。
采用软译码算法泽码获得的编码增益比较高,在绝大多数情况下,众多软译码算法中具备实现价值的译码方法之一仍是BP算法的改进算法之一,最小和算法。传统最小和算法的水平运算公式。
后来人们改进了最小和算法,提出了Normalized BP和Offset BP两种算法,这两种算法在本质上是等价的,都极大地改进了最小和算法的译码精度,使得最小和算法的编码增益更加接近传统的BP算法,目前这两种算法中以NormalizedBP算法应用较为广泛。文中采用了Norma lized BP算法,图3给出了Normalized BP的参数选择情况,如图所示,在参数值为1.25时得到了最小和算法的最好修正结果,但是通常在实现过程中,为了利于硬件功能的实现,会将(1/λk)的值设为0.75,这样便于硬件乘法的实现。
www.55dianzi.com
硬件实现的过稃中该参数的实现手段如图4所示。
经过对原数值的两次移位,得到该数值的四分值,通过减法达到(1/λk)为0.75的目的。
4 通用化模块设计
下面的讨论不失一般性,以每个循环子矩阵巾有3组1为例进行说明。
如图5所示。A,B,C 3条线从“初始列号”开始向右侧进行编排,由于C线的ver_pos_C(ver_pos_A、ver_pos_B、ver_pos_C分别指循环子矩阵中每组1的列初始位置)值最大,即C线在最右端.这也就意味着在经过511—1—ver_pos_C(511是每个循环子矩阵的大小)行的运算之后,C线首先将要从最左边重新开始循环。因此,下面进行的数据初始化顺序从A,B,C,变为C,A,B,以此类推。
总而言之,每当排在最右侧的一条线到达最右侧的列时,下一步的CNU运算就将其变为本子矩阵的最先处理的数据。因为有这样的运行规律,于是形象的称这种运行方式为“反弹”。即,每当排在最右侧的线碰撞到循环子矩阵的右侧壁时便发生“反弹”,横向处理数据的顺序便进行一次向右的循环移位,将最右侧线的数据移到最左边,其他的数据顺序不变。
如此循环,直到把该循环子矩阵中所有的“1”位置全部处理完毕。每当循环子矩阵中发生一次“碰壁”后“定位位”就加1。
想要知道每条线横向的先后顺序就需要用到前面提到的“穿越”方法。首先确定3条水平直线,3条水平直线位于hor_pos_A,hor_pos_B,hor_pos_C位置上,记为hor_A,hor_B,hor_C,如图5所示。A,B,C 3条线从“初始行号”位置开始向右侧进行编排,A,B,C中的每条线,每当穿越hor_A,hor_B,hor_C中的直线时,A,B,C的横向计数便加1,因为每穿越一次除它本身之外的线时,在它左边就多一条线。因此本方法称之为“穿越”。
先以C线为例进行说明。C线从hor_pos_C点歼始,向右侧移动,当C线的行号“穿越”第一个除hor_C以外的水平直线hor_B的时候.此时C线上数据的编号加1。
5 加入通用化模块的高速译码实现方案
从上面的分析的出结论,当存储器内的数据进行向右侧的循环移位的时候,每当到达最右侧,通用定位模块检测到这一信息便将通用定位模块的输出加1。存储在定位位内。具体说明参见如图6所示。
本文关键字:通用 综合-其它,单片机-工控设备 - 综合-其它