我知道使用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位错误。前两条消息中描述的算法可以根据需要将其扩展到尽可能多的位,但是随着要修复的位数的数量,时间呈指数上升。

  1. 计算错误crc = crc_gotten ^ crc_ended。
  2. 浏览所有可能的1位消息(即所有0,A 1和所有0)(有Message_length Case可以评估。请注意,这是位不是字节),错误位是生成错误CRC的消息。
  3. 将检测位倒置以纠正错误。

如果找不到1位与错误CRC匹配的位,请浏览所有2位,3位,直至您的HAMMING_DISTANCE-1。请注意,这是2位的快速,message_length平方的缓慢,可容纳3位,最多可容纳第五位,可容纳5位。

我最近从事CRC16错误检测和单位误差校正。

这是一个基本思想:

  1. 假设您有一个位错误。
  2. 如果数据+CRC不包含错误,则CRC为0,否则不是。
  3. 我们将发送的CRC定义为CRC和CRC收到的CRCR。
  4. 然后错误位由 CRCox = CRCs ^ CRCr.
  5. 结果包括CRC错误和数据错误。
  6. 看看CRCOX与位错误之间的关系。

这很清楚吗?我有一篇论文。如果您想了解更多,请告诉我。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top