代码之家  ›  专栏  ›  技术社区  ›  naivedeveloper

可以用CRC进行基本的错误修正吗?

  •  11
  • naivedeveloper  · 技术社区  · 16 年前

    我知道使用CRC的全部目的是进行错误检测,但我听到有人说,除了错误检测之外,它还可以用来进行基本的错误纠正。我很好奇这是不是真的,如果是这样,它有多强大?我的意思是,我们通常将CRC称为能够执行X位检测,但我很好奇它是否能够执行X位校正。如果是这样,这是如何工作的?谢谢。

    3 回复  |  直到 11 年前
        1
  •  10
  •   supercat    15 年前

    可以用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闪存之类的软件错误纠正可能是足够的。为了有效地将其用于硬件错误纠正,必须能够延迟读取操作,直到可以处理ECC,否则需要一个“综合征”值和位位置表。

        2
  •  5
  •   ilgitano    11 年前

    您可以使用CRC进行多位纠错。看看维基百科,参考Koopmans的工作,CRC可以检测到它的汉明距离1错误。汉明距离取决于有效载荷长度和使用的CRC多项式。因此,例如,0xBA0DC66B的Koopmans多项式可以检测长达16360位的消息中最多5位的错误。前两条消息中描述的算法可以根据需要扩展到尽可能多的位,但时间随要修复的位的数量呈指数增长。

    1. 计算错误crc=crc_得到^crc_需要。
    2. 查看所有可能的1位消息(即所有0、1和所有0)(需要评估消息长度大小写)。注意,这是位而不是字节),错误位是生成错误CRC的消息。
    3. 反转检测到的位以更正错误。

    如果找不到与错误CRC匹配的1位,请查看所有2位、3位,直到您的Hamming_Distance-1。注意,这会变得很慢很快,消息长度平方为2位,立方为3位,五位为5次方。

        3
  •  3
  •   Jason Sundram Red Alert    14 年前

    我最近研究了CRC16错误检测和单位纠错。

    基本思路如下:

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

    明白了吗?我有一篇关于这个的论文。如果你想了解更多,请告诉我。