是否可以使用CRC进行基本的纠错?

问题描述 投票:14回答:4

我知道使用CRC的全部意图是进行错误检测,但是我听说有人指出,除了错误检测之外,它还可以用于进行基本的错误校正。我很好奇,如果是这样,那么它有多强大?我的意思是,我们通常将CRC称为能够执行x位检测的对象,但是我很好奇它是否能够执行x位检测。如果是这样,这如何运作?谢谢。

crc error-correction
4个回答
12
投票

可以使用CRC进行单比特纠错。假设有一个CRC“寄存器”,并且具有一次一次向前和向后运行CRC算法的功能,而忽略传入数据]

int crc_forward(int old_value,int data_bit){如果(old_value&0x8000)return((old_value ^ 0x8000)SHL 1)^ 0x1021 ^ data_bit;其他返回(old_value SHL 1)^ data_bit;}int crc_reverse(int old_value){如果(old_value&1)返回(old_value SHR 1)^ 0x8810;其他返回old_value SHR 1;}

假设有一个数据包经过计算,因此将crc初始化为某个值并为每个位运行crc_forward(首先是MSB)应产生零。如果一个人的CRC值不为零,则可以反向运行该算法(忽略数据位),直到计算出的CRC值为1。这就是错误位的位置。

请注意,这种方法可能足以解决NAND闪存之类的软件错误。为了将其有效地用于硬件纠错,必须要么能够将读取操作延迟到可以处理ECC之前,要么需要一个“综合症”值和位位置的表。


7
投票

您可以使用CRC进行多位纠错。通过查看Wikipedia(参考koopman的工作),CRC可以检测到其hamming_distance-1错误。汉明距离取决于有效载荷长度以及所使用的CRC多项式。因此,例如0xBA0DC66B的Koopmans多项式可以检测到长达16360位的消息中的多达5位错误。前两条消息中描述的算法可以扩展到所需的任意位数,但是时间随着要修复的位数而呈指数增长。


4
投票

我最近从事CRC16错误检测和单比特错误纠正的工作。


0
投票

最新答案,但CRC32多项式

© www.soinside.com 2019 - 2024. All rights reserved.