2014-01-28 28 views
5

我目前正在試圖讓schifra庫運行一些測試來稍後在我的代碼中實現它。schifra庫上的RS代碼 - 如何設置polynommial?

我目前正在查看schifra_reed_solomon_example02.cpp,並嘗試瞭解如何設置值以滿足我的需要。

/* Finite Field Parameters */ 
    const std::size_t field_descriptor     = 8; // GF(2^8) ok 
    const std::size_t generator_polynommial_index  = 120; // what is this? 
    const std::size_t generator_polynommial_root_count = 32; // polynomial up to x^32 

    /* Reed Solomon Code Parameters */ 
    const std::size_t code_length = 255; // amount of symbols in codeword 
    const std::size_t fec_length = 32; // minimal distance d ? 
    const std::size_t data_length = code_length - fec_length; // amount of symbols my message has 

因此,我嘗試已經是一個RS-代碼N,K,d =(128,16,113)

我將進行以下操作:

/* Finite Field Parameters */ 
    const std::size_t field_descriptor     = 8; // I want GF(2^8) 
    const std::size_t generator_polynommial_index  = 120; // still not knowing 
    const std::size_t generator_polynommial_root_count = 16; // because polynomial up to 16 

    /* Reed Solomon Code Parameters */ 
    const std::size_t code_length = 128; // 128 byte codewords 
    const std::size_t fec_length = 113; // minimal distance, 113 because d = n - k +1 
    const std::size_t data_length = 16; 

然後我在編碼時收到錯誤消息。然後給出Error - Critical encoding failure!

我認爲我做錯了是建立多項式正確 - 也許有人可以幫助我?

回答

-2

裏德所羅門編碼並不意味着與您的參數
無關的程序代碼。

可以選擇以下東西:

  • B,即一個數據單元有多少位具有(例如,用於常規的字節數據B = 8)。
  • A T0 <= T < (2^b)/3:較大的Ts意味着更好的糾錯,但編碼速度較慢。
  • 一些不可約多項式和基本能力,在這裏不重要。

你不能選擇:

  • GF /多項式基地2^B,沒有別的。每個明文塊(沒有RS校驗和數據)必須是
    (2^B - 2*T - 1)數據單元(這裏是字節),沒有別的。
  • 對於每個純文本塊,RS將額外計算2*T數據單元校驗和數據。
  • 因此,具有明文和校驗和數據的塊一起具有2^B -1數據單元。
    這意味着,以字節爲數據單位,這樣的塊具有正好255個字節,沒有別的。
  • 當再次解碼,多達T錯誤的數據單元可以被糾正
    (該錯誤可能是純文本的和/或校驗部分,無所謂)
  • 最多2*T錯誤的數據單元可被識別,但一定要糾正。
  • 如果有超過2*T的錯誤,所有投注均爲off。

在該示例代碼(部分地):

const std::size_t field_descriptor = 8; 
const std::size_t code_length = 255; 
const std::size_t fec_length = 32; 
const std::size_t data_length = code_length - fec_length; 
  • field_descriptor是B.
  • code_length是一個完整的塊長度(明文+校驗和)。
  • fec_length是校驗和長度。
  • data_length是明文塊長度。

所以對於每個233字節的明文,RS計算32校驗和字節
(= 255總字節),以便在將來糾正多達16個錯誤字節。

在您的代碼中,您選擇GF(2^8)和字節數據,所以B = 8,因此code_length 128是錯誤的。它必須是255.校驗和部分長度113太多而不是偶數,並且明文長度不是以前值的差異。
...

除此之外,我知道在互聯網上6個RS碼,Shifra是迄今爲止最糟糕的(很慢,儘管被稱讚爲「非常optimzed」,離奇的代碼,有問題的許可,... )。選擇任何東西,但不是Schifra。

我會檢查我是否可以分享我寫的內容......包括學習算法的內部工作原理,編寫所有內容(編碼器+解碼器)甚至不需要花費一天時間,而且比Schifra快3倍當時的測試機器(沒有asm,只是C++)。缺點是隻能使用基於字節的數據,即。 B=8,無法選擇其他基地。但是可能你不需要那個。