使用Reed-Solomon Erasure Correction进行前向纠错

时间:2012-02-18 16:01:12

标签: c reed-solomon forwarderrorcorrection

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

到目前为止,我知道,RS代码会将t个符号添加到k个数据符号中。因此,它能够找到并纠正最多t/2个符号,或者错误位置是否已知所谓的擦除。它最多可以纠正t。为此,我必须使用伽罗瓦域GF(2 8 )将每个符号表示为一个字节。操作加法和减法基于XOR。因此,我必须使用能够纠正t=3次删除的Reed-Solomon码。现在计算单个Reed Solomon代码如下

C0 | C1 |........| Ck-1 | Ck | Ck+1 | Ck+2

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

1  1    12     13   ...   1k-1
1  2    22     23   ...   2k-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类进行编码和解码。任何帮助将不胜感激,以尽快完成此任务。

提前致谢

2 个答案:

答案 0 :(得分:0)

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

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

(2 * errorCount + erasureCount)< = k。

答案 1 :(得分:0)

现在有一个关于Wikiversity的好教程,详细介绍了如何处理删除和错误。

以下是您需要为删除解码过程实现的内容概述:

  1. 计算综合症。然后检查它是否都是0系数,消息不需要更正,否则继续。
  2. 使用校正子和删除位置作为输入调用Forney算法来计算擦除幅度多项式(即,从消息多项式中减去的值以获得原始消息)。
  3. 减去message - erasure_magnitude_polynomial以恢复原始邮件(如果在Singleton范围内)。
  4. 除了可能有点涉及的Forney算法之外,所有其他部分都非常简单明了。事实上,Berlekamp-Massey算法和Chien搜索等最困难的部分只在您想要解码错误时才有必要,Forney综合症计算只有在您想要纠正错误和错误(即勘误表)时才有必要 - 尽管我已经阅读了一些描述可以绕过Forney综合症计算的论文,但我从未见过这样的代码。