【问题标题】:Hamming Code Error Detection汉明码错误检测
【发布时间】:2012-05-29 00:56:27
【问题描述】:

我有下面给出的代码,用于使用汉明码进行错误检查。 我浏览了维基百科上的算法,也理解了它在线程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]);
    }
}

【问题讨论】:

  • 避免for(i=3;i&gt;=0;i--) 循环,它们不适用于无符号数,通常用于数组索引。
  • 哦,好吧!但你能告诉我为什么sum 对应于相应的错误位。
  • 今天在我的博客上的练习给出了一个 (7,4) 汉明码的实现,并附有解释:programmingpraxis.com/2012/05/22/hamming-codes
  • 这篇文章没有解释 OP 的要求。

标签: c algorithm error-detection


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 是的,综合症表呈指数增长。即使对于像这样的 3 位代码,使用常规模式也会使回溯过程(综合症解码)更加直观。请参阅 Wikipedia 文章中的插图。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    1. 假设我们更改接收到的汉明码中的r[3] 位,因此r[3] 的更改会导致clk[0]clk[2] 2 个单独的综合征位发生更改,则生成的相应总和为5 (1*1+0*2+1*4)
    2. 同样,您可以在任何其他位位置放置另一个错误,这样您将获得另一个 sum ,因此您可以区分 sum 位和错误位。
    3. 如果您想通过此电子邮件向我询问更多信息 Sambhav goel 是我的名字,goelsambhav9@gmail.com 是我的身份证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多