




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
_天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名马生琴学号20135680专业 信息与计算科学班级2013级1班实验项目抗干扰信道编码、译码课程名称信息论基础课程代码0665066实验时间2015年12月14日3、4节实验地点7号楼219批改意见成绩教师签字: 实验目的:1、使用编程软件进汉明码码编译器的代码编写、运行、仿真等操作。2、使用编程软件进行卷积码编译器的代码编写、运行、仿真等操作。3、熟练掌握相关软件、语句。4、理解汉明码编译及卷积码编解码器的原理、知识汉明码实验原理:在随机信道中,错码的出现是随机的,且错码之间是统计独立的。例如,由高斯白噪声引起的错码就具有这种性质。因此,当信道中加性干扰主要是这种噪声时,就称这种信道为随机信道。由于信息码元序列是一种随机序列,接收端是无法预知的,也无法识别其中有无错码。为了解决这个问题,可以由发送端的信道编码器在信息码元序列中增加一些监督码元。这些监督码元和信息码元之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。在信息码元序列中加入监督码元就称为差错控制编码,有时也称为纠错编码。不同的编码方法有不同的检错或纠错能力。有的编码就只能检错不能纠错。汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。汉明码是一种多重(复式)奇偶检错系统。它将信息用逻辑形式编码,以便能够检错和纠错。用在汉明码中的全部传输码字是由原来的信息和附加的奇偶监督位组成的。每一个这种奇偶位被编在传输码字的特定比特位置上。推导并使用长度为m位的码字的汉明码,所需步骤如下:1、确定最小的监督位数k,将它们记成D1、D2、Dk,每个监督位符合不同的奇偶测试规定。2、原有信息和k个监督位一起编成长为m+k位的新码字。选择k监督位(0或1)以满足必要的奇偶条件。 3、对所接收的信息作所需的k个奇偶检查。4、如果所有的奇偶检查结果均为正确的,则认为信息无错误。如果发现有一个或多个错了,则错误的位由这些检查的结果来唯一地确定。卷积码实验原理:卷积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。与分组码不同,卷积码编码后的n个码元不仅与当前段的k个信息有关,还与前面的N-1段信息有关,编码过程中互相关联的码元个数为nN。卷积码的纠错性能随N的增加而增大,而差错率随N的增加而指数下降。汉明码程序编写:#include #includeusing namespace std;#define Pe 0.0001class HMCodingprivate: int n,k,r;/汉明码参数 int i,j;/用于指示循环次数 int *H,*X,*G,*check_code; string *H_Column,*H_Column_Z,code_str; int code_num,code_num_z; public: void Initializing(int,int); void Show_H(int,int); void Get_G(); void Show_G(int,int); void HM_Efficiency_Analysing();/*对汉明码进行编码效率分析*/ int Binary_Str_Check(string); void Encoding();/汉明码编码 void Encoding_Z();/增余汉明码编码 void Decoding();/汉明码译码 void Decoding_Z();/增余汉明码译码 void Get_H_Column();/获取汉明码监督矩阵的每一列 void Get_H_Column_Z();/获取增余汉明码监督矩阵的每一列 void Get_Judge_Result();/获取汉明码校码结果 void Get_Judge_Result_Z();/获取增余汉明码校码结果 void Checking();/汉明码校码 void Checking_Z();/增余汉明码校码 void GOTO_HMCding_Z(); HMCoding hmcoding;/全局变量 void HMCoding:Initializing(int _n,int _k) n=_n; k=_k; r=_n-_k; coutttt请给定( n , k)汉明码的监督矩阵Hrn:endl; H=new int *r+1; for(i=0;ir+1;i+) Hi=new intn+1; for(i=0;ir;i+) for(j=0;jHij; /初始化增余项 for(j=0;jn+1;j+) Hrj=1; for(i=0;ir;i+) Hin=0; /为 X 分配存储单元 X=new intn+1; for(j=0;jn+1;j+) Xj=0; Get_H_Column();/获取监督矩阵的每一列 Get_H_Column_Z();/进一步获取增余监督矩阵的每一列 void HMCoding:Get_H_Column() string temp; H_Column=new stringn+1; for(i=0;in;i+) temp=; for(j=0;jr;j+) if(!Hji) temp+=0; else temp+=1; H_Columni=temp; H_Columnn=000; /获取增余监督矩阵的每一列,用于增余汉明码校码 void HMCoding:Get_H_Column_Z() H_Column_Z=new stringn+2; for(i=0;in+1;i+) H_Column_Zi=H_Columni+1; H_Column_Zn+1=0000; void HMCoding:Show_H(int x,int y) for(i=0;ix;i+) for(j=0;jy;j+) coutHij ; coutendl; void HMCoding:Get_G() G=new int *k; for(i=0;ik;i+) Gi=new intn; for(i=0;ik;i+) for(j=0;jk;j+) if(i=j) Gij=1; else Gij=0; for(i=0;ir;i+) for(j=0;jk;j+) Gji+k=Hij; void HMCoding:Show_G(int x,int y) Get_G(); for(i=0;ix;i+) for(j=0;jy;j+) coutGij ; coutendl; void HMCoding:HM_Efficiency_Analysing() coutttt对(n,k)汉明码的评价:endl; cout( n ,k )汉明码的效率E=k/n*100%=k*1.0/n*100%endl; cout( n ,k )汉明码的错误概率 P=n*(n-1)*Pe*Pe=n*(n-1)*Pe*Peendl; /* 编 码 模 块 */ /二进制序列合理性检测 int HMCoding:Binary_Str_Check(string temp) int flag=1;/先假设输入的消息串不含除 0、1 外的字符 for(int i=0;tempi!=0;i+) if(!(tempi=0|tempi=1) flag=0; break; return flag; /汉明码编码 void HMCoding:Encoding() A: string binary_str; int flag; int binary_num=0; cout请输入待编码的二进制序列:binary_str; flag=Binary_Str_Check(binary_str); while(binary_strbinary_num!=0) binary_num+;/*统计输入的二进制序列所含码元个数*/if(binary_num%k!=0&flag)/*序列所含码元个数不是 k 的整数倍,无法全部编码*/ cout您输入的二进制序列存在冗余,请重新输入!n; goto A; if(binary_num%k!=0&!flag) cout您输入的二进制序列存在冗余且含除 0、1 外的字符,请重新 输入!n; goto A; if(binary_num%k=0&!flag) cout您输入的二进制序列含除 0、1 外的字符,请重新输入!n; goto A; code_str=; for(i=0;ibinary_num;i=i+k) for(j=0;jk;j+)/*获取 k 位信息元*/ if(binary_stri+j=0) Xj=0; else Xj=1; int temp; string partial_str=; for(int t=0;tn;t+) /*用 k 位信息元组成的向量与生成矩阵作矩阵乘法,得到对应 n 元 码组*/ temp=0; for(j=0;jk;j+) temp+=Xj*Gjt; if(temp%2=0) partial_str+=0; else partial_str+=1; code_str+=partial_str; coutttt进行(n,k)汉明码编码后的二进制序列为:ncode_strendl; /增余汉明码编码 void HMCoding:Encoding_Z() code_str=;A_Z:string binary_str; int flag; int binary_num=0; cout请输入待编码的二进制序列:binary_str; flag=Binary_Str_Check(binary_str); while(binary_strbinary_num!=0) binary_num+;/*统计输入的二进制序列所含码元个数*/ if(binary_num%k!=0&flag)/*序列所含码元个数不是 k 的整数倍,无法 全部编码*/ cout输入的二进制序列存在冗余,请重新输入!n; goto A_Z; if(binary_num%k!=0&!flag) cout输入的二进制序列存在冗余且含除 0、1 外的字符,请重新 输入!n; goto A_Z; if(binary_num%k=0&!flag) cout输入的二进制序列含除 0、1 外的字符,请重新输入!n; goto A_Z; for(i=0;ibinary_num;i=i+k) for(j=0;jk;j+)/*获取 k 位信息元*/ if(binary_stri+j=0) Xj=0; else Xj=1; int temp; string partial_str=; for(int t=0;tn;t+) /*用 k 位信息元组成的向量与生成矩阵作矩阵乘法,得到对应 n 元 码组*/ temp=0;for(j=0;jk;j+)temp+=Xj*Gjt;if(temp%2=0) partial_str+=0; Xj+k=0; else partial_str+=1; Xj+k=1; /生成增余汉明码最后一位 /监督规则:对原汉明码所有 n 个码元取模 2 和 int sum=0; for(j=0;jn;j+) sum+=Xj; if(sum%2=0) partial_str+=0; else partial_str+=1; code_str+=partial_str; cout进行 (n+1, k) 增余汉明码编码后的二进制序列为: ncode_strendl; /* 校 码 模 块 */ /利用汉明码校码 void HMCoding:Checking() B: string binary_str; int flag; int binary_num=0; cout请输入待译的二进制序列:binary_str; flag=Binary_Str_Check(binary_str); while(binary_strbinary_num!=0) binary_num+; /*统计输入的二进制序列所含码元个数*/ if(binary_num%n!=0&flag) /*序列所含码元个数不是 n 的整数倍,无法 全部译码*/ cout输入的二进制序列存在冗余,请重新输入!n; goto B; if(binary_num%n!=0&!flag) cout输入的二进制序列存在冗余且含除 0、1 外的字符,请重新 输入!n; goto B; if(binary_num%n=0&!flag) cout输入的二进制序列含除 0、1 外的字符,请重新输入!n; goto B; code_num=binary_num/n;/统计 n 元码组的个数 check_code=new int*code_num; for(i=0;icode_num;i+) check_codei=new intn; for(i=0;icode_num;i+) /*每次取 n 个码元进行校正*/ for(j=0;jn;j+) check_codeij=binary_stri*n+j-0; Get_Judge_Result(); /利用增余汉明码校码 void HMCoding:Checking_Z() B_Z:string binary_str; int flag; int binary_num=0; cout请输入待译的二进制序列:binary_str; flag=Binary_Str_Check(binary_str); while(binary_strbinary_num!=0) binary_num+; /*统计输入的二进制序列所含码元个数*/ if(binary_num%(n+1)!=0&flag)/*序列所含码元个数不是 n+1 的整数倍, 无法全部译码*/ cout输入的二进制序列存在冗余,请重新输入!n; goto B_Z; if(binary_num%(n+1)!=0&!flag) cout输入的二进制序列存在冗余且含除 0、1 外的字符,请重新输入!n; goto B_Z; if(binary_num%(n+1)=0&!flag) cout输入的二进制序列含除 0、1 外的字符,请重新输入!n; goto B_Z; code_num_z=binary_num/(n+1);/统计 n+1 元码组的个数 check_code=new int*code_num_z; for(i=0;icode_num_z;i+) check_codei=new intn+2; for(i=0;icode_num_z;i+) /*每次取 n+1 个码元进行校正*/ for(j=0;jn+1;j+) check_codeij=binary_stri*(n+1)+j-0; Get_Judge_Result_Z(); /获取汉明码校码结果 void HMCoding:Get_Judge_Result() int temp; int flag; string partial_str; cout(n,k)汉明码校码结果如下:endl; cout码组 状态 endl; for(int t=0;tcode_num;t+) flag=0; partial_str=; for(i=0;ir;i+) temp=0; for(j=0;jn;j+) temp+=Hij*check_codetj; if(temp%2=0) partial_str+=0; else partial_str+=1; /对 partial_str 进行判断for(i=0;in+1;i+) if(H_Columni=partial_str) flag=1; break; if(flag&in)/表示第 i 个码元出错,将其改正 for(j=0;jn;j+) coutcheck_codetj;cout 第i+1位错,可纠正 ; check_codeti=(check_codeti+1)%2;/1 变 0,0 变 1for(j=0;jn;j+) coutcheck_codetj; if(flag&i=n)/表示全对 for(j=0;jn;j+) coutcheck_codetj;cout 全对 ; for(j=0;jn;j+) coutcheck_codetj; coutendl; /获取增余汉明码校码结果 void HMCoding:Get_Judge_Result_Z() int temp; int flag; string partial_str; cout(n+1,k)增余汉明码校码结果如下(注:* 表示 无法识别的码元) :endl; cout码组 状态 校正后 endl; for(int t=0;tcode_num_z;t+) flag=0; partial_str=; for(i=0;ir+1;i+) temp=0;for(j=0;jn+1;j+) temp+=Hij*check_codetj; if(temp%2=0) partial_str+=0; else partial_str+=1; /对 partial_str 进行判断 for(i=0;in+2;i+) if(H_Column_Zi=partial_str) flag=1; break; if(flag&in+1)/表示第 i 个码元出错,将其改正 check_codetn+1=1;/表示正确接收 for(j=0;jn+1;j+) coutcheck_codetj; cout 第i+1位错,可纠正 ; check_codeti=(check_codeti+1)%2;/1 变 0,0 变 1 for(j=0;jn+1;j+) coutcheck_codetj; if(flag&i=n+1)/表示全对 check_codetn+1=1;/表示正确接收 for(j=0;jn+1;j+) coutcheck_codetj; cout 全对 ; for(j=0;jn+1;j+) coutcheck_codetj; if(!flag) check_codetn+1=0;/表示两位出错并无法纠正 for(j=0;jn+1;j+) coutcheck_codetj; cout 某两位出错,无法纠正 ; for(j=0;jn+1;j+) cout*;/* 表示无法正确识别的码元 coutendl; /* 译 码 模 块 */ /利用汉明码译码 void HMCoding:Decoding() cout(n,k)汉明码译码结果为:endl; for(i=0;icode_num;i+) for(j=0;jk;j+) coutcheck_codeij; coutendl; /利用增余汉明码译码 void HMCoding:Decoding_Z() cout(n+1,k)增余汉明码译码结果为(注:* 表示无 法识别的码元) :endl; for(i=0;icode_num_z;i+) if(check_codein+1=1) for(j=0;jk;j+) coutcheck_codeij; else for(j=0;jk;j+) cout*; coutendl; /* 主 函 数 */ void HMCoding:GOTO_HMCding_Z() char choice1= ; coutn *欢迎进入(n+1,k)增余汉明 码编码/校码/译码系统*n; cout由汉明监督矩阵导出的增余监督矩阵 Hr+1n+1 为:endl; hmcoding.Show_H(r+1,n+1);Z: cout(n+1,k)增余汉明 码编码/校码/译码系统n; cout E.增余汉明码编码 D.增余汉明码校码 /译码 R.返回 Q.退出endl; coutchoice1; if(choice1=E|choice1=e)/进行编码 hmcoding.Encoding_Z(); goto Z; else if(choice1=D|choice1=d) hmcoding.Checking_Z(); hmcoding.Decoding_Z(); goto Z; else if(choice1=R|choice1=r) return; else if(choice1=Q|choice1=q)/退出 exit(0); else/如果选了选项之外的就让用户重新选择 cout您没有输入正确的步骤,请重新输入!endl; goto Z; coutendl; void main() char choice= ; /用于记录初始化情况 int flag=0; int n,k; coutn *汉 明码编码/ 校码/ 译码系统*n; coutn; coutk; while(choice!=Q&choice!=q)/当 choice 的值不为 q 且不为 Q 时循环 C: cout(n,k)汉明 码编码/校码/译码系统n; cout I.输入建立 E.汉明码编码 D.汉明码校码/译码; cout Z.进入增余汉明码系统 Q.退出n; coutchoice; if(choice=I|choice=i)/初始化 if(!flag) /初次执行初始化操作 flag=1; hmcoding.Initializing(n,k); coutttt您输入的监督矩阵 Hn-kn为:endl; hmcoding.Show_H(n-k,n); cout ttt该监督矩阵对应的生成矩阵Gkn 为:endl; hmcoding.Show_G(k,n); hmcoding.HM_Efficiency_Analysing(); else if(choice=E|choice=e)/进行编码 if(!flag) cout ttt操作错误!请先执行输入!endl; goto C; hmcoding.Encoding(); else if(choice=D|choice=d)/校码、译码 if(!flag) coutttt 操作错误!请执行输入!endl;goto C; hmcoding.Checking(); hmcoding.Decoding(); else if(choice=Z|choice=z) if(!flag) coutttt操作错误!请执行输入建立操作后再进行本操作!endl; goto C; /进入增余汉明码系统 hmcoding.GOTO_HMCding_Z(); else if(choice=Q|choice=q)/退出 exit(0); else/如果选了选项之外的就让用户重新选择 coutttt没有输入正确的步骤,请重新输入!endl; goto C; coutendl; 运行结果: 卷积码程序编写:#include #include using namespace std; class JuanjiCode private: int i,j,t; int n0,k0,r0,m; int *h,*H,*g,*G; /实现编码所需变量 int code; string Info_str,Code_str; int total_num,extra_num; public: void Initializing(); void Trans_h_to_H(); void Trans_h_to_g(); void Print_g(); void Trans_g_to_G(); void Print_G(); /编码 void Before_Encoding();/编码前的准备 int Check(string); void Encoding(); ; /*初始化模块*/ void JuanjiCode:Initializing() coutn0; coutk0; coutm; /监督元个数 r0=n0-k0;/动态分配存储单元 h=new int*r0; for(i=0;ir0;i+) hi=new intm*n0; cout请输入(n0,k0,m)卷积码的基本监督矩阵hr0m*n0:endl; for(i=0;ir0;i+) for(j=0;jhij; /检测,输出h cout您输入的基本监督矩阵hr0m*n0如下:nendl; for(i=0;ir0;i+) for(j=0;jm*n0;j+) couthij; if(j+1)%n0=0) cout ; coutendl; coutendl; /动态分配存储单元 H=new int*m*r0; for(i=0;im*r0;i+) Hi=new intm*n0; g=new int*m*k0; for(i=0;im*k0;i+) gi=new intn0; G=new int*m*k0; for(i=0;im*k0;i+) Gi=new intm*n0; /由基本监督矩阵h导出一致监督矩阵H并打印输出 void JuanjiCode:Trans_h_to_H() cout该卷积码对应的一致监督矩阵Hm*r0m*n0如下(未输出部分全为0):nendl; for(t=0;tm;t+) for(i=0;ir0;i+) for(j=0;j(t+1)*n0;j+) Ht*r0+ij=hi(m-t-1)*n0+j; coutHt*r0+ij; if(j+1)%n0=0)cout ; coutendl; coutendl; /由基本监督矩阵h导出基本生成矩阵g并打印输出 void JuanjiCode:Trans_h_to_g() for(t=0;tm;t+) for(i=0;ik0;i+) for(j=0;j=k0) gk0*t+ij=hj-k0t*n0+i; else if(t=m-1&i=j) gk0*t+ij=1; else gk0*t+ij=0; Print_g(); void JuanjiCode:Print_g() cout该卷积码对应的基本生成矩阵gm*k0n0如下:nendl; for(i=0;im*k0;i+) for(j=0;jn0;j+) coutgij; if(i+1)%k0=0) coutendl; coutendl; /由基本生成矩阵g导出一致生成矩阵G并打印输出void JuanjiCode:Trans_g_to_G() for(t=0;tm;t+) for(i=0;im*k0;i+) for(j=0;jn0;j+) if(i(t+1)*k0) Git*n0+j=g(m-(t+1)*k0+ij; else Git*n0+j=0; Print_G(); void JuanjiCode:Print_G() cout该卷积码对应的一致生成矩阵Gm*k0m*n0如下(未输出部分全为0):nendl; for(i=0;im*k0;i+) for(j=0;jm*n0;j+) if(ji/k0*n0) cout ;/为0的块不输出else coutGij; if(j+1)%n0=0) cout ; if(i+1)%k0=0) coutendl; coutendl; /*编码模块*/ /利用一致生成矩阵G及基本生成矩阵g编码void JuanjiCode:Before_Encoding()/编码前的准备 C: int flag; cout请输入待编码的0、1信息序列:Info_str; flag=Check(Info_str); if(!flag) cout您输入的信息序列含除0、1外的其他字符,请重新输入!endl; goto C; else if(total_numm*k0) cout您输入的信息元个数不足,无法进行编码,请重新输入!endl; goto C; else if(total_num%k0!=0) cout您输入的信息序列存在冗余,无法进行编码,请重新输入!endl; goto C; int JuanjiCode:Check(string Info_str) int flag=1; total_num=0; for(i=0;Info_stri!=0;i+) if(!(Info_stri=0|Info_stri=1) flag=0; break; total_num+;/统计输入的0、1的数目 return flag; void JuanjiCode:Encoding() Before_Encoding(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度企业内部审计保密及合规协议
- 二零二五年度居间合同:土地出让项目全程代理与中介顾问协议
- 2025版智能交通系统工程分包合同书
- 二零二五年度带宠物友好二手房东租房合同范本
- 2025版智能建筑系统集成合伙协议书
- 二零二五版离婚不离家双方财产分配与子女监护协议
- 二零二五年EPS构件供应与装配式建筑一体化施工合同
- 二零二五年度出租车司机合同服务内容及标准规范合同
- 2025版精密不锈钢板材进出口贸易合同
- 二零二五版城市交通监控系统建设与维护合同
- 学校德育管理工作
- 2025年观看师德师风警示教育典型案例心得体会
- GB/T 45745-2025道路货物运输车辆装载规范
- 梯子安全培训
- 2025年剑桥商务英语(BEC)初级考试试卷全真模拟试题
- 小学劳动烹饪活动方案
- 呼吸衰竭个案护理
- 教师安全培训会
- 合规财税培训课件
- aeo档案管理制度
- 气道异物梗阻现场急救
评论
0/150
提交评论