|
|
1
10
可以用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
您可以使用CRC进行多位纠错。看看维基百科,参考Koopmans的工作,CRC可以检测到它的汉明距离1错误。汉明距离取决于有效载荷长度和使用的CRC多项式。因此,例如,0xBA0DC66B的Koopmans多项式可以检测长达16360位的消息中最多5位的错误。前两条消息中描述的算法可以根据需要扩展到尽可能多的位,但时间随要修复的位的数量呈指数增长。
如果找不到与错误CRC匹配的1位,请查看所有2位、3位,直到您的Hamming_Distance-1。注意,这会变得很慢很快,消息长度平方为2位,立方为3位,五位为5次方。 |
|
|
3
3
我最近研究了CRC16错误检测和单位纠错。 基本思路如下:
明白了吗?我有一篇关于这个的论文。如果你想了解更多,请告诉我。 |