我目前正在尝试让 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;
然后我在编码时收到一条错误消息。
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!
然后给出。
我认为我做错的是正确设置多项式 - 也许有人可以帮助我?
最佳答案
我是一个尝试使用 Schifra 库的初学者。我对 Reed Solomon 代码一无所知,在深入研究源代码数周后,我发现了一个始终有效的组合。我仍然不知道 RS 代码使用的任何数学。
一些可能有用的行话:
- 符号:RS码所能识别的最小信息量(一般设置为8位(1字节))
- FEC:附加在数据末尾的冗余或纠错“符号”
- 数据:您要为其生成 RS 代码的数据。
- Galois 域:Reed Solomon 代码用来进行纠错的多项式或映射(我不知道 RS 代码背后的任何数学)
在不深入研究数学的情况下,可以从初始化变量中获得一些意义的组合:
- Field descriptor=一个符号的大小(长度一般设置为8位)
- Generator polynomial index= 不知道这是什么,但将其设置为 0 总是有效,并且与其他值相比性能略有提升。
- Generator Polynomial Root Count= 需要等于 FEC 长度
- 代码长度= 这个值必须是 (2^(symbol size or Field Descriptor)-1)。它表示最终编码字符串的符号数(数据符号+错误校正符号)。请注意,以位为单位的编码字符串的总大小等于代码长度*符号大小。
- FEC 长度:纠错符号的数量。
- 数据长度:数据符号的数量。 (在示例中作为 Code_length - FEC_length 启动)不应触及。
应该注意的是,对于特定的符号大小,代码长度是固定的,并且可以改变该代码长度的多少百分比将是数据以及什么将是纠错符号。正如常识所暗示的,纠错符号越多,纠错能力越强。
在运行编码器时,您将 block 对象与数据一起作为参数传递。
在运行方法 encoder.encode 时,“ block ”填充了编码数据(数据 + ECC)。
损坏后,解码完成。 link 中解释了解码器可以纠正的错误、删除的数量。
解码器将 block 和删除列表(如果适用)作为参数,如果删除和错误的数量在 ECC 的范围内(查看链接),则返回原始消息/数据。
关于c++ - schifra 库上的 RS-Code - 如何设置多项式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21401877/