我有下面给出的代码,用于使用汉明码进行错误检查。 我在维基百科上查看了算法,并了解其工作方式如线程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]);
}
}
答案 0 :(得分:4)
这是一种考虑汉明码特别是线性码的替代方法。编码汉明码的一种方法是传递原始数据,然后向其附加校验和。校验和是原始数据的线性函数(用mod 2算法计算)。
当您收到数据时,您可以从中计算校验和,并将其(mod 2)添加到收到的校验和中。如果结果为零,那么两个校验和是相同的,您也可以接受数据。
如果结果不为零,则您具有传输数据的某些线性函数以及损坏它的错误模式。当你添加了两个校验和时,你将原始数据的线性函数和(带有错误模式的原始数据加到mod 2中)的线性函数加在一起。由于这是mod 2的补充,当你添加两个校验和时,原始数据的两个贡献相互抵消,你得到的东西只取决于错误模式,而不是完全取决于编码的数据。这个结果称为综合征(或至少相当于综合症)。
因此,找出错误模式的一种方法是计算每种可能的错误模式(或至少是您关心的错误模式)的综合症,并将它们的综合症存储在表中。对于汉明码,您通常会考虑所有单比特错误模式。这是综合症解码。
因此,当您收到数据时,您将计算综合症(预期和已接收校验和的总和)。如果它为零,一切都很好。如果不是,则在校正表中查找,如果存在,则将生成的错误模式添加到接收的数据中以更正错误。如果不存在,则检测到的不是单比特错误,可能是双比特错误。
详细介绍这一点的一个原因是,如果你知道一些,你可以使用相同的想法(假设你可以创建足够大的表)来纠正更复杂的错误模式,或纠正不同的错误选择单个位错误是不太可能的(所以不要把它们放在表中)但是可能会出现一些双位错误(如果它们有空间,就把它们放在表中)。
对于更强大的错误代码,可纠正错误的数量变得难以管理,您必须使用利用代码结构的更聪明的想法。
答案 1 :(得分:2)
这些位的总和使得每个可能的单比特错误在sum
中产生唯一的签名。例如,所有奇数位被加总为位0,因此如果错误位于奇数位,则签名将为奇数。 (好吧,示例程序中的编号方案会混淆这些位,但这就是我实现它的方式以及维基百科文章显示的方式。)
有多个汉明代码,所以请务必阅读Hamming (7,4) code上的维基百科文章。
答案 2 :(得分:0)
通过在代码中添加错误来了解它
r[3]
位,因此r[3]
中的更改会导致2个个体综合症位的变化clk[0]
和clk[2]
然后相应生成的总和为5 (1*1+0*2+1*4)
。