2012-05-22 72 views
2

我有这个代码,如下面给出的使用汉明码进行错误检查。 我通过维基百科上的算法去,也可以作为在线程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

避免'for(i = 3; i> = 0; i - )'循环,它们不适用于无符号数字,这通常用于数组索引。 – Potatoswatter

+0

哦,好的!但是请你告诉我为什么'sum'对应于相应的错误位。 – insane

+0

今天在我的博客上的练习给出了一个(7,4)汉明码的实现,解释如下:http://programmingpraxis.com/2012/05/22/hamming-codes/。 – user448810

回答

2

的比特,每个可能的单个位错误产生在sum的唯一签名这样的方式相加。例如,所有的奇数位都加到位0,所以如果错误位于奇数位,则签名将是奇数。 (好吧,示例程序中的编号方案会使比特数翻倍,但这是我实现它的方式以及维基百科文章的显示方式。)

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

4

这里是一种思考汉明码特别是线性码的另一种方法。编码汉明码的一种方法是将原始数据传递过来,然后将校验和附加到它上面。校验和是原始数据的线性函数(用mod 2算术计算)。

当您收到数据时,您可以根据它计算校验和并将它添加到接收的校验和mod 2中。如果结果为零,那么两个校验和是相同的,你可能会接受这些数据。

如果结果不为零,则您有一些线性函数的传输数据和损坏它的错误模式。当您添加两个校验和时,您将原始数据的线性函数和线性函数(原始数据与添加到模型2中的错误模式)相加在一起。由于这是mod 2的补充,所以当你添加两个校验和时,原始数据的两个贡献相互抵消,并且你最终得到的只依赖于错误模式,而根本不依赖于编码的数据。这个结果被称为综合征(或者至少相当于综合征)。

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

所以,当你收到数据时,你计算出综合征(预期和接收校验和的总和)。如果它是零,一切都很好。如果不是,则在综合症状表中查找它,如果它在那里,则将产生的错误模式添加到接收到的数据中以纠正错误。如果它不在那里,你已经检测到了一个单比特错误以外的东西,可能是一个双比特错误。

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

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

+0

是的,综合症状表呈指数增长。即使对于这样的3位代码,使用规则模式也会使回溯过程(症候解码)更直观。请参阅维基百科文章中的插图。 – Potatoswatter

0

看到把错误代码理解

  1. 我们换在接收汉明码的r[3]位,所以在r[3]结果的变化而变化,在2 inidividual综合征位是clk[0]clk[2]那么相应的产生的总和是5 (1*1+0*2+1*4)
  2. 与明智一样,你可以在任何其他位的位置发生另一个错误,所以你将得到另一个总和,因此你可以区分和位和错误位。
  3. 如果你想问这个电子邮件我更多 Sambhav goel是我的名字,[email protected]是我的ID。