如何解决如何用CRC纠正单位错误?
如果我们确定我们处于“单一错误”模式,我们如何使用获得的 CRC 和预期的 CRC 来纠正该错误?我知道如何检测错误但如何纠正?
解决方法
根据消息中的位数(数据 + crc)和 CRC 多项式,可以纠正单个位错误。为了使其工作,每个单比特错误都必须产生唯一的 CRC。如果有任何重复项,它将不起作用,但不同的 CRC 多项式可能会解决问题。
如果位数不是太大,可以使用表格。表中的每个条目都包含一个 CRC 和错误的位索引。该表可以通过 CRC 进行排序,以便可以使用二进制搜索。
另一种选择是计算 CRC,然后反向循环 CRC,直到只有最低有效位为 1,其余为 0。这可以扩展为处理单突发校正,反向循环 CRC 直到超过一半最高有效位为 0,具体取决于 CRC 和消息长度。
http://www2.hawaii.edu/~tmandel/papers/CRCBurst.pdf
CRCBurst.pdf 的算法类似于反向循环 CRC,除了它要求最低有效位为 1,这对于消息开头的短突发是一个问题,但如果使用反向循环,CRC 可以向后循环直到最低有效位为 1,并且忽略与消息之前的位对应的 CRC 的前导位。
有一个 32 位的 CRC,可以为 1024 位(992 个数据,32 个 CRC)的消息纠正最多 3 个错误位,但表格很大(1.4 GB):
https://stackoverflow.com/a/62201417/3282056
链接到示例代码:
https://github.com/jeffareid/misc/blob/master/crccor3.c
一个纠错 BCH 码可用于 992 位数据,30 个奇偶校验位用于 3 个纠错位。
,CRC 不是纠错码,并且不具有定位错误所需的一般信息,即使您假设只有一位错误。您甚至不知道错误位是在消息中还是在 CRC 中。 CRC 是一种错误检测代码。
如果您有足够短的消息,可以通过多种方法来定位错误所在。见https://stackoverflow.com/a/6169837/1180620
您可以选择多种error-correcting codes。 Reed-Solomon codes 是常用的,可以通过选择 n 和 k 来调整到您的应用程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。