二.译码原理
之前编码过程可以得到以下矩阵:
那么我们如何恢复数据呢?这就需要对RS码译码了。从编码矩阵中删去丢失数据块和丢失编码块对应行。假设D1、C2丢失,根据上图所示RS编码运算等式,我们得到如下B'以及等式:
上图中我们丢失了D1、D4以及C2,对应的生成矩阵B变成了B',那么我们如何由B’和错误的RS码得到原数据矩阵D呢?
这就需要我们对B'求逆矩阵B'-1了,我们可以使用下面的方法求出D:
最后就可以得到原数据D啦:
我们已知错误的RS码,那么我们如何得到矩阵B呢?
首先我们得计算出伴随式,这个方法需要我们通过Berlekamp-Massey等算法分析哪些字符是错误的,或者快速判断输入的信息是否完全损坏。
我们之前总结了RS的编码原理,最后的RS码= Q(X)* G(X),即它能被G(X)整除,我们又已知生成多项式G(X) = (x-a^0)(x-a^1)(x-a^2)......(x-a^(m-1)),当x= a^0,a^1,a^2,a^2.......,a^(m-1)时G(x) = 0,所以RS码多项式也为零,这说明a^0,a^1,a^2,a^2.......,a^(m-1)都是RS码多项式的根。因此如果读取到的RS数据没有损坏,结果应当是0。如果不是,这些伴随式里就包含了完成纠错所必需的信息。计算伴随式的实现很简单,代码如下:
def rs_calc_syndromes(msg, nsym): '''给定原信息和纠错标记数,计算伴随式 从数学角度看,这个过程就是一个傅里叶变换 (Chien搜索刚好相反). ''' synd = [0] * nsym for i in range(0, nsym): synd[i] = gf_poly_eval(msg, gf_pow(2,i)) return [0] + synd