1、这些监督码元和信息码元之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。在信息码元序列中加入监督码元就称为差错控制编码,有时也称为纠错编码。不同的编码方法有不同的检错或纠错能力。有的编码就只能检错不能纠错。汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。汉明码是一种多重(复式)奇偶检错系统。它将信息用逻辑形式编码,以便能够检错和纠错。用在汉明码中的全部传输码字是由原来的信息和附加的奇偶监督位组成的。每一个这种奇偶位被编在传输码字的特定比特位置上。推导并使用长度为m位的码字的汉明码,所需步骤如下:1、确定最小的监督位数k,将它们记成D1、D2、Dk,每个监
2、督位符合不同的奇偶测试规定。2、原有信息和k个监督位一起编成长为m+k位的新码字。选择k监督位(0或1)以满足必要的奇偶条件。3、对所接收的信息作所需的k个奇偶检查。4、如果所有的奇偶检查结果均为正确的,则认为信息无错误。如果发现有一个或多个错了,则错误的位由这些检查的结果来唯一地确定。卷积码实验原理:卷积码将k个信息比特编成n个比特,但k和n通常很小,特别适合以串行形式进行传输,时延小。与分组码不同,卷积码编码后的n个码元不仅与当前段的k个信息有关,还与前面的N-1段信息有关,编码过程中互相关联的码元个数为nN。卷积码的纠错性能随N的增加而增大,而差错率随N的增加而指数下降。汉明码程序编写:
3、#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
4、 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_Re
5、sult_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)汉明码的监督矩阵Hr:endl; H=new int *r+1; for(i=0;ir+1;i+) Hi=new intn+1;r; for(j=0;jHij; /初始化增余项n+1;j+) Hrj=
6、1;i+) Hin=0; /为 X 分配存储单元 X=new intn+1; Xj=0; Get_H_Column();/获取监督矩阵的每一列 Get_H_Column_Z();/进一步获取增余监督矩阵的每一列 Get_H_Column() string temp; H_Column=new stringn+1; temp=; if(!Hji) temp+=0 else temp+=1 H_Columni=temp; H_Columnn=000 /获取增余监督矩阵的每一列,用于增余汉明码校码Get_H_Column_Z() H_Column_Z=new stringn+2; H_Column_
7、Zi=H_Columni+ H_Column_Zn+1=0000Show_H(int x,int y) for(i=0;x; for(j=0;y;Hij Get_G() G=new int *k;k; Gi=new intn; if(i=j) Gij=1; else Gij=0; Gji+k=Hij;Show_G(int x,int y) Get_G();GijHM_Efficiency_Analysing() coutttt对(,)汉明码的评价:( , )汉明码的效率E=k/n*100%=k*1.0/n*100% )汉明码的错误概率 P=n*(n-1)*Pe*Pe=n*(n-1)*Pe*Pe
8、 /* 编 码 模 块 */ /二进制序列合理性检测 int HMCoding:Binary_Str_Check(string temp) int flag=1;/先假设输入的消息串不含除 0、1 外的字符 for(int i=0;tempi!=0 if(!(tempi=|tempi=) flag=0; break; return flag; /汉明码编码Encoding() A: string binary_str; int flag; int binary_num=0;请输入待编码的二进制序列:binary_str; flag=Binary_Str_Check(binary_str); w
9、hile(binary_strbinary_num!) binary_num+;/*统计输入的二进制序列所含码元个数*/if(binary_num%k!=0&flag)/*序列所含码元个数不是 k 的整数倍,无法全部编码*/ cout您输入的二进制序列存在冗余,请重新输入!n goto A; if(binary_num%k!flag)您输入的二进制序列存在冗余且含除 0、1 外的字符,请重新 输入! if(binary_num%k=0&您输入的二进制序列含除 0、1 外的字符,请重新输入! code_str=binary_num;i=i+k)j+)/*获取 k 位信息元*/ if(binary
10、_stri+j= else Xj=1; int temp; string partial_str= for(int t=0;tt+) /*用 k 位信息元组成的向量与生成矩阵作矩阵乘法,得到对应 n 元 码组*/ temp=0; temp+=Xj*Gjt; if(temp%2=0) partial_str+= else partial_str+= code_str+=partial_str;ttt进行()汉明码编码后的二进制序列为:code_strEncoding_Z() code_str=A_Z:string binary_str;flag)/*序列所含码元个数不是 k 的整数倍,无法 全部
11、编码*/输入的二进制序列存在冗余,请重新输入! goto A_Z;输入的二进制序列存在冗余且含除 0、1 外的字符,请重新 输入!输入的二进制序列含除 0、1 外的字符,请重新输入!for(j=0;temp+=Xj*Gjt;if(temp%2=0) partial_str+= Xj+k=0;else partial_str+= Xj+k=1; /生成增余汉明码最后一位 /监督规则:对原汉明码所有 n 个码元取模 2 和 int sum=0; sum+=Xj; if(sum%2=0) partial_str+=进行 (n+1, ) 增余汉明码编码后的二进制序列为: n /* 校 码 模 块 */
12、 /利用汉明码校码Checking()B:请输入待译的二进制序列:) /*统计输入的二进制序列所含码元个数*/ if(binary_num%n! /*序列所含码元个数不是 n 的整数倍,无法 全部译码*/ goto B; flag) if(binary_num%n=0& code_num=binary_num/n;/统计 n 元码组的个数 check_code=new int*code_num;code_num; check_codei=new intn;i+) /*每次取 n 个码元进行校正*/ check_codeij=binary_stri*n+j- Get_Judge_Result()
13、; /利用增余汉明码校码Checking_Z() B_Z: if(binary_num%(n+1)!flag)/*序列所含码元个数不是 n+1 的整数倍, 无法全部译码*/ goto B_Z;输入的二进制序列存在冗余且含除 0、1 外的字符,请重新输入! if(binary_num%(n+1)=0& code_num_z=binary_num/(n+1);/统计 n+1 元码组的个数 check_code=new int*code_num_z;code_num_z; check_codei=new intn+2; /*每次取 n+1 个码元进行校正*/ check_codeij=binary_
14、stri*(n+1)+j- Get_Judge_Result_Z(); /获取汉明码校码结果Get_Judge_Result() int temp; string partial_str;()汉明码校码结果如下:码组 状态 partial_str= temp=0; temp+=Hij*check_codetj; if(temp%2=0) /对 partial_str 进行判断for(i=0; if(H_Columni=partial_str) flag=1;if(flag&n)/表示第 i 个码元出错,将其改正 for(j=0;check_codetj;cout 第i+1位错,可纠正 ; ch
15、eck_codeti=(check_codeti+1)%2;/1 变 0,0 变 1i=n)/表示全对 全对 /获取增余汉明码校码结果Get_Judge_Result_Z()增余汉明码校码结果如下(注:* 表示 无法识别的码元) :码组 状态 校正后 n+2; if(H_Column_Zi=partial_str) if(flag&n+1)/表示第 i 个码元出错,将其改正 check_codetn+1=1;/表示正确接收j+) couti=n+1)/表示全对 check_codetn+1=0;/表示两位出错并无法纠正 某两位出错,无法纠正 */* 表示无法正确识别的码元 /* 译 码 模 块 */ /利用汉明码译码Decoding()汉明码译码结果为:check_codeij; /利用增余汉明码译码Decoding_Z()增余汉明码译码结果为(注:* 表示无 法识别的码元) :
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1