RS(255,223)糾錯算法原理與項目源碼

RS(255,223)糾錯算法原理與項目源碼

1.背景

  • 數據在網絡傳輸、存儲過程中由於信道噪聲條件,硬件設備等問題數據產生了差錯,這時候應該如何處理呢?特別是現在企業對海量大數據的傳輸,存儲的重視,要求我們使用一定的技術處理這些數據差錯。

2.糾錯編解碼原理簡單介紹

  • 爲什麼糾錯碼具有發現錯誤!糾正錯誤的能力呢?糾錯碼又是按什麼樣的原理去編的呢?爲了說明這些問題,我們首先介紹一些基本概念:由0和1組成的串稱爲字(Word),一些字的集合稱爲碼(Code)。碼中的字稱爲碼字(Code Word)。不在碼中的字稱爲廢碼(Invalid Code)。碼中的每個二進制信號0或1稱爲碼元(Code Letter)。
  • 我們下面舉出幾個關於糾錯碼的例子。設有長度爲2的字,它們一共可有2x2=4個,力。因爲當52中的一個字如10,在傳遞過程中其第一個碼元1變爲0,因而整個字成爲00時,由於00也是52中的字,故我們不能發現傳遞中是否出錯。但是,當我們選取52的一個子集如C2={00},作爲編碼時就會發生另一種完全不同的情況。因爲此時01和10均爲廢碼,而當H在傳遞過程中第一個碼元由1變爲0,即整個字成爲01時,由於01是廢碼,因而我們發現傳遞過程中出現了錯誤。對00也有同樣的情況。但是,這種編碼有一個缺點,即它只能發現錯誤而不能糾正錯誤,因此我們還需要選擇另一種能糾錯的編碼”現在我們考慮長度爲3的字,它們一共可有2!3=8個,它們所組成的字集凡不僅能整個碼字只會變爲101!011或000,但是都可知其原碼爲001。對於碼字110也有類似的情況”故對編碼q,我們不僅能發現錯誤而且能糾正錯誤”當然,上述編碼還有一個缺點,就是它只能發現並糾正單個錯誤。當錯誤超過兩個碼元時,它就既不能發現錯誤,更無法糾正了。

3.Reed-Solomon 碼(RS 碼)原理

  • Reed-Solomon 碼(RS 碼)是 Reed和 Solomon於 1960 年發現的一類多元最大距離可分(MDS)碼,其最小距離達到了 Singleton 限mind = n − k+ 1,從這個意義上講,RS 碼是最佳的。之後幾十年裏,RS 碼的硬判決譯碼得到了深入的研究,其理論和技術都已經非常成熟。因而,RS碼在現代數字通信、數據存儲系統中得到了廣泛的應用。

4.Reed – Solomon編碼抽象代數基礎

  • 4.1定義 設G是一個非空集合,稱映射爲G上的一個二元運算,即對於G中仍以兩個元a和b,唯一確定 (a,b).記爲,爲了方便起見,可寫成c=ab.
    定義 設G是一個非空集合,是G上的一個二元運算,如果G滿足下列條件:
    a)(結合律)對於任意,有
    b)(單位元)G中存在單位元,對於任意,滿足
    c)(逆元)對於任意,存在的逆元,滿足
    則稱G爲羣,記爲.
    如果羣滿足交換律,即對於任意,滿足
    則稱羣 爲交換羣或阿貝爾羣.
  • 4.2 環和域
    定義 設R是一個非空集合,R上有兩個二元運算和,分別成爲加法和乘法,如果R滿足下列條件
    a)爲加法阿貝爾羣
    b)(結合律)對於任意,有
    c)(分配律)對於任意,有
    稱R爲環,記爲,如果他對乘法滿足交換律,即對任何
    稱環爲交換環
    定義 設爲交換環,表示R中所有非零元的集合,如果在乘法運算下構成交換羣,則稱爲域。
  • 4.3 有限域
    定義 設F爲一個域,如果F只含有有限個元素,稱F爲有限域,含有q個元素的有限域記爲,有限域也成爲伽羅華域(Galois field),用GF(q)或表示q階有限域。
    最簡單的有限域是二元域GF(2)={0,1}。
    定義 對於GF(q)上的每個非零元素,存在最小整數k,使成立,則稱爲k階元素。
    定義 對於GF(q)上的每個非零元素,如果其階數是q-1,則稱爲本原元素。
    定義上的一個m次多項式,如果他的所有根都是中的本原元素,則稱是m次本原多項式。
    例如,對於m = 8時上的m次本原多項式爲
    對於m = 7時上的m次本原多項式爲
    定義 設爲中的元素,多項式是上使的最低次多項式,則稱爲最小多項式。具有相同最小多項式的元素,構成同一共軛系。
  • 4.4 歐幾里得算法
    歐幾里得算法給定兩個正整數a,b,可以用歐幾里得除法得到其最大公約數(a,b),並求得A,B,滿足(a,b)=Aa+Bb。
    用歐幾里得除法求(a,b)的步驟如下:
    第一步:不失一般性,假設a>b,且令
    第二步:用除以得到其商數和餘數,亦即
    第三步:如果,停止運算,並記;否則,轉第二步。
    歐幾里得算法又被稱爲輾轉相除法,這裏是單調下降序列。
    用歐幾里得算法可以求得A、B,沿用上述除法得到的和n,其方法如下:
    第一步:令
    第二步:計算
    第三步:如果,停止運算,此時,否則轉第二步
    事實上,只是其中的一個特例。

5.RS(255,223)編解碼算法

  • 5.1字節交織器
    這裏寫圖片描述
    這裏寫圖片描述
  • 5.2 RS(255,223,32)生成方式
    這裏寫圖片描述
    這裏寫圖片描述

Github項目源碼

  • GitHub鏈接: https://github.com/RobinLiew/Reed-Solomon-error-correction
  • 使用例子

    public class RSErrorCorrectionImpl implements IRSErrorCorrection {
    
    
    private RSEncoder encoder=new RSEncoder();
    
    private RSDecoder decoder=new RSDecoder();
    
    public static Boolean isCanBeRecovered=true;
    
    private byte[] temp=new byte[233];
    
    private ByteBuffer buffer=new ByteBuffer() ;
    
    private byte[] enTemp=new byte[255];
    
    public byte[] rs_encode(byte[] data) {
        return encoder.encode(data);
    }
    
    public int rs_decode(byte[] recover, byte[] rsData) {
        byte[] result = null;
        result=decoder.decode(rsData);
    
        if(!isCanBeRecovered){
            return 1;
        }
        System.arraycopy(result, 0, recover, 0, result.length);
        return 0;
    }
    
    public static void main(String[] args){
    
        byte[] src=new byte[223];
        for(int i=0;i<223;i++){
            src[i]=(byte) new Random().nextInt(255);
        }
        byte[] srcdouble=new byte[446];
        for(int i=0;i<2;i++){
            System.arraycopy(src, 0, srcdouble, i*223, 223);
        }
    
        IRSErrorCorrection error = new RSErrorCorrectionImpl();
        byte[] en_data=error.rs_encode(srcdouble);
    
        //Deliberately mistaken the values of several data(故意弄錯幾個數據的值)
        en_data[0]=0;
        en_data[1]=4;
        en_data[3]=0;
        //byte[] recover = new byte[src.length];
        byte[] recover = new byte[srcdouble.length];
        int flag = error.rs_decode(recover,en_data);
    
    
        System.out.println("completion of the test!!!");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章