1

我的任务是使用奇偶校验和方法和Reed-Solomon Erasure Correction对一些声音字节进行编码和解码。我已经完成了第一种方法(奇偶校验和)的编码,但需要帮助完成第二种方法,即 Reed-Solomon Erasure Correction 检测。

到目前为止,我知道,RS 代码将t符号添加到k数据符号中。因此,它能够定位和纠正最多t/2符号,或者如果错误位置已知,则称为擦除。它最多可以纠正t。对于这个任务,我必须使用伽罗瓦域 GF(2 8 ) 将每个符号表示为一个字节。加法和减法运算是基于 XOR 的。因此,总的来说,我必须使用能够纠正直至t=3擦除的 Reed-Solomon 代码。现在单个 Reed Solomon 码的计算如下

0 | _ C 1 |........| C k-1 | CK | _ C k+1 | C k+2

所以代码字节可以被视为向量 ,单个代码是从 k 字节的数据中计算出来的,如下 所示,所以我的编码和解码过程需要以下 Vandermonde 矩阵 Fc=[c0,c1,...,ck+2]Cd=[d0,d1,...,dk-1]

1 1 1 2      1 3    ... 1 k-1 
1 2 2 2      2 3    ... 2 k-1
             ...
1 k+2 (k+2) 2 (k+2) 3 ... (k+2) k-1 
1 k+3 (k+3) 2 (k+3) 3 ... (k+3 ) k-1

所以一个简单的矩阵向量乘法使用F&D我们得到C=F.D

到目前为止,我为编码所做的如下:

#else

void fox_encode(Buffer* bufin, Buffer* bufout, FoxEncData* algorithm_data){

    // Your encoder for Task 2.C.3 goes in here !!!

    while (bufin->size >= 1){
        guint8 databyte = bufin->data[0];       //Pick up a byte from input buffer
        buffer_push_byte (bufout, databyte);    //Send it 3 times
        buffer_push_byte (bufout, databyte);
        buffer_push_byte (bufout, databyte);
        buffer_pop (bufin, 1);                  //Remove it from the input buffer
    }
}

#endif

我需要代码来完成此代码,以使用 Reed-Solomon Erasure Correction 对我的 fox_encode 和 fox_decode 类进行编码和解码。任何帮助将不胜感激,以尽快完成此任务。

提前致谢

4

2 回答 2

0

您可以查看我的 RS(255,255-k) C 实现,可从我的主页获得。

它同时处理错误和擦除,并纠正任何受以下限制的字节错误/擦除模式:

(2*errorCount + erasureCount) <= k。

于 2015-01-05T22:22:11.380 回答
0

现在有一个关于Wikiversity的很好的教程,详细说明了如何处理擦除和错误。

以下是擦除解码过程需要实现的概要:

  1. 计算综合症。然后检查是否都是0系数,消息不需要更正,否则继续。
  2. 调用 Forney 算法,将校正子和擦除位置作为输入来计算擦除幅度多项式(即,从消息多项式中减去的值以获取原始消息)。
  3. 减去message - erasure_magnitude_polynomial以恢复您的原始消息(如果在单例范围内)。

除了可能有点涉及的 Forney 算法之外,所有其他部分都非常简单明了。事实上,最困难的部分,例如 Berlekamp-Massey 算法和 Chien 搜索,仅在您想要解码错误时才需要,而 Forney 综合症计算仅在您想要纠正擦除和错误(即勘误表)时才需要——尽管我已经阅读了一些描述可以绕过福尼综合症计算的论文,但我从未见过这样的代码。

于 2017-07-03T02:06:18.187 回答