使用reed solomon完全恢复数据

时间:2018-05-25 07:04:29

标签: c++ redundancy error-correction reed-solomon

我正在测试来自this repository的Reed Solomon算法,以便在外部更改内容时恢复信息。

假设:

m = bits per symbol
k = data
r = redundance 
n = bits per block = r + k = 2^m - 1
t = error correction = (n - k) / 2

我可以使用以下参数编纂和恢复信息:

m = 8
n = 255
r = 135
k = 120
t = 67

完美无缺,我可以恢复67个错误。

我的意思是:

  • 只有数据会被破坏,没有冗余。
  • 获得完全恢复n = 3 * k - > r = 2 * k。
  • 然后n = 255,因此在这种情况下r应为170。
  • 所以我必须有GF(2 ^ m)和RS [n,k,n - k + 1]才能使用GF(2 ^ 8)和RS [255,85,171]

使用这些参数我得到错误:

Error - Failed to create sequential root generator!

这意味着库函数make_sequential_root_generator_polynomial:

const std::size_t field_descriptor                =   8;    /* m = bit per symbol */
const std::size_t generator_polynomial_index      = 120;
const std::size_t generator_polynomial_root_count = 170;    /* root shall be equal to redundance */
const schifra::galois::field field(field_descriptor,
                                   schifra::galois::primitive_polynomial_size06,
                                   schifra::galois::primitive_polynomial06);
    if (
         !schifra::make_sequential_root_generator_polynomial(field,
                                                             generator_polynomial_index,
                                                             generator_polynomial_root_count,
                                                             generator_polynomial)
       )
    {
       std::cout << "Error - Failed to create sequential root generator!" << std::endl;
       return false;
    }

我的问题是我不知道算法失败的原因。我认为我有一个概念问题,在阅读了有关主题herehere之后的错误,我不明白为什么不可能。

是否可以使用根据假设或理论说这是不可能的?

1 个答案:

答案 0 :(得分:4)

问题中的当前代码失败,因为它设置了

generator_polynomial_index = 120;

和120(索引)+ 170(根计数)是> 255(字段大小),在

中检查
make_sequential_root_generator_polynomial()

generator_polynomial_index通常设置为0(第一个连续的root = 1)或1(第一个连续的root = field primitive = 2),除非目标是使用自互收生成多项式。

即使在自相对多边形的情况下,对于170根,generator_polynomial_index = 128 - (170/2)= 43.将其设置为120非常高。

这可能是有效的,因为根是模数为255的连续幂,所以它们可以环绕,2 ^ 120,2 ^ 121,...,2 ^ 253,2 ^ 254,2 ^ 255 = 2 ^ 0,2 ^ 256 = 2 ^ 1,...,因为这是针对奇数个根的自相倒多项式而​​生成的._polynomial_index =(255 - (根数/ 2)),但也许其余的代码有一个问题。