实验七信道编码仿真实现班级:08电子信息工程二班实验人:马华臣一、实验目的理解信道编码的思想,掌握信道编码的编程实现原理及技术。
二、实验内容1.随机产生二进制信源消息序列。
产生随机数的方法与前面类似,利用srand( (unsigned)time( NULL ) )和rand()函数模拟产生随机数。
2.利用信道编码方法进行编译码。
信道的编译码分三部分,即编码部分,信道模拟部分,译码部分。
编码部分采用汉明编码。
模拟信道,采用rand()函数随机确定产生差错的位置。
译码部分,采用标准阵列表直接全表查找的方法译码。
本程序实现的是对汉明(5,2)码的编码与译码(课本P362-363)。
生成矩阵为: G= 1 0 1 1 10 1 1 0 1三、程序//汉//汉明(5,2)码的编码与标准阵列译码////////////////////////////////#include "stdio.h"#include "math.h"#include"stdlib.h"#include "time.h"void main(){ int aa[10000];int i;int N;////////////////////////int b[4][7]={{1,0,1,1,1},{0,1,1,0,1}};//定义生成矩阵int y=0,s=0;int j,k,m,n;int a[4],q[7],rr[10000/2*5];//////////////////////////int p,u,D=0;int cc[2500],dd[2500],ee[2500];int e[7][5]={{1,0,0,0,0},{0,1,0,0,0},{0,0,1,0,0},{0,0,0,1,0},{0,0,0,0,1},{1,0,1,0,0},{1,0,0,0,1}};//定义错误图样int w[10000/2*5];int ww[10000/2];printf("汉明(5,2)码的编码与标准阵列译码:\n");printf("请输入你想产生的二进制个数(至少四个但不超过1万):");scanf("%d",&N); //输入想产生的信源的个数while(N<4){printf("输入无效,请重新输入");printf("请输入你想产生的二进制个数(至少四个):");scanf("%d",&N);}printf("随机产生的二进制序列为:\n");srand( (unsigned)time( NULL ) ); //产生一个随机序列,并把它放入a[]中for(i=0;i<N;i++){aa[i]=rand()%2;printf("%d",aa[i]);}printf("\n");////////////////////////////////////////////////printf("编码后变为:\n");//编码生成码字for(m=0;m<N/2;m++){for(i=y;i<(y+2);i++){a[i-y]=aa[i];} ////取出4位出来for (j=0;j<5;j++){q[j]=0;for(k=0;k<2;k++)q[j]+=a[k]*b[k][j];/////与生成矩阵相乘}for(i=s;i<(s+5);i++){rr[i]=0;rr[i]=q[i-s]%2;printf("%d",rr[i]);////将生成的放入rr[]中}y=y+2;////向后移动4位s=s+5;///向后移动7位printf("\t");}////////////////////////////////////printf("经过信道后变为:\n");//模拟信道差错srand( (unsigned)time( NULL ) );for(j=0;j<N/2;j++){cc[j]=rand()%100;////产生一个0~99的随机数if(cc[j]<9)////当随机数小于9时,一个码字产生2个错误{for(i=D;i<(D+5);i++){ee[j]=rand()%2;///随机产生一个0~1的数,以确定是码字二个错误的位置u=ee[j];w[i]=0;w[i]=(rr[i]+e[5+u][i-D])%2;printf("%d",w[i]);}}else if((cc[j]>=9)&&(cc[j]<=30))///当随机数在9~30时,一个码字产生一个错误{dd[j]=rand()%5;p=dd[j]; ///随机产生一个0~4的数,以确定是码字一个错误的位置for(i=D;i<(D+5);i++){w[i]=0;w[i]=(rr[i]+e[p][i-D])%2;printf("%d",w[i]);}}else //////当随机数在30~99时,不发生错误{for(i=D;i<(D+5);i++){w[i]=0;w[i]=rr[i];printf("%d",w[i]);}}D=D+5;////向后移动7位if(cc[j]<9) printf(" 两位错");else if(cc[j]>=9&&cc[j]<=30) printf(" 一位错");else printf(" ");/////进行跟踪,以确定码字错几位printf("\t");}////////////////////////////printf("经过译码后变为: \n");//采用标准阵列译码表进行译码for(i=0,j=0;i<N/2*5;i+=5,j++){ //标准阵列译码表if( (w[i]==0&&w[i+1]==0&&w[i+2]==0&&w[i+3]==0&&w[i+4]==0)||(w[i]==1&&w[i+1]==0&&w[i+2]==0&&w[i+3]==0&&w[i+4]==0)||(w[i]==0&&w[i+1]==1&&w[i+2]==0&&w[i+3]==0&&w[i+4]==0)||(w[i]==0&&w[i+1]==0&&w[i+2]==1&&w[i+3]==0&&w[i+4]==0)||(w[i]==0&&w[i+1]==0&&w[i+2]==0&&w[i+3]==1&&w[i+4]==0)||(w[i]==0&&w[i+1]==0&&w[i+2]==0&&w[i+3]==0&&w[i+4]==1)||(w[i]==1&&w[i+1]==0&&w[i+2]==1&&w[i+3]==0&&w[i+4]==0)||(w[i]==1&&w[i+1]==0&&w[i+2]==0&&w[i+3]==0&&w[i+4]==1)) printf("00000"); else if( (w[i]==1&&w[i+1]==0&&w[i+2]==1&&w[i+3]==1&&w[i+4]==1)||(w[i]==0&&w[i+1]==0&&w[i+2]==1&&w[i+3]==1&&w[i+4]==1)||(w[i]==1&&w[i+1]==1&&w[i+2]==1&&w[i+3]==1&&w[i+4]==1)||(w[i]==1&&w[i+1]==0&&w[i+2]==0&&w[i+3]==1&&w[i+4]==1)||(w[i]==1&&w[i+1]==0&&w[i+2]==1&&w[i+3]==0&&w[i+4]==1)||(w[i]==1&&w[i+1]==0&&w[i+2]==1&&w[i+3]==1&&w[i+4]==0)||(w[i]==0&&w[i+1]==0&&w[i+2]==0&&w[i+3]==1&&w[i+4]==1)||(w[i]==0&&w[i+1]==0&&w[i+2]==1&&w[i+3]==1&&w[i+4]==0)) printf("10111"); else if( (w[i]==0&&w[i+1]==1&&w[i+2]==1&&w[i+3]==0&&w[i+4]==1)||(w[i]==1&&w[i+1]==1&&w[i+2]==1&&w[i+3]==0&&w[i+4]==1)||(w[i]==0&&w[i+1]==0&&w[i+2]==1&&w[i+3]==0&&w[i+4]==1)||(w[i]==0&&w[i+1]==1&&w[i+2]==0&&w[i+3]==0&&w[i+4]==1)||(w[i]==0&&w[i+1]==1&&w[i+2]==1&&w[i+3]==1&&w[i+4]==1)||(w[i]==0&&w[i+1]==1&&w[i+2]==1&&w[i+3]==0&&w[i+4]==0)||(w[i]==1&&w[i+1]==1&&w[i+2]==0&&w[i+3]==0&&w[i+4]==1)||(w[i]==1&&w[i+1]==1&&w[i+2]==1&&w[i+3]==0&&w[i+4]==0)) printf("01101"); else if( (w[i]==1&&w[i+1]==1&&w[i+2]==0&&w[i+3]==1&&w[i+4]==0)||(w[i]==0&&w[i+1]==1&&w[i+2]==0&&w[i+3]==1&&w[i+4]==0)||(w[i]==1&&w[i+1]==0&&w[i+2]==0&&w[i+3]==1&&w[i+4]==0)||(w[i]==1&&w[i+1]==1&&w[i+2]==1&&w[i+3]==1&&w[i+4]==0)||(w[i]==1&&w[i+1]==1&&w[i+2]==0&&w[i+3]==0&&w[i+4]==0)||(w[i]==1&&w[i+1]==1&&w[i+2]==0&&w[i+3]==1&&w[i+4]==1)||(w[i]==0&&w[i+1]==1&&w[i+2]==1&&w[i+3]==1&&w[i+4]==0)||(w[i]==0&&w[i+1]==1&&w[i+2]==0&&w[i+3]==1&&w[i+4]==1)) printf("11010");elsefor(n=0;n<5;n++){printf("%d",w[i+n]);}printf("\t");}getchar();getchar();//定住显示窗口}四、实验结果五、实验分析此(5,2)码能纠正所有1为随机错误,以及2个发生二位错误的随机错误。