Ste*_*fan 5 c++ error-correction reed-solomon
我目前正在尝试让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
Run Code Online (Sandbox Code Playgroud)
所以我试图得到的是一个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;
Run Code Online (Sandbox Code Playgroud)
然后我在编码消息时收到错误.
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;
}
Run Code Online (Sandbox Code Playgroud)
在Error - Critical encoding failure!随后给出.
我认为我做错了是设置多项式正确 - 也许有人可以帮助我?
dev*_*fan -2
里德-所罗门编码并不意味着与
您的参数一起工作,独立于程序代码。
您可以选择以下内容:
B,即一个数据单元有多少位(例如,对于普通字节数据,B=8)。 Twith 0 <= T < (2^b)/3:T 越大意味着纠错能力越好,但编码速度越慢。 您不能选择:
2^B,仅此而已。 (2^B - 2*T - 1)数据单元(这里是字节),没有别的。 2*T数据单元校验和数据。 2^B -1数据单元。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;
Run Code Online (Sandbox Code Playgroud)
因此,对于每个 233 个明文字节,RS 计算 32 个校验和字节
(= 255 个总字节),以便以后能够纠正最多 16 个错误字节。
在您的代码中,您选择 GF(2^8) 和字节数据,因此 B=8,因此 code_length 128 是错误的。它必须是255。校验和部分长度113太多而且不均匀,并且明文长度不是之前值的差。
...
除此之外,在我在互联网上知道的 6 个 RS 代码中,Shifra 是迄今为止最差的(尽管被称赞为“高度优化”、古怪的代码、有问题的许可证,但速度非常慢……)。选择任何东西,但不能选择 Schfra。
我会检查是否可以分享我写的东西......包括了解算法的内部工作原理,编写所有内容(编码器+解码器)甚至不需要一天,并且在测试机上比Schifra快3倍然后(没有 asm,只有 C++)。缺点是只能处理基于字节的数据,即。B=8,而无法选择其他基地。但也许你根本不需要那个。
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |