汉明码错误检测

时间:2012-05-22 14:02:10

标签: c algorithm error-detection

我有下面给出的代码,用于使用汉明码进行错误检查。 我在维基百科上查看了算法,并了解其工作方式如线程How does the Hamming code work?

中所述

但下面的代码使用某种奇偶校验位的总和来检测哪个位是错误。

有人可以解释一下总和可以用来检测错误位吗?

代码:

#include<stdio.h>
#include<math.h>
void main()
{
    int i,a[4],c[3],r[7],clk[3],n,sum=0;
    printf("Enter data bits\n");

    for(i=3;i>=0;i--)
        scanf("%d",&a[i]);
    printf("\n");

    c[0]=(a[0]+a[1]+a[2])%2;
    c[1]=(a[1]+a[2]+a[3])%2;
    c[2]=(a[1]+a[0]+a[3])%2;

    printf("data bits after hamming code is\n");

    for(i=3;i>=0;i--)
        printf("%d",a[i]);
    for(i=2;i>=0;i--)
        printf("%d",c[i]);
    printf("Enter recieved code\n");
    for(i=0;i<7;i++)
        scanf("%d",&r[i]);

    clk[0]=(r[3]+r[1]+r[2]+r[6])%2;
    clk[1]=(r[0]+r[2]+r[1]+r[5])%2;
    clk[2]=(r[0]+r[2]+r[3]+r[4])%2;

    sum=4*clk[2]+2*clk[1]+1*clk[0];

    if(sum==0)
        printf("\n u have recived coorrect code\n");
    if(sum==1)
    {   printf("Error in check bit 2\n");
        printf("The correct code is");
        r[6]=(r[6]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==2)
    {
        printf("Error in check bit 1\n");
        printf("The correct code is");
        r[5]=(r[5]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==3)
    {
        printf("\nError in data bit 1");
        printf("The correct code is");
        r[1]=(r[1]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==4)
    {
        printf("\n Error in chect bit 0");
        printf("The correct code is");
        r[4]=(r[4]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==5)
    {
        printf("\n Error in data bits 3");
        printf("The correct code is");
        r[3]=(r[3]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
    if(sum==6)
    {
        printf("Error in data bits 0");
        printf("The correct code");
        r[0]=(r[0]+1)%2;
        for(i=0;i<7;i++);
        printf("%d",r[i]);
    }
    if(sum==7)
    {
        printf("Error in data bits 2");
        printf("The correct code is");
        r[2]=(r[2]+1)%2;
        for(i=0;i<7;i++)
        printf("%d",r[i]);
    }
}

3 个答案:

答案 0 :(得分:4)

这是一种考虑汉明码特别是线性码的替代方法。编码汉明码的一种方法是传递原始数据,然后向其附加校验和。校验和是原始数据的线性函数(用mod 2算法计算)。

当您收到数据时,您可以从中计算校验和,并将其(mod 2)添加到收到的校验和中。如果结果为零,那么两个校验和是相同的,您也可以接受数据。

如果结果不为零,则您具有传输数据的某些线性函数以及损坏它的错误模式。当你添加了两个校验和时,你将原始数据的线性函数和(带有错误模式的原始数据加到mod 2中)的线性函数加在一起。由于这是mod 2的补充,当你添加两个校验和时,原始数据的两个贡献相互抵消,你得到的东西只取决于错误模式,而不是完全取决于编码的数据。这个结果称为综合征(或至少相当于综合症)。

因此,找出错误模式的一种方法是计算每种可能的错误模式(或至少是您关心的错误模式)的综合症,并将它们的综合症存储在表中。对于汉明码,您通常会考虑所有单比特错误模式。这是综合症解码。

因此,当您收到数据时,您将计算综合症(预期和已接收校验和的总和)。如果它为零,一切都很好。如果不是,则在校正表中查找,如果存在,则将生成的错误模式添加到接收的数据中以更正错误。如果不存在,则检测到的不是单比特错误,可能是双比特错误。

详细介绍这一点的一个原因是,如果你知道一些,你可以使用相同的想法(假设你可以创建足够大的表)来纠正更复杂的错误模式,或纠正不同的错误选择单个位错误是不太可能的(所以不要把它们放在表中)但是可能会出现一些双位错误(如果它们有空间,就把它们放在表中)。

对于更强大的错误代码,可纠正错误的数量变得难以管理,您必须使用利用代码结构的更聪明的想法。

答案 1 :(得分:2)

这些位的总和使得每个可能的单比特错误在sum中产生唯一的签名。例如,所有奇数位被加总为位0,因此如果错误位于奇数位,则签名将为奇数。 (好吧,示例程序中的编号方案会混淆这些位,但这就是我实现它的方式以及维基百科文章显示的方式。)

有多个汉明代码,所以请务必阅读Hamming (7,4) code上的维基百科文章。

答案 2 :(得分:0)

通过在代码中添加错误来了解它

  1. 假设我们更改了收到的汉明码中的r[3]位,因此r[3]中的更改会导致2个个体综合症位的变化clk[0]clk[2]然后相应生成的总和为5 (1*1+0*2+1*4)
  2. 同样明智的你可以在任何其他位置放置另一个错误,这样你就会得到另一个和,因此你可以区分和和位。
  3. 如果您想通过此电子邮件向我提出更多问题 Sambhav goel是我的名字,goelsambhav9 @ gmail.com是我的身份。