schifra库上的RS代码 - 如何设置综合

RS-Code on schifra library - how set up polynommial?

本文关键字:何设置 设置 综合 RS 代码 schifra      更新时间:2023-10-16

我当前正在尝试使Schifra库运行以进行一些测试以稍后在我的代码中实现。

我目前正在查看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

所以我试图拥有的是n,k,d =(128,16,113)

的RS代码

我将继续以下内容:

/* 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; 

i然后在编码mesage时收到错误。

schifra::galois::field_polynomial generator_polynomial(field);
   schifra::sequential_root_generator_polynomial_creator(field,
                                                         generator_polynommial_index,
                                                         generator_polynommial_root_count,
                                                         generator_polynomial);
   /* Instantiate Encoder and Decoder (Codec) */
   schifra::reed_solomon::encoder<code_length,fec_length> encoder(field,generator_polynomial);
   schifra::reed_solomon::decoder<code_length,fec_length> decoder(field,generator_polynommial_index);
   std::string message = "A professional i"; // its 16 bytes
   std::cout << "Original Message:   [" << message << "]" << std::endl;
  message = message + std::string(data_length - message.length(),static_cast<unsigned char>(0x00)); // this one is also done in example
   std::cout << "Original Message:   [" << message << "]" << std::endl;
   std::cout << "Message length: " << message.length() << std::endl; // still 16 bytes
   /* Instantiate RS Block For Codec */
   schifra::reed_solomon::block<code_length,fec_length> block;
   /* Transform message into Reed-Solomon encoded codeword */
   if (!encoder.encode(message,block))
   {
      std::cout << "Error - Critical encoding failure!" << std::endl;
      return 1;
   }

然后给出Error - Critical encoding failure!

我认为我做错了什么是设置polynommial-也许有人可以帮助我?

我是一个初学者,试图使用Schifra图书馆。我对芦苇所罗门代码一无所知,经过数周的挖掘源代码,我发现了一种总是有效的组合。我仍然不知道RS代码使用的任何数学。

一些可能有用的行话:

  • 符号:RS代码将识别的最小量化信息(通常设置为8位(1个字节))
  • fec:是冗余或误差校正"符号",这些符号是在数据末尾附加的
  • 数据:您要生成的RS代码的数据。
  • Galois字段:REED所罗门代码用于进行错误校正的多项式或映射(我不知道RS代码后面有任何数学)

有效的组合并从初始化变量中有意义,而无需深入研究数学:

  • 字段描述符=符号的大小(通常设置为8位长度)
  • 发电机多项式索引=不知道这是什么,但是将其设置为0总是有效的,并且与其他值相比给出了较小的性能提升。
  • 发电机多项式根数=需要等于FEC长度
  • 代码长度=此值必须为(2^(符号大小或字段描述符)-1)。它表示您的最终编码字符串(数据符号 错误corr符号)的符号数。请注意,位的编码字符串的总大小等于代码长度*符号大小。
  • FEC长度:错误校正符号的数量。
  • 数据长度:数据符号的数量。(在示例中以Code_length -fec_length的形式发起)不应触摸。

应该注意的是,对于特定符号大小,代码长度是固定的,并且可以改变代码长度的百分比是数据,什么是错误校正符号。正如常识所建议的那样,更多的错误校正符号会导致更多的错误校正能力。

运行编码器时,您将块对象与数据一起传递。

在运行方法coder.encode时,用编码的数据(数据 ECC)填充了"块"。

腐败后,解码完成。在此链接中解释了错误的误差数量,可以通过解码器校正的擦除

中解释

解码器将块和擦除列表(如果适用)作为参数,并返回原始消息/数据,如果擦除和错误的数量在ECC的范围内(查看链接)。

reed-solomon编码并不是要与
一起使用您的参数,独立于程序代码。

您可以选择以下内容:

  • a B,那就是一个数据单元具有多少(例如,对于正常字节数据,b = 8)。
  • 具有0 <= T < (2^b)/3T:较大的TS表示更好的误差校正,但编码速度较小。
  • 一些不可约的多项式和基本力量,在这里并不重要。

您无法选择:

  • GF/多项式基础是2^B,别无其他。
  • 每个明文块(没有RS校验和数据)必须为
    (2^B - 2*T - 1)数据单元(此处字节),别无其他。
  • 对于每个明文块,RS将进一步计算2*T数据单元校验和数据。
  • 因此,一个具有明文和校验和数据的块一起具有2^B -1数据单元。
    这意味着,以字节为数据单元,这样的块完全具有255个字节,仅此而已。
  • 再次解码时,可以纠正T错误的数据单元
    (错误可能是按照明文和/或校验和零件的,没关系)
  • 可以识别出2*T错误的数据单元,但必须纠正。
  • 除了2*T错误之外,所有赌注都关闭了。

在示例代码(部分)中:

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是迄今为止最糟糕的(尽管被称为"高度最佳",古怪的代码,有问题的许可,但非常慢,...)。选择任何东西,但不是schifra。

我会检查我是否可以分享我写的东西...包括了解算法的内部工作,编写所有内容(Engoder 解码器)甚至没有一天,而且比Schifra快3倍当时测试机器(没有ASM,只有C )。缺点是只能与基于字节的数据一起使用,即。B=8,无法选择其他基础。但是可能无论如何您都不需要。