我需要在短消息(100到200位之间)上使用纠错技术。可用于添加冗余位的空间限制为20-50%。
我将不得不在C / C ++中实现编码和解码。所以它需要是开源的或足够容易编程。 (我以前在解码算法方面有过一些经验 - 它们很糟糕!)
任何人都可以建议使用合适的错误代码(使用相关参数)吗?
答案 0 :(得分:9)
看看Reed Solomon纠错。
C ++中的示例实现可用here。
对于其他选项,请查看here - 请参阅第11项
编辑:如果你想要一个商业图书馆 - http://www.schifra.com/faq.html
答案 1 :(得分:1)
Reed-Solomon编码器以RS(CAPACITY,PAYLOAD)的形式描述。容量始终为2 ^ SYMBOL-1,其中SYMBOL是每个Reed-Solomon符号中的位数。通常,此SYMBOL大小为8位(正常字节)。它通常可以是3到16位。对于8位符号,Reed-Solomon编码器将命名为RS(255,PAYLOAD)。
PAYLOAD是非奇偶校验符号的数量。如果需要4个奇偶校验符号,则应指定RS(255,251)。
要有效地纠正数据块中的错误,必须先将数据打包为符号(位组,通常只是8位字节)。您的目标是尝试安排(如果可能)将任何错误聚集到尽可能少的符号中。
例如,如果平均每8位发生一次错误,则8位符号将不合适;几乎每个符号都会出错!您可以使用4位符号并使用RS(15,11)编解码器 - 一次最多11个4位符号,每个块产生4个奇偶校验符号。符号大小越小,CAPACITY越低(例如,对于SYMBOL大小为4位,2 ^ 4-1 == 15符号CAPACITY)。
但通常情况下,您会使用8位符号。如果你有一个更现实的错误率,例如,10%的8位符号是错误的,那么你可以使用RS(255,205) - 每255个符号Reed-Solomon“代码字”50个奇偶校验符号,最大值PAYLOAD的205字节。这为我们提供了~25%的奇偶校验,允许我们纠正包含高达~12.5%错误的代码字。
使用https://github.com/pjkundert/ezpwd-reed-solomon的c ++ / ezpwd / rs Reed-Solomon API,您可以将其指定为:
#include <ezpwd/rs>
...
ezpwd::RS<255,205> rscodec;
将您的数据放入std :: string(它可以处理原始的8位二进制数据)或std :: vector并调用API,添加50个奇偶校验符号:
std::string data;
// ... fill data with a fixed size block, up to 205 bytes
rscodec.encode( data );
发送数据,稍后,在收到数据+奇偶校验后,恢复原始数据(并丢弃50个奇偶校验符号):
int corrected = rscodec.decode( data );
如果数据可以恢复,则返回更正的符号数,如果Reed-Solomon代码字包含太多错误,则返回-1。
享受!