我想您正在寻找前向纠错;您预先计算一些“奇偶校验”数据,将其附加到原始数据中,然后在接收时重新生成原始数据(检测/纠正错误)并丢弃奇偶校验。
如果您使用 C/C++、Javascript 或 Python,您可以使用https://github.com/pjkundert/ezpwd-reed-solomon。该库(可在 GPLv3、LGPL 和商业许可下使用)提供了一个简单、非常快速的 Reed-Solomon FEC 编码和解码实现。
它支持 2 到 16 位的“符号”(数据元素)大小。最大“码字”(数据 + 奇偶校验)大小取决于字中的位数。例如,对于 4 位符号,最大码字大小为 15 个符号。因此,每个数据块可以是 1 到 14 个符号,其余奇偶校验符号(总共 15 个)由 Reed-Solomon 编码器生成以产生 R-S“码字”。稍后,当接收到符号时,Reed-Solomon 解码器验证和/或纠正“码字”,并丢弃奇偶校验符号。
在 C++ 中,您需要将二进制数据解压缩为 4 位符号(可能只是一个数组或 std::vector 的 unsigned char,其中每个 char 包含一个从 0 到 15 的值)。
然后,决定要纠正多少错误。每个错误符号需要 2 个 Reed-Solomon 奇偶校验符号,因此要纠正 3 个错误,您需要 6 个奇偶校验符号。在您期望看到 3 个错误符号之前,您可以使用您的预期错误率来确定可以组合在一起的最大符号数。
假设您的最大预期错误率为 15%。因此,您可以先收集 20 个符号,然后再预期 3 个坏符号。由于 6 个奇偶校验符号也可能是错误的,因此它们包含在 20 个中。因此,理想情况下,您希望取 14 个数据符号,然后添加 6 个奇偶校验符号,代码字中总共有 20 个符号。
问题是,对于 4 位符号,您的最大 R-S 码字大小为 15。对于 N 位符号,R-S 编解码器的最大码字大小始终为 2^N-1。因此,对于 4 位符号,2^4-1 是 15 - 因此,您将使用 RS(15,...) 编解码器。第二个数字是有效载荷大小——非奇偶校验符号的数量。因此,对于 6 个奇偶校验 - RS(15,9)。因此,您将获得比您需要的更多的错误解决能力,使用 RS(15,9) 编解码器,能够解决每 15 个符号中的 3 个错误。
因此,将您的数据分成 9 个符号块。创建一个 ezpwd::rs::RS 实例,并使用其 encode 方法添加 6 个奇偶校验符号。在你的模拟中发送出去。
在您的模拟器添加一些错误后,接收 15 个符号的块,并通过您的 RS 编解码器的 decode 方法运行每个块。如果错误负载超过 Reed-Solomon 编码的容量,它将返回已纠正的错误符号的数量 - 或抛出异常。
玩得开心!