实验三 汉明码编码与译码Word格式文档下载.docx

上传人:b****6 文档编号:21819807 上传时间:2023-02-01 格式:DOCX 页数:14 大小:68.25KB
下载 相关 举报
实验三 汉明码编码与译码Word格式文档下载.docx_第1页
第1页 / 共14页
实验三 汉明码编码与译码Word格式文档下载.docx_第2页
第2页 / 共14页
实验三 汉明码编码与译码Word格式文档下载.docx_第3页
第3页 / 共14页
实验三 汉明码编码与译码Word格式文档下载.docx_第4页
第4页 / 共14页
实验三 汉明码编码与译码Word格式文档下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

实验三 汉明码编码与译码Word格式文档下载.docx

《实验三 汉明码编码与译码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验三 汉明码编码与译码Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。

实验三 汉明码编码与译码Word格式文档下载.docx

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、程序运行结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1