题
我知道使用CRC的全部意图是进行错误检测,但是我听说有人说,除了检测错误检测外,还可以使用基本错误校正。我很好奇是否是这种情况,如果是这样,它有多强大?我的意思是,我们通常将CRC称为能够执行X位检测的能力,但是我很好奇它是否能够执行X-PIT校正。如果是这样,这是如何工作的?谢谢。
解决方案
可以使用CRC进行单位误差校正。假设一个人具有CRC“寄存器”,并且具有一次向前和向后运行CRC算法的功能,忽略了传入的数据
int crc_forward(int old_value, int data_bit) { if (old_value & 0x8000) return ((old_value ^ 0x8000) SHL 1) ^ 0x1021 ^ data_bit; else return (old_value SHL 1) ^ data_bit; } int crc_reverse(int old_value) { if (old_value & 1) return (old_value SHR 1) ^ 0x8810; else return old_value SHR 1; }
假设一个人具有计算的数据包,以便将CRC初始化为某个值并在每个位(MSB首先)运行CRC_FORWARD应该产生零。如果一个人获得零以外的CRC值,则可以反向运行该算法(忽略数据位),直到计算出的CRC值为1。这是错误位的位置。
请注意,此方法可能足以在NAND Flash之类的内容中进行软件误差校正。要使用它进行硬件错误校正,必须能够延迟阅读操作,直到可以处理ECC,否则需要一个“综合征”值和位置位置的表。
其他提示
您可以使用CRC进行多位误差校正。查看Wikipedia,提到Koopmans的工作,CRC可以检测到其Hamming_distance-1错误。锤距取决于有效载荷长度和使用的CRC多项式。因此,例如,0xBA0DC66B的Koopmans多项式可以检测到长达16360位的消息中最多5位错误。前两条消息中描述的算法可以根据需要将其扩展到尽可能多的位,但是随着要修复的位数的数量,时间呈指数上升。
- 计算错误crc = crc_gotten ^ crc_ended。
- 浏览所有可能的1位消息(即所有0,A 1和所有0)(有Message_length Case可以评估。请注意,这是位不是字节),错误位是生成错误CRC的消息。
- 将检测位倒置以纠正错误。
如果找不到1位与错误CRC匹配的位,请浏览所有2位,3位,直至您的HAMMING_DISTANCE-1。请注意,这是2位的快速,message_length平方的缓慢,可容纳3位,最多可容纳第五位,可容纳5位。
我最近从事CRC16错误检测和单位误差校正。
这是一个基本思想:
- 假设您有一个位错误。
- 如果数据+CRC不包含错误,则CRC为0,否则不是。
- 我们将发送的CRC定义为CRC和CRC收到的CRCR。
- 然后错误位由
CRCox = CRCs ^ CRCr
. - 结果包括CRC错误和数据错误。
- 看看CRCOX与位错误之间的关系。
这很清楚吗?我有一篇论文。如果您想了解更多,请告诉我。