簡體   English   中英

使用Reed-Solomon糾刪進行前向糾錯

[英]Forward error correction using Reed-Solomon Erasure Correction

我的任務是使用奇偶校驗和方法和Reed-Solomon Erasure Correction對聲音的某些字節進行編碼和解碼。 我已經完成了第一種方法(奇偶校驗和)的編碼,但是需要幫助完成第二種方法,即通過Reed-Solomon糾刪檢測。

到目前為止,我知道,RS代碼將t符號添加到k個數據符號中。 因此,它能夠定位和校正最多t/2符號,或者如果已知錯誤位置(即所謂的擦除),則可以定位和糾正。 它最多可以校正t 為此,我必須使用Galois字段GF(2 8 )將每個符號表示為一個字節。 運算加法和減法基於異或。 因此,總的來說,我必須采用能夠校正直至t=3擦除的Reed-Solomon碼。 現在,單個Reed Solomon代碼的計算如下

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

所以代碼字節可被視為矢量c=[c 0 ,c 1 ,...,c k+2 ]和單碼C從數據如下的k個字節來計算d=[d 0 ,d 1 ,...,d k-1 ] ,所以我的編碼和解碼過程需要以下范德蒙德矩陣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

因此,使用FD進行簡單的矩陣矢量乘法,我們得到C=FD

到目前為止,我所做的編碼如下:

#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類進行編碼和解碼。 感謝您提供任何幫助以盡快完成此任務。

提前致謝

您可以查看我的RS(255,255-k)C實現,可從我的主頁獲得

它同時處理錯誤和擦除,並糾正由以下內容限制的任何字節錯誤/擦除模式:

(2 *錯誤計數+擦除計數)<= k。

現在,在Wikiversity上有一個很好的教程,其中詳細介紹了如何處理擦除和錯誤。

這是刪除解碼過程需要實現的概述:

  1. 計算綜合症。 然后檢查是否全部為0系數,消息不需要更正,否則繼續。
  2. 使用校正子和擦除位置作為輸入來調用Forney算法,以計算擦除幅度多項式(即,從消息多項式中減去以獲得原始消息的值)。
  3. 減去message - erasure_magnitude_polynomial以恢復原始消息(如果在Singleton范圍內)。

除了可能涉及到一點點的Forney算法外,所有其他部分都非常簡單明了。 確實,最困難的部分(例如Berlekamp-Massey算法和Chien搜索)僅在您要解碼錯誤時才需要,而福尼綜合症的計算僅在您要同時糾正擦除和錯誤(即勘誤)時才需要-盡管我我已經讀過一些論文,這些論文描述了可以繞開福尼綜合症的計算,但是我從未見過這樣的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM