在BCH解码的方案中,常用的求错误位置多项式的方案有两种,一种是基于皮德森的公式推到方案,另外一种是基于多项式迭代的BM算法方案,两种方案均是基于一个校验伴随式矩阵的等式推到而来,两个方案个有各的优缺点。因为之前已经对皮德森译码方案进行过了描述,所以本文这里只对BM迭代算法的实现原理和流程进行讨论。
先说基本知识,BCH解码的三个步骤,分别是计算伴随式、计算错误定位多项式的系数以及钱氏搜索算法纠错。这三个步骤在我目前所知的所有的BCH解码方案里面都是基本一致的,只有RS码还有第4个步骤,就是需要算错误位置的纠正值。在第一和第三个步骤都是一致的,只有第二个步骤计算错误位置多项式的系数时目前存在两种主流的算法,一种是皮德森译码,另外一种是BM迭代算法。
皮德森译码算法对于纠错个数较少以及基于2进制的有限域中有很好的效果,因为可以直接通过伴随式S计算出错误位置多项式的系数,相当于直接调用公式处理,都不需要知道原理,但是与之匹配的则是当纠错个数较多时公式计算复杂度相当高,当然这里是有优化方案的,但是复杂度仍然很高,虽然如此但是处理速度较快,可以用与高速的FEC中。
BM算法也叫博立坎普-梅西算法,分别是两个人名,这是一种迭代算法,如想纠T个错误则需要迭代2T次,这种算法的原理就是通过迭代找出满足条件的次数最小的多项式。顾明思义,这种算法需要用迭代的方法实现,那么就需要很长的时间来实现,那么复杂度就会降低,同时处理时间就会增加。所以这种算法一般用于纠错个数较多,但是对通讯速率要求不是很大的场景。
下面会简单介绍下基于BM迭代解码的三个流程中第一和第三个流程,然后重点介绍下BM解码的迭代原理和实现过程。
首先是计算伴随式,计算伴随是的最基本原理就是将编码时生成多项式g(x)所对应的根分别带入到接收的码字R(x)中,得到2T个伴随式,T是纠错个数。
C(x) =IN(x)*g(x) (1)
R(x) =C(x) +E(x) (2)
而根
是g(x)的根,那么同时也是C(x)的根,所以将根带入到公式(1)后C(x)必然为0 ,那么将根带入到公式(2)后就可以得到如下:
S1、S2 ...S2T就是伴随式。这些伴随式是计算错误位置多项式的基础。
然后就是BM迭代算法,bm算法的基本原理是从一系列的多项式推到出来的,下面我会引用一部分的教材上的公式,公式的推到比较复杂和繁琐,对公式不太敏感的人可以直接跳过公式的推到过程,直接看最后的结果。
1、伴随式的计算
2.错误位置多项式的假设生成,假设存在V个错误,这些错误位置分别为,则可以根据错误位置所代表的域中元素为错误位置多项式的根这个基本的原理,得到如下的错误位置多项式。
当b=1时
终得到上式,此公式为皮德森译码以及BM迭代算法的最基础的矩阵等式。
BM迭代算法的核心是不断对错误位置多项式增加修正量,得到满足上公式的次数最小的多项式,此多项式即为错误位置定位多项式(此证明课本上没找到,有兴趣的可以自己找一找)。
一般来说我们认为错误位置多项式的最高次幂代表了码字的错误个数,如当有t个错误时,那么错误位置多项式如下所示:
但是在最开始的时候我们是不知道有几个错误的,所以我们最先假设的是没有错误,那么就可以直接看伴随式是否全部为0,如果全部为0 那么就无需再计算,但是如果有非0的存在那么就可以从有一个错误位置多项式开始去做试探,令V=1,错误位置多项式为
则有
再判断
是否仍然满足
如不满足则增加修正量,令
,v=2,满足如下公式
令
满足
如不满足则增加修正量,令
,v=3,满足如下公式
计算得到相应的系数。一直推导,直到循环迭代2t次后得到错误位置多项式,查看错误定位多项式的最高次幂,如果最高次幂大于t则代表码字中的错误个数,如果幂级数大于纠错范围,则无法纠错。否则的话按照正常情况解码。
即原先
变成
原理基本上就是这样了,然后下面提供了一个BM迭代算法的基础的伪代码
这个伪迭代的代码中,在更新多项式时需要用到求逆的运算,但是在有限域中求逆运算时相对麻烦的,基本上只能用查表的方式实现,所以这又给了一种修正的无求逆运算的BM算法,下面也给出了算法的伪代码,在调用时可以直接参考伪代码进行算法代码的编写
此算法的推到过程目前我也还没找到,所以我后续会继续再接着看看这个推到过程,查找书籍材料上是否有相关的介绍,但是这个代码确定是没问题的,已经运用到波长标签的BCH解码中。
如上所有为BM的算法的实现的基本原理以及运算流程。因为这些基本上都是在数学领域上的推到,所以会有很多的公式,并且不是很好理解,如果只是应用的话就直接看最后的结果就可以了,对于中间的运算过程不需要太了解,但是也不能完全不了解。下面我将简单介绍下钱氏搜索算法进行纠错的原理和过程。
钱氏搜索算法说的直白点就是将有限域中所有的元素带入到错误位置多项式中,看看最终的结果是否为0,如果为0,那么则认为此点对应的有限域中的元素即为错误多项式的根,并根据根的逆得到错误位置。
前面说过错误位置多项式为:
那么搜索到的根X1....Xt为错误位置多项式的根,那么错误位置所对应的元素为(X1)^1....(Xt)^-1,将码字多项氏减去这些元素即可得到纠错后的结果了。