您好,欢迎访问三七文档
#include"stdio.h"#include"time.h"#include"stdlib.h"#defineA4000#defineM4#defineN7/*****************************************************************************************************************///该函数是初始化函数//作用:随机产生信源,并将信源存放到数组b中,初始化数组e,使它的初值是0//入口参数:bb(信源),ee(陪首集)//出口参数:k1(代表信源个数)/*****************************************************************************************************************/intinit(intbb[A/M][M],intee[A/M][N]){inti=0,j,k1;printf("\n随机产生%d个二元(%d,%d)汉明码的信源:",A/4,N,M);srand((unsigned)time(NULL));for(i=0;i<A/4;i++)for(j=0;j<M;j++){bb[i][j]=rand()%2;}for(i=0;i<A/M;i++)for(j=0;j<N;j++)ee[i][j]=0;k1=A/4;returnk1;}/*****************************************************************************************************************///该函数是输出函数//作用:输出生成矩阵//入口参数:g(生成矩阵)//出口参数:没有/*****************************************************************************************************************/voidprint1(intg[M][N]){inti,j;printf("\n生成矩阵是:\n");for(i=0;i<M;i++){for(j=0;j<N;j++)printf("%d",g[i][j]);printf("\n");}}/*****************************************************************************************************************///该函数是输出函数//输出校验矩阵//入口参数:h(校验矩阵)//出口参数:没有/*****************************************************************************************************************/voidprint2(inth[N-M][N]){inti,j;printf("\n校验矩阵是:\n");for(i=0;i<N-M;i++){for(j=0;j<N;j++)printf("%d",h[i][j]);printf("\n");}}/*****************************************************************************************************************///该函数是求码字函数//作用:求出要传输的的码字//入口参数:n(信源个数),gg(生成矩阵),cc(信源生成的码字),bb(信源)//出口参数:没有/*****************************************************************************************************************/voidSYard(intn,intgg[M][N],intcc[M][N],intbb[A/M][M]){inti,j,k,t;for(i=0;i<n;i++){for(j=0;j<N;j++)//码字cc[][]=信源bb[][]*生成矩阵gg[][],用for循环实现{t=0;for(k=0;k<M;k++)t+=bb[i][k]*gg[k][j];cc[i][j]=t%2;//%2是为了让它们之和小于2}}}/*****************************************************************************************************************///该函数是模拟信道函数//作用:改变要传输的码字,//咐:码字经过该信道后,不产生错误的概率是70%,产生一位错误的概率是21%,两位错误的概率是6%,三位错误的概率是3%//入口参数:n(信源个数),rr(接收到的码字),cc(发送的码字)//出口参数:q(产生一位随机错误的码字个数)/*****************************************************************************************************************/intChannel(intn,intrr[A/M][N],intcc[A/M][N]){inta,i,j,k,a1,a2,a3,q=0;//k代表经过信道后码字会错几位,a1,a2,a3表示具体的错误位置srand((unsigned)time(NULL));for(i=0;i<n;i++){a=rand()%100;//a表示小于100的一个随机数if(a<70)k=0;//该判断语句控制没有产生错误的概率是70%else{if(a<91)k=1;//该判断语句控制产生一位错误的概率是21%,在出错概率中占70%else{if(a<97)k=2;//该判断语句控制产生两位错误的概率是6%,在出错概率中占20%elsek=3;//该判断语句控制产生三位错误的概率是3%,在出错概率中占10%}}switch(k)//该语句判断出现几位错误,并作出相应的处理{case0:for(j=0;j<N;j++)//k=0表示没有产生错误,接收到的码字r跟发送的码字c相等rr[i][j]=cc[i][j];break;case1:a1=rand()%7;//k=1表示产生一位错误,a1是随机产生的一个小于7的数,作为码字的错误位置for(j=0;j<N;j++){if(j==a1)rr[i][j]=(cc[i][j]+1)%2;//(c[i]+1)%2是为了把对应位置上的c[i]值由0变1或者由1变0elserr[i][j]=cc[i][j];}q++;//统计产生一位随机错误的码字break;case2:a1=rand()%7;//k=2表示产生两位错误,a1和a2代表两个不同的错误位置a2=rand()%7;while(a2==a1)//该循环防止a1和a2相等a2=rand()%7;for(j=0;j<N;j++){if(j==a1||j==a2)rr[i][j]=(cc[i][j]+1)%2;//(c[i]+1)%2是为了把对应位置上的c[i]由0变1或者由1变0elserr[i][j]=cc[i][j];}break;case3:a1=rand()%7;//k=3表示产生三位错误a2=rand()%7;while(a2==a1)//a1和a2代表两个不同的错误位置,该循环防止a1和a2相等a2=rand()%7;a3=rand()%7;while(a3==a2||a3==a1)//a1,a2,a3分别代表三个不同的错误位置,该循环防止a1,a2,a3相等a3=rand()%7;for(j=0;j<N;j++){if(j==a1||j==a2||j==a3)rr[i][j]=(cc[i][j]+1)%2;//(c[i]+1)%2是为了把对应位置上的c[i]由0变1或者由1变0elserr[i][j]=cc[i][j];}break;default:printf("error\n");}}returnq;}/*****************************************************************************************************************///该函数是获得错位函数//作用:求出伴随式p和陪首集e//入口参数:hh(校验矩阵),n(信源个数),rr(接收到的码字),ss(伴随式),ee(陪首集)//出口参数:没有/*****************************************************************************************************************/voidErbit(inthh[N-M][N],intn,intrr[A/M][N],intss[A/M][N-M],intee[A/M][N]){inti,j,k,t,k1;for(i=0;i<n;i++){for(j=0;j<N-M;j++){t=0;for(k=0;k<N;k++)t+=rr[i][k]*hh[j][k];//r[i][k]*h[j][h]相当于r*h的转置矩阵ss[i][j]=t%2;}}for(i=0;i<n;i++){for(j=0;j<N;j++){k1=0;//k1是伴随式和校验矩阵某一列是否相等的标志for(k=0;k<N-M;k++)//该循环判断伴随式和校验矩阵的哪一列相等{if(ss[i][k]!=hh[k][j]){k1=1;break;//若不相等则k1=1,若相等则k1=0}}if(k1==0)//k1=0时,e[i][j]对应位置1{ee[i][j]=1;break;}}}}/*****************************************************************************************************************///该函数是求码字函数//作用:求得纠正后的码字t//入口参数:n(信源个数),ee(陪首集),tt(纠正后的码字),rr(接收到的码字)//出口参数:没有/*****************************************************************************************************************/voidTYard(intn,intee[A/M][N],inttt[A/M][N],intrr[A/M][N]){inti,j;for(i=0;i<n;i++){for(j=0;j<N;j++){if(ee[i][j])tt[i][j]=(rr[i][j]+1)%2;elsett[i][j]=rr[i][j];}}}/*********************************************************************
本文标题:汉明码c代码
链接地址:https://www.777doc.com/doc-4241350 .html