2

我有下面给出的代码,用于使用汉明码进行错误检查。我浏览了 Wikipedia 上的算法,并且还了解了它的工作原理,如汉明代码如何工作?

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

有人可以解释一下如何准确地使用总和来检测错误位吗?

代码:

#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]);
    }
}
4

3 回答 3

4

这是考虑特别是汉明码和一般线性码的另一种方法。对汉明码进行编码的一种方法是传递原始数据,然后对其附加校验和。该校验和是原始数据的线性函数(使用 mod 2 算术计算)。

当您收到数据时,您可以从中计算校验和,并将其以 mod 2 形式添加到收到的校验和中。如果结果为零,则两个校验和相同,您不妨接受数据。

如果结果不为零,则您对传输的数据和破坏它的错误模式有一些线性函数。当您添加两个校验和时,您将原始数据的线性函数和(带有添加到其中的错误模式的原始数据 mod 2)的线性函数添加在一起。由于这是 mod 2 添加,当您添加两个校验和时,来自原始数据的两个贡献相互抵消,您最终得到的结果仅取决于错误模式,而不取决于编码的数据。这个结果被称为综合症(或至少等同于综合症)。

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

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

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

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

于 2012-05-22T18:53:06.313 回答
2

这些位以这样一种方式相加,即每个可能的单位错误都会在sum. 例如,所有奇数位相加为位零,因此如果错误位于奇数位,则签名将为奇数。(好吧,示例程序中的编号方案混淆了位,但这是我实现它的方式以及 Wikipedia 文章显示的方式。)

汉明码不止一个,因此请务必阅读有关汉明码 (7,4)的维基百科文章。

于 2012-05-22T14:25:41.790 回答
0

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

  1. 假设我们更改r[3]接收到的汉明码中的位,因此更改会r[3]导致 2 个单独的综合征位发生变化,clk[0]然后clk[2]生成的相应总和是5 (1*1+0*2+1*4)
  2. 同样明智的是,您可以在任何其他位位置放置另一个错误,因此您将获得另一个 sum ,因此您可以区分 sum 位和错误位。
  3. 如果您想在这封电子邮件中询问更多信息,我 Sambhav goel 是我的名字,goelsambhav9@gmail.com 是我的 ID。
于 2017-04-23T20:21:36.220 回答