Reed-Solomon纠删码简析

Reed-Solomon编码(又叫RS编码、里德-所罗门编码)作为一种前向纠错编码,是一种很常见的数据冗余技术,也就是通过对数据增加冗余部分来保证当数据丢失时能够在一定程度上进行恢复。最典型的应用就是在现在最流行的QR二维码的编码设计中。

实现功能

他所解决的问题是:给定$n$个数据块$(d_1,d_2,d_3,...,d_n)$,对于一个确定的正整数$m$, RS编码能够根据这$n$个数据块生成$m$个校验块, $(c_1, c_2,..., c_m)$。  我们能够做到,从这$m+n$个数据(或校验)块中任取$n$块就能解码出原始数据。 即对于$n$个数据块进行RS编码后生成的$n+m$个数据块,我们能够容忍丢失至多$m$个数据块。

编码原理

实现的功能听上去很强大,其实原理却十分简单,只是他很巧妙的运用了矩阵运算的特点,说起来也十分简单。

一、对于需要进行冗余处理的$n$个数据块,我们把他写成列向量的形式,其中每个数据块都可以看做是一个数。

二、生成一个变换矩阵,这个矩阵由$n+m$行和$n$列组成,其中上面的$n\times n$的部分是一个单元矩阵,下面的$m\times n$的部分是一个范德蒙矩阵。

三、用这个变换矩阵左乘数据列向量得到$n+m$位冗余码列向量。

算式如下:

$$\begin{bmatrix}1&0&..&0&0\\0&1&..&0&0\\..&..&..&..&..\\0&0&..&1&0\\0&0&..&0&1\\1^0&1^1&..&1^{n-2}&1^{n-1}\\2^0&2^1&..&2^{n-2}&2^{n-1}\\..&..&..&..&..\\ (m-1)^0&(m-1)^1&..&(m-1)^{n-2}&(m-1)^{n-1}\\m^0&m^1&..&m^{n-2}&m^{n-1}\end{bmatrix}\times \begin{bmatrix}b_1\\b_2\\b_3\\..\\b_n\end{bmatrix}=\begin{bmatrix}b_1\\b_2\\b_3\\..\\b_n\\c_1\\c_2\\c_3\\..\\c_m\end{bmatrix}$$

上面使用单位矩阵显然是为了保证原数据块在编码后不发生变化,从而看上去只是增加了冗余码。

下面使用范德蒙矩阵其实是为了保证这个矩阵任取$n*n$的部分可逆。

解码原理

根据上面的编码方式,我们可以很容易理解他的解码方法。对于编码后的数据块$(b_1,b_2,...,b_n,c_1,c_2,...,c_m)$,只需要任取其中的$m$个数据块,假设为$(b_{a_1},b_{a_2},...,b_{a_x},c_{b_1},c_{b_2},...,c_{b_y})$其中$x+y=m$,再用$f_i$表示编码过程中那个矩阵的第$i$行。显然,下面的等式一定成立:
$$\begin{bmatrix}f_{a_1}\\f_{a_2}\\..\\f_{a_x}\\f_{n+b_1}\\f_{n+b_2}\\..\\f_{n+b_y}\end{bmatrix}\times\begin{bmatrix}b_1\\b_2\\b_3\\..\\b_n\end{bmatrix}=\begin{bmatrix}b_{a_1}\\b_{a_2}\\...\\b_{a_x}\\c_{b_1}\\c_{b_2}\\...\\c_{b_y}\end{bmatrix}$$

这样一来,我们就可以把中间的数据矩阵解出来了。

计算域

上面的方法理论上是能够做到数据冗余处理的,不过由于作为一种编码技术,RS编码需要处理的是特定长度的二进制数据,然而求矩阵逆的过程是在实数域内进行的。显然特定长度的二进制位是无法准确描述实数的。因此RS编码的计算域采用的是能够用二进制位精确编码的伽罗华域$GF(2^n)$。这个域的特性就是非常适合处理$[0-2^n)$范围内数据的四则运算,而且这里的四则运算大都通过位运算处理,效率比较高。实际生产中由于数据的量会比较大,为了加快整个计算的过程,通常会采用离散傅里叶变换(DFT)及其逆变换来进行编码实现。具体的介绍可以参见这一篇文章

重要特征

由于RS编码采用的是伽罗华域$GF(2^n)$,那他就有一个很有趣的特点,那就是对于数据$b_1,b_2$以及其分别对应的冗余码$c_1,c_2$,我们可以迅速的知道对于数据$b_1\otimes b_2$,他的冗余码就是$c_1\otimes c_2$($\otimes $表示异或)。

这一点其实很好理解,根据之前的编码过程,我们很容易知道对于实数域,如果数据$b_1,b_2$分别对应的冗余码是$c_1,c_2$,那么数据$b_1+ b_2$的冗余码就是$c_1+ c_2$。而现在的运算域是伽罗华域,在伽罗华域中加法做的就是异或操作。

参考资料

Reed Solomon纠删码
里德-所罗门码(RS 码) 简介
Finite Field Arithmetic and Reed-Solomon Coding