网络纠错

Network Error correction

我需要制作模拟器来模拟发送 4 位数据字,然后将其转换为代码字然后接收它,整个过程中可能会出现噪音和错误。 模拟器至少需要纠正3个错误。

问题是我已经阅读了几个小时有关错误检测和纠正的内容,它最多只谈到纠正 1 位错误!

线性汉明距离表在超过 1 位纠错时效果不佳(性能方面)。

有没有办法做到这一点?我只需要一个指南 谢谢 !

我想您正在寻找前向纠错;在其中预先计算一些 "parity" 数据,将其附加到原始数据,然后在接收时重新生成原始数据(detecting/correcting 错误)并丢弃奇偶校验。

如果您正在使用 C/C++、Javascript 或 Python,则可以使用 https://github.com/pjkundert/ezpwd-reed-solomon。这个库(可在 GPLv3、LGPL 和商业许可下使用)提供了一种简单、非常快速的 Reed-Solomon FEC 编码和解码实现。

它支持从 2 位到 16 位的 "symbol"(数据元素)大小。最大 "codeword"(数据 + 奇偶校验)大小取决于字中的位数。例如,对于 4 位符号,最大码字大小为 15 个符号。因此,每个数据块可能包含 1 到 14 个符号,其余奇偶校验符号(总共 15 个)由 Reed-Solomon 编码器生成以产生 R-S "codeword"。稍后,当接收到符号时,Reed-Solomon 解码器验证 and/or 纠正 "codeword",并丢弃奇偶校验符号。

在 C++ 中,您需要将二进制数据解压缩为 4 位符号(可能只是一个数组或 std::vector 无符号字符,其中每个字符的值从 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<15,9> 实例,并使用其编码方法添加 6 个奇偶校验符号。在您的模拟中将其发送出去。

在您的模拟器添加了一些错误之后,接收 15 个符号块,并且 运行 通过您的 RS<15,9> 编解码器的解码方法接收每个块。它将 return 更正错误符号的数量——或者抛出异常,如果错误负载超过 Reed-Solomon 编码的容量。

玩得开心!