实验三 汉明码编码与译码Word格式文档下载.docx
《实验三 汉明码编码与译码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验三 汉明码编码与译码Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
stdlib.h>
time.h>
usingnamespacestd;
voidErr_Pro();
voidHamming_Decode();
intm,n,k,t,err,r,R[100],N[100],COUNT[100],num[100][100],Th[100][100],PT_S[100][100],PT_D[100][100];
intH[100][100],HT[100][100],Ig[100][100],P[100][100],G[100][100],Ibit[100],Cbit[100],Err_Cbit[100],V[100];
/**************************************************************************/
/*函数名:
voidBinary_Conversion(inti)*/
/*功能:
十-二进制转换*/
/*说明:
该函数输出二进制数为低位在前,高位在后*/
voidBinary_Conversion(inti)
{
intj=0,temp=0;
do//生成完整n个二进制
{
temp=i%2;
//判断相应最低位为0或1(若为2的倍数则为0,否则为1)
i=i/2;
//为考虑前一位为0或1做准备
if(j<
m)//m确定二进制的位数
N[j]=temp;
j++;
}
}while(i!
=0);
//等待i等于0(即等待十进制数为0时不进行二进制转换)
}
voidRandom_Array()*/
将数组的列随机排放*/
voidRandom_Array()
srand(unsigned(time(NULL)));
//随机生成条件(抵消rand函数伪随机效果)
cout<
<
endl<
"
产生随机数为:
"
<
endl;
for(intj=0;
j<
n;
j++)
loop:
r=rand()%n;
//随机生成范围为0~n-1的正整数
for(inti=0;
i<
j;
i++)
if(R[i]==r)//如果随机产生的数与已产生的数相等,则重新随机产生数
gotoloop;
R[j]=r;
//产生不重复的随机数
setw(4)<
r+1;
m;
PT_D[i][j]=PT_S[i][r];
//顺序转置系数矩阵->
随机转置系数矩阵
voidCreat_H()*/
创建系统型奇偶校验矩阵H*/
系统型奇偶校验矩阵H由转置负系数矩阵和单位矩阵组成*/
voidCreat_H()
inti,j,count0=0,count1=0,count2=0,count3=0;
/*************生成单位矩阵Ih************///教材P101
for(i=0;
i++)//i表示行j表示列
for(j=0;
if((j>
=k)&
&
(i+k==j))
Ih[i][j]=1;
else
Ih[i][j]=0;
/*********生成转置负系数矩阵PT**********/
i++)//转置二进制转换数组到PT_S
PT_S[i][j]=num[j][i];
//生成顺序转置系数矩阵
Random_Array();
//将数组的列随机排放
if(PT_D[i][j]==0)
count0++;
count1=count0;
//count1记录每一列1的个数
count0=0;
if(count1==(m-1))//将只有一位为1其余位为0的列的所有位置0
PT_D[i][j]=0;
//COUNT数组记录只有一位为1其余位为0的列为0,其余位的值为PT_D列的位置值+1
COUNT[count2]=j+1;
count2++;
for(intq=0;
q<
q++)//将PT_D的至少有两个1的列赋给PT
if(COUNT[q]>
0)
PT[i][count3]=PT_D[i][q];
count3++;
/********生成系统型奇偶校验矩阵H********/
H[i][j]=PT[i][j]+Ih[i][j];
系统型奇偶校验矩阵H为:
i++)//显示系统型奇偶校验矩阵H
setw
(2)<
H[i][j]<
setw
(2);
voidCreat_G()*/
创建系统型生成矩阵G*/
系统型生成矩阵G由单位矩阵和系数矩阵组成*/
voidCreat_G()
inti,j;
/*************生成单位矩阵Ig************/
k;
if(i==j)
Ig[i][j]=1;
Ig[i][j]=0;
/*************生成系数矩阵P*************/
if(j>
k-1)
P[i][j]=PT[j-k][i];
/**********生成系统型生成矩阵G**********/
G[i][j]=P[i][j]+Ig[i][j];
系统型生成矩阵G为:
G[i][j]<
/*******************************主函数*************************************/
intmain()
setw(30)<
汉明码"
请输入校验元位数m="
;
cin>
>
m;
n=pow(2,m)-1;
//码长
k=pow(2,m)-1-m;
//信息源位数
提示:
setw(10)<
您输入的为("
n<
"
k<
)汉明码,可纠正"
t<
个错误"
i++)//将n个转换二进制数组存入二维数组
Binary_Conversion(i+1);
num[i][j]=N[j];
//num[i][m-j-1]=N[j];
//m-j-1意义在于将二进制高位在前,低位在后
n个二进制转换表为:
i++)//输出二进制转换对应表低位在前高位在后
num[i][j]<
setw(4);
Creat_H();
Creat_G();
请输入"
k<
位信息比特流:
Ibit[i];
Cbit[i]+=(Ibit[j]*G[j][i]);
//十进制加法
Cbit[i]=Cbit[i]%2;
//将十进制转换二进制
输出"
n<
位码字比特流:
i++)//输出编码后的码字
setw(3)<
Cbit[i];
Err_Pro();
//错误概率函数
Hamming_Decode();
//汉明译码
return0;
voidErr_Pro()*/
产生错误概率函数*/
voidErr_Pro()
floatp;
请输入错误概率p="
p;
for(intx=0;
x<
x++)
if((float)((rand()%1001)*0.001)<
p)//如果小于概率,则原码0与1互换
err++;
Err_Cbit[x]=(Cbit[x]+1)%2;
Err_Cbit[x]=Cbit[x];
//如果大于错误概率,则赋值原码
位码字比特流(每位等概出错):
for(inty=0;
y<
y++)
Err_Cbit[y];
voidHamming_Decode()*/
汉明译码函数*/
voidHamming_Decode()
inti,j,flag=0,d;
i++)//得到H的转置矩阵HT
HT[i][j]=H[j][i];
输出转置奇偶校验矩阵HT为:
HT[i][j]<
setw(3);
i++)//计算伴随矩阵
V[i]+=Err_Cbit[j]*HT[j][i];
if(V[i]%2==0)//将十进制转换二进制
V[i]=0;
V[i]=1;
输出伴随矩阵为:
V[i]<
if(V[i]==0)//如果伴随矩阵为零矩阵,则直接输出原码流
if(i==m-1)
译码正确!
输出码流为:
Err_Cbit[j]<
flag++;
//如果伴随矩阵为非零矩阵,则标志位自加1
break;
if(flag!
=0)
if(err==1)//伴随矩阵为非零矩阵时执行
{
if(V[j]==HT[i][j])
if(j==(m-1))d=i;
//d记录行
}
else
break;
Err_Cbit[d]=(Err_Cbit[d]+1)%2;
Err_Cbit[i]<
由于本次编码有"
err<
个错误位,大于纠错能力"
,故<
译码错误!
6、程序运行结果