【问题标题】:Network Error correction网络纠错
【发布时间】:2015-12-21 07:25:38
【问题描述】:

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

问题是我已经阅读了几个小时关于错误检测和纠正的文章,它最多只谈论纠正 1 位错误!

线性汉明距离表在多于 1 位的纠错上无法正常工作(在性能方面)。

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

【问题讨论】:

    标签: networking encoding network-programming decode encode


    【解决方案1】:

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

    如果您使用 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 编码的容量,它将返回已纠正的错误符号的数量 - 或抛出异常。

    玩得开心!

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2015-11-06
      相关资源
      最近更新 更多