【问题标题】:Error Correction with Python and Reed Solomon for large inputs使用 Python 和 Reed Solomon 进行大输入的纠错
【发布时间】:2017-01-26 21:34:10
【问题描述】:

我目前正在实施一个消息传递系统。我想向接收者发送一条受错误保护的消息,但我在基础知识方面失败了,即计算纠错码。我使用以下library 进行纠错。
考虑以下 MWE:

from reedsolo import RSCodec

with open("imageToSend.png", "rb") as pic:
  picContent = pic.read()

correctionLength = int((len(picContent)/100)*20)
rs = RSCodec(correctionLength)

rs.encode(picContent)

如您所见,我希望保护图像免受可能发生的 20% 错误的影响。这里的问题?编码的字节数组为空。还有我的问题:是否有可能保护大文件免受错误影响,而无需将它们分成小块然后计算纠错码?

【问题讨论】:

  • 关于选民:这里没有什么太宽泛的地方。
  • 如果您不介意将数据复制/分离成矩阵格式的开销,可以使用两层检测/校正方案。这些行将添加用于错误检测的 CRC 或 RS ECC 字节,并且矩阵将附加 RS ECC 行以纠正由面向行的 CRC/RS ECC 检测到的擦除,每个错误行只需要一个奇偶校验行来纠正。交错可用于处理大量丢失。

标签: python error-correction reed-solomon forwarderrorcorrection


【解决方案1】:

是否可以在不分块的情况下保护大文件免受错误影响 把它们切成小块

取决于代码。使用 bytewise RS,块是必要的(但是这个库可以为你工作)。

如您所见,我希望保护图像免受 20% 的错误影响 发生。这里的问题?

是的。首先,这个数字并不意味着类似于百分比的东西。您应该真正阅读 lib 的示例,并了解一下 RS 的工作原理。
该数字是 255 个字节中应该使用多少个字节进行纠错。例如。 40 表示每 215 字节的数据,会有 40 字节的 RS 码(约占 20%),在这 255 字节中最多可以纠正 20 字节的错误。

最后,您可能想研究一下 LDPC 原理。在纠正错误方面比 RS 差一点,但也差很多,而且它快得多

来自 cmets 的补充:
如果可以纠正取决于错误的位置,是的。如果完整的 255 块消失了,它就无法纠正它。为了使跨度更大,可以使用更高阶的 RS 代码(例如,一个独立的块可能有 65536 字节而不是 255),但是 a)这再次比(已经很慢的)255 慢得多-RS,和b)我知道的RS库不能做到(包括你的)。你必须自己写。

同样,LDPC 可以提供帮助,如果它不打扰您,它是完全不同的事情。例如。它没有明确的值有多少错误需要纠正/检测,这也取决于错误模式。而且由于它比 RS 更新,因此在线代码/库较少,可能没有适合您的情况。

(((嗯,它也很老了,但几十年来没有人对它感兴趣,直到有人意识到它很有用))。

【讨论】:

  • 感谢您的解释-我确实分别有一些背景信息错误或没有得到足够的信息。我还有两个问题,你可能很乐意回答:1)假设,我有一个 1000 字节的文件,我将更正码设置为 40(每个 215 字节的块大约 20%)。然后我将这个更大的消息发送给接收者,但是 20% 的字符在途中发生了变化(“A”切换到“Z”,或“B”切换到“K”或类似的东西)。那么它应该可以恢复吗?
  • 2) 因为当我尝试像“创建一个 100 个字符的随机字符串”这样使用 RSCodec(20) 对其进行编码时(这意味着 20%,对吗?),然后我随机切换 20 个字符(总体长度保持不变),解码功能给我reedsolo.ReedSolomonError: Could not locate error。这很奇怪,对吧?还是我仍然误解它的工作原理?
  • @JJAbrams which would mean 20%, right? 不,这就是我回答的重点。这是 255 字节块中有多少字节来自 RS 代码。传递 20 表示每 235 字节的数据,增加 20 字节的 RS 码,在这 235+20 字节中最多可以纠正 10 字节的错误。这大约是 255 的 4%。如果你真的想纠正最多 20% 的错误,你需要通过 104。
  • 非常感谢您再次解释!这解释了为什么我无法纠正我带入字符串的错误。但是,我有最后一个问题:让我们考虑一下,我有一个 2550 字符的字符串。我对其进行编码(RScodec(104)),生成的字符串为 4318 字节长。从字符串中删除 510 个字符实际上应该是可以恢复的,对吧?因为 104 是每 255 字节块,我只删除 20%。或者是随机删除不可恢复(因为,在最坏的情况下,我几乎可以删除两个完整的 255 字节块)。如果是这样:有什么方法可以用来保护我的字符串吗?
  • 感谢您的输入和编辑您的答案-如果可以的话,我会给您 10 票;)但是,我不在乎我使用什么(我想出了 Reed Solomon,因为它是其中之一第一个谷歌点击,当寻找纠错时)。另外,我不在乎速度/性能。我唯一关心的是,我能够从(字节)字符串中的一定数量的随机错误中恢复。我想最好先用这个主题打开一个关于 SO 的单独问题,然后再在这里过多地向评论部分发送垃圾邮件;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多