参考文章:https://blog.csdn.net/shelldon/article/details/54144730
参考文章:https://blog.csdn.net/shelldon/article/details/54729687
Reed Solomon利用范特蒙矩阵或者柯西矩阵的特性来实现纠错码的功能。下面着重介绍Reed Solomon编解码原理:
一、Reed Solomon编码
把输入数据视为向量D=(D1,D2,..., Dn), 编码后数据视为向量(D1, D2,..., Dn, C1, C2,.., Cm),RS编码可视为如下图所示矩阵运算。
编码矩阵B必须具有任意子矩阵可逆的特性。
二、Reed Solomon解码
根据图1所示RS编码运算等式,可以得到如下B' 以及等式。
(2)由于B' 是可逆的,记B'的逆矩阵为 (B'^-1),则B' * (B'^-1) = I 单位矩阵。两边左乘B' 逆矩阵。
(3)得到如下原始数据D的计算公式
三、有限域
假设每一个向量元素由8比特组成,那么矩阵相乘后的结果必然要超过8比特的范围,为了解决这个问题,我们引入有限域的概念。
域中不可约多项式是不能够进行因子分解的多项式, 本原多项式 (primitive polynomial)是一种特殊的不可约多项式。当一个域上的本原多项式确定了,这个域上的运算也就确定了。本原多项式一般通过查表可得,同一个域往往有多个本原多项式。 通过将域中的元素化为多项式形式,可以将域上的乘法运算转化为普通的多项式乘法再模本原多项式。
在计算机中有限域GF(2^8)常用的本原多项式是x^8+x^4+x^3+x^2+1。
6、多项式运算
对于GF(2^w)上的多项式计算,多项式系数只能取 0或1。所以加法等同于异或运算,减法等同于加法。
四、本原多项式
我们可以通过本原多项式生成一个有限域的所有元素,生成步骤如下:
生成元素 | 多项式表示 | 二进制表示 | 数值表示 | 推导过程 |
0 | 0 | 0000 | 0 | |
x^0 | x^0 | 0001 | 1 | |
x^1 | x^1 | 0010 | 2 | |
x^2 | x^2 | 0100 | 4 | |
x^3 | x^3 | 1000 | 8 | |
x^4 | x+1 | 0011 | 3 | x^3*x = x^4 mod P(x) = x+1 |
x^5 | x^2+x | 0110 | 6 | x^4*x = (x+1)*x = x^2+x |
x^6 | x^3+x^2 | 1100 | 12 | |
x^7 | x^3+x+1 | 1011 | 11 | x^6*x = (x^3+x^2)*x = x^4 +x^3 mod P(x) = x^3+x+1 |
x^8 | x^2+1 | 0101 | 5 | |
x^9 | x^3+x | 1010 | 10 | |
x^10 | x^2+x+1 | 0111 | 7 | x^9*x=(x^3+x)*x = x^4+x^2 mod P(x) = x^2+x+1 |
x^11 | x^3+x^2+x | 1110 | 14 | |
x^12 | x^3+x^2+x+1 | 1111 | 15 | x^11*x=(x^3+x^2+x)*x = x^4+x^3+x^2 mod P(x) = x^3+x^2+x+1 |
x^13 | x^3+x^2+1 | 1101 | 13 | x^12*x=(x^3+x^2+1 )*x = x^4+x^3+x mod P(x)= x^3+1 |
x^14 | x^3+1 | 1001 | 9 | x^13*x=(x^3+x^2+1)*x = x^4+x^3+x mod P(x) = x^3+1 |
x^15 | 1 | 0001 | 1 | x^14*x = (x^3+1)*x = x^4+x mod P(x) = 1 |
五、查表法
根据上述生成有限域的原理,我们也可以看出有限域中的乘法规则
x^7*x^9 = (x^3+x+1)*(x^3+x)mod P(x)
这种多项式相乘和取模运算量是很大的。
由于指数运算是满足定理 :假设a=g^n,b=g^m。那么a*b = g^n* g^m = g^(n+m)。所以我们可以根据a和b,分别查表得到n和m,然后查表g^(n+m)即可。这就叫做查表法。它可以快速的提升矩阵相乘的运算速度。
根据上文的GF(2^4)的元素表示,生成gflog表和gfilog表如下: