海明编码实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
海明编码实验报告
一.实验目的:
深刻理解海明编码,解码的原理,通过用代码将其实现掌握其中的技术。增强动手解决实际问题的能力以及编程,调试程序的能力。
二.实验原理:
主要思想:
码字位的编号从左到右,最左边的比特是第一位;
数据比特和监督比特融合在一起; 监督位处于2的幂数位位置,其它的位置放置数据比特;
编码后的码串为行向量,用它乘以生成矩阵后,采用奇偶校验方式,得出矩阵方 程并求解该矩阵方程得到对应监督位的比特数值;
待发送的数据比特和比特一起构成了发送编码码字
海明纠错码的格式 码字的编号从左到右,最左边是第一位,其中2的幂数位是检验位,其余是k 个数据位(信息元)。
*---信息元 P---校验位 海明码的编码与译码的方法
其中,lr =1或0(l=0为偶校验,l=1为奇校验),bij = 1 或 0
例: 对数据1100进行编码 ************54433
2211022222p p p p p
)101(111011101001110010100)0111000(=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡ 解: 数据信息为4位,取校验位数量为r=3。 (1)编码长度 n = 2r – 1 = 7 数据位 k = n – r = 4 校验位 r = 3
由矩阵乘法得,p1 = 0 ,p2 = 1, p3 = 1
解得海明码为 0111100(+表示异或运算)
译码过程:
收到海明码串以后,接收方把海明码串作为行向量,乘以相同的样本矩阵,检查约定的奇偶校验方式是否成立。
类似编码过程,进行矩阵方程运算;如果方程运算以后右边的结果与约定的奇偶校验行向量一致,则结果正确;
如果方程运算以后右边的结果与约定的奇偶校验行向量不一致,则表明传输的数据有错,且该结果行向量对应的二进制比特转换为十进制数所对应编号的比特出错,把该比特取反后可得正确的数据。 对例题所得到的海明编码结果0111100进行传输,如果接收到的也是0111100,那么结果无错。
假如接收到的编码系列为0111000,接收方的判断过程为: 首先进行矩阵运算,并检查结果。
矩阵运算的结果行向量为(101)
,不是 ( (000),接收到的码字有错误,错误比特的
位置为5,因此,把0111000码串的第5 个比特取反为
“1”,则结果变为“0111100”, 为正确的码字。
三.实验过程:
根据实验原理即可确定编程思路:令编码长度为7位,其中校验位为3位。⎪⎩
⎪⎨⎧=++++++=++++++=++++++000101000000100001000123p p p )
000(111011101001110010100)1001(321=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡p p p
将矩阵存入全局数组Matrix中,用函数code进行编码(偶校验),数组output 保存编码。随机改变其中一位的值使之取反,然后用函数decode解码得到三位校验位的值,它们表示的二进制数即为出错位。代码如下:
#include
#include
int check_bit(int e,int x);
//指数函数,计算e^x,判断校验位在数组中的位置
void code(int* in,int* output);
//编码函数,将随机输入的4位与3位校验位组合得到7位数组
void decode(int* input,int* check);
//解码函数,判断出错位
int convertmsg(char* a,int *b);
//信息转换函数,将字符串转换为整型数组,返回值是数组元素个数
int Matrix[3][7]={{0,0,0,1,1,1,1},
{0,1,1,0,0,1,1},
{1,0,1,0,1,0,1}};
//全局变量,用于存放运算的矩阵
void main()
{
char a[20];//存放输入的比特
int input[4]={0};//存放转换后的4位比特
int output[7]={0};//存放带校验位的7位比特
int result[3]={0};//存放解码的3位校验位
int i,j,n;//用于判断和循环的变量
i=0;
j=0;
printf("\nPlease input the 4-bit-massage:\n");
/*为提高程序健壮性,输入在循环中进行,只有输入正确才能跳出
循环,执行后面的运算*/
while(j!=4||n!=0)
{
n=0;
scanf("%s",a);
while(a[i])//逐位检测
{
if(a[i]!='0'&&a[i]!='1')
{
n=1;
break;//输入非0,1时出错
}
i++;
}
j=convertmsg(a,input);//把字符串转换为数组并统计位数
if(j!=4||n!=0)//输入不是4位或有非0,1比特时报错
printf("Error input! Please try again!\n");
}
code(input,output);//对输入与校验位进行编码
printf("Now the Hamming code is:\n");
for(i=0;i<7;i++)
printf("%d",output[i]);
randomize();
n=random(7);//产生随机数确定出错位
printf("\nThen assume the error bit is No.%d\n",n+1);
output[n]=output[n]?0:1;//出错位取反
decode(output,result);//对出错后的编码取反
printf("After decoding we know the error bit is ");
for(i=0;i<3;i++)//输出校验位
printf("%d",result[i]);
}
//编码函数
void code(int* in,int* output)
{
int temp[7]={1,1,1,1,1,1,1};//临时数组先全部置1
int i=0,j=0,k=0;//用于循环,判断
for(i=0;i<3;i++)
temp[check_bit(2,i)-1]=0;//确定校验位并置0
for(i=0;i<7;i++)
{
if(temp[i])//把输入的数据存入没有置0的非校验位
{
temp[i]=in[j];
output[i]=in[j];
j++;
}
}
for(i=0;i<3;i++)//将数组与矩阵进行乘法运算计算校验位
{
k=0;
for(j=0;j<7;j++)
{
if(temp[j]&&Matrix[i][j])
k++;
}
if(k%2)//根据偶校验运算规则,若1的个数为偶数则校验位为1 output[check_bit(2,2-i)-1]=1;
}
}