码-Reed-Solomon码

从定义开始:

RS编码背后的核心可以形象化的表示为多项式,它依靠一个代数理论,该代数理论说明:任何长度为k的码可以唯一表示成一个阶数(degree)至多为k-1的多项式。

发送者表明一个在有限域中的k-1阶的多项式,它表示k个数据点。这个多项式就根据它在各点的赋值被“编码”,实际传送的是这些值。 在信息传输中,一些值会被破坏。所以,实际发送的点不止k个。只要正确地接收了足量的数值,接收方就可以推算出原始多项式,进而译出原始数据。同样的,我们可以通过插值来修正曲线。RS码可以将一组有错误序列的信息码转换到找回画出原始曲线的多项式的系数。

 

RS code的编解码定义如下:

编码:给定n个数据块(Data block)D1、D2……Dn,和一个正整数m,RS根据n个数据块生成m个编码块(Code block),C1、C2……Cm。

解码:对于任意的n和m,从n个原始数据块和m个编码块中任取n块就能解码出原始数据,即RS最多容忍m个数据块或者编码块同时丢失。

 

RS编解码中涉及到矩阵求逆,采用高斯消元法,需要进行实数加减乘除四则运算,无法作用于字长为w的二进制数据。为了解决这个问题, RS采用伽罗华群GF(2^w)中定义的四则运算法则。

 

GF(2w)域有2w个值, 每个值都对应一个低于w次的多项式, 这样域上的四则运算就转换为多项式空间的运算。 GF(2w)域中的加法就是异或XOR, 乘法通过查表实现,需要维护两个大小为2w -1的表格: log表gflog,反log表gfilog。 

乘法公式: a * b = gfilog(gflog(a) + fglog(b)) % (2^w -1)

 

 

编码: 为了计算冗余数据,首先我们需要选举出一个合适的编码矩阵。编码矩阵的上部为一个单位矩阵,这样保证了在编码后原始数据依然可以直接读取。通过计算编码矩阵和原始数据的乘积,可以到最终的结果。

解码:
当数据块发生丢失,在编码矩阵中去掉相应行,等式仍然保持成立。这为我们接下来恢复原始数据提供了依据。
为了恢复数据,首先我们求剩余编码数据的逆矩阵,等式两边乘上这个逆矩阵仍然保持相等。与此同时,互逆矩阵的乘积为单位矩阵,因此可以被消掉。那么所求得的逆矩阵与剩余块的数据的乘积就是原始数据了。
 
--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!--!!!
像BCH码一样,RS码通过用表示消息的多项式除以不可约生成多项式来编码,余数的就是RS码,我们将其附加到原始消息。
为什么?我们之前说过,BCH码和其他大多数纠错码背后的原理是使用一个单词差异很大的简化字典,从而使单词之间的距离最大化,并且更长的单词具有更大的距离:这里的原理相同,因为我们用附加码元(余数)来加长原始信息,这增加了距离;其次是因为余数几乎是唯一的(得益于精心设计的不可约生成多项式),所以它可以被聪明的算法用来推导原始消息。
总结一下,与加密类似:生成多项式是编码字典,多项式除法是用来将我们的消息通过字典(生成多项式)转换成RS码的运算。

RS码使用与BCH码类似的生成多项式,生成器是因子(x - αn)的乘积,例如:

  g4(x) = (x - α0) (x - α1) (x - α2) (x - α3) = 01 x4 + 0f x3 + 36 x2 + 78 x + 40

这是一个计算给定数量的纠错符号的生成多项式的函数;这个函数有点低效,因为它为g分配了连续的更大的数组。尽管这在实践中不太可能是一个性能问题,但是读者可能会发现重写优化器使得g只被分配一次,或者可以计算一次并记住g。

posted @ 2023-11-19 20:23  沉梦昂志_doc  阅读(10)  评论(0编辑  收藏  举报