如何使用 CRC 纠正单位错误?

how to correct single bit error with CRC?

如果我们确定我们处于“单一错误”模式,我们如何使用 CRC got 和 CRC expected 来纠正错误?我知道如何检测错误但如何更正?

根据消息中的位数(数据 + crc)和 CRC 多项式,可以纠正单个位错误。为了使其工作,每个位错误都必须产生一个唯一的 CRC。如果有任何重复,它将不起作用,但不同的 CRC 多项式可能会解决问题。

如果位数不是太多,可以用一个table。 table 中的每个条目都将包含一个 CRC 和错误的位索引。 table可以通过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 位消息的最多 3 个错误位(992 个数据,32 个 CRC),但是 table 很大 (1.4 GB):

Link 示例代码:

https://github.com/jeffareid/misc/blob/master/crccor3.c

纠错 BCH 码可用于 992 位数据和 30 个奇偶校验位,用于 3 位纠错。

CRC 不是纠错码,并且没有定位错误所需的一般信息,即使您假设只有一位错误。您甚至不知道错误位是在消息中还是在 CRC 中。 CRC 是一个错误-检测代码。

如果您的消息足够短,则可以通过多种方式找到错误所在。参见

有许多 error-correcting codes you could choose from. Reed-Solomon codes 是常用的,可以根据您的应用选择 nk.