汉明码编译码教程文件

合集下载

汉明码编译码文档

汉明码编译码文档

第一章 绪论1.1差错控制编码差错控制编码 1.1 1.1 概述概述数字信号在传输过程中,数字信号在传输过程中,由于受到干扰的影响,由于受到干扰的影响,码元波形将变坏。

码元波形将变坏。

接收端收接收端收到后可能发生错误判决。

到后可能发生错误判决。

由于乘性干扰引起的码间串扰,由于乘性干扰引起的码间串扰,可以采用均衡的办法来可以采用均衡的办法来纠正。

纠正。

而加性干扰的影响则需要用其他办法解决。

而加性干扰的影响则需要用其他办法解决。

在设计数字通信系统时,在设计数字通信系统时,应该应该首先从合理选择调制制度,首先从合理选择调制制度,解调方法以及发送功率等方面考虑,解调方法以及发送功率等方面考虑,使加性干扰不足使加性干扰不足以影响到误码率要求。

在仍不能满足要求时,就要考虑采用差错控制措施了。

从差错控制角度看,按加性干扰引起的错码分布规律不同,信道可以分为3类,即随机信道,突发信道和混合信道。

在随机信道中,错码的出现是随机的,而且错码之间是统计独立的。

而且错码之间是统计独立的。

在突发信道中,在突发信道中,错码是成串集中出现的,错码是成串集中出现的,而且在短而且在短促的时间段之间存在较长的无错码区间。

把既存在随机错码又存在突发错码的的信道称为混合信道。

对于不同类型的信道,应该采用不同的差错控制技术。

1.2 1.2 纠错编码原理纠错编码原理我们把信息码分组,为每组信息码附加若干监督码的编码称为分组码为每组信息码附加若干监督码的编码称为分组码(block (block code).code).在分组码中,在分组码中,监督码元仅监督本码组中的信息码元。

分组码一般用符号(n ,k )表示,其中n 是码组的总位数,又称为码组的长度(码长),k 是码组中信息码元的数目,码元的数目,n-k=r n-k=r 为码组中的监督码元的数目,或者称为监督位数目,分组码的结构如图2示,图中前k 位为信息位,后面附加r 个监督位。

其中a n-1到a r 为k 个信息位,个信息位,a a r-1到a 0为r 个监督位。

汉明码编译码实验

汉明码编译码实验

汉明码编译码实验一、实验目的1.掌握汉明码2的编解码原理。

掌握汉明码的纠错和检测原理二、实验内容1.汉明码编码实验。

2.汉明码译码实验。

3、汉明码纠错检错能力验证实验。

三、实验设备lte-tx-02e通信原理综合实验系统----------------------------------------------模块8四、实验原理在随机信道中,错码的出现是随机的,且错码之间是统计独立的。

例如,由高斯白噪声引起的错码就具有这种性质。

因此,当信道中加性干扰主要是这种噪声时,就称这种信道为随机信道。

由于信息码元序列是一种随机序列,接收端是无法预知的,也无法识别其中有无错码。

为了解决这个问题,可以由发送端的信道编码器在信息码元序列中增加一些监督码元。

这些监督码元和信码之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。

在信息码元序列中加入监督码元就称为差错控制编码,有时也称为纠错编码。

不同的编码方法有不同的检错或纠错能力。

有的编码就只能检错不能纠错。

那么,为了纠正一个错位码,至少应该向块码中添加多少监督位?编码效率可以提高吗?基于这一思想的研究催生了汉明码。

汉明码是一种线性分组码,它能纠正位错码,编码效率高。

接下来,我们介绍了汉明码的构造原理。

一般说来,若码长为n,信息位数为k,则监督位数r=n?k。

如果希望用r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求2r?1.≥ n或2R≥ K+R+1下面我们通过一个例子来说明如何具体构造这些监督关系式。

在分组码(n,k)中设k=4。

为了纠正错位代码,从公式(14-1)中可以看出,监管数字R需要≥ 3.如果r=3,那么n=K+r=7。

我们用α6α5?α0代表这七个符号,S1、S2和S3代表三种监督关系中的校正器。

然后可以指定s1s2s3的值与错误代码位置之间的对应关系,如表14-1所示。

表14-1(14-1)s1s2s3001010100011错码位置αααα0123s1s2s3101110111000错码位置α4α5α6无错由表中规定可见,仅当一错码位置在α2、α4、α5或α6时,校正子s1为1;否则s1为0。

(7,4)汉明码编译码程序说明资料

(7,4)汉明码编译码程序说明资料

(7,4)汉明码编译码原理程序说明书1、线性分组码假设信源输出为一系列二进制数字0和1.在分组码中,这些二进制信息序列分成固定长度的消息分组(message blocks )。

每个消息分组记为u ,由k 个信息位组成。

因此共有2k种不同的消息。

编码器按照一定的规则将输入的消息u 转换为二进制n 维向量v ,这里n>k 。

此n 维向量v 就叫做消息u 的码字(codeword )或码向量(code vector )。

因此,对应于2k种不同的消息,也有2k种码字。

这2k个码字的集合就叫一个分组码(block code )。

一个长度为n ,有2k个码字的分组码,当且仅当其2k个码字构成域GF (2)上所有n维向量空间的一个k 维子空间时被称为线性(linear )(n ,k )码。

对于线性分组码,希望它具有相应的系统结构(systematic structure ),其码字可分为消息部分和冗余校验部分两个部分。

消息部分由k 个未经改变的原始信息位构成,冗余校验部分则是n-k 个奇偶校验位(parity-check )位,这些位是信息位的线性和(linear sums )。

具有这样的结构的线性分组码被称为线性系统分组码(linear systematic block code )。

本实验以(7,4)汉明码的编译码来具体说明线性系统分组码的特性。

其主要参数如下:码长:21mn =- 信息位:21m k m =-- 校验位:m n k =-,且3m ≥ 最小距离:min 03d d ==由于一个(n ,k )的线性码C 是所有二进制n 维向量组成的向量空间n V 的一个k 维子空间,则可以找到k 个线性独立的码字,0,1,1k g g g -…… ,使得C 中的每个码字v 都是这k 个码字的一种线性组合。

(7,4)汉明码的生成矩阵如下,前三位为冗余校验部分,后四位为消息部分。

0123 1 1 0 1 0 0 00 1 1 0 1 0 01 1 1 0 0 1 01 0 1 0 0 0 1g g G g g ⎧⎫⎧⎫⎪⎪⎪⎪⎪⎪⎪⎪==⎨⎬⎨⎬⎪⎪⎪⎪⎪⎪⎪⎪⎩⎭⎩⎭如果()0123u u u u u =是待编码的消息序列,则相应的码字可如下给出:()0101230011223323g g v u G u u u u u g u g u g u g g g ⎧⎫⎪⎪⎪⎪===+++⎨⎬⎪⎪⎪⎪⎩⎭编码结构即码字()0123456v v v v v v v v =,对于(7,4)线性分组码汉明码而言,3456,,,v v v v 为所提供的消息序列,而0356v v v v =⊕⊕,1345v v v v =⊕⊕,2456v v v v =⊕⊕。

实验三 汉明码编码与译码

实验三 汉明码编码与译码

实验三汉明码编码与译码一、实验题目1、写一个错误生成器模块,在给定的一个比特流作输入时,它的输出流的每个比特流都以概率p发生了改变,即比特错误概率为p。

2、对m=3,将汉明码编码后的比特流输入到上述模块,然后对收到的字用译码器进行译码。

二、实验目的1、理解和掌握汉明码编码与译码的原理;三、算法设计四、程序分析1、错误生成模块:任一给以p,系统任意生成一数,若比p小则让其出错,否则不出错。

2、编码:首先随机生成H矩阵,由H矩阵生成G矩阵,利用C=mG编码。

3、解码:若v*H’=0,则没有出错,直接输出v中前k位;若v*H’!=0,列出所有的e和e*H’得到伴随阵s,若能在s中找到s=v*H则c0=v-e,输出c0中前k位;若找不到s,则输出“错误位数大于纠错能力,无法解码”。

五、程序代码#include <iostream>#include <string> // 字符串处理头文件#include <iomanip> // 输入输出控制头文件#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;void Err_Pro();void Hamming_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[1 00][100];intH[100][100],HT[100][100],Ig[100][100],P[100][100],G[100][100],Ibit[100],Cbit[100],Err_Cbit[1 00],V[100];/**************************************************************************//*函数名:void Binary_Conversion(int i) *//*功能:十-二进制转换*//*说明:该函数输出二进制数为低位在前,高位在后*//**************************************************************************/ void Binary_Conversion(int i){int j=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时不进行二进制转换)}/**************************************************************************/ /*函数名:void Random_Array() */ /*功能:将数组的列随机排放*/ /**************************************************************************/ void Random_Array(){srand(unsigned(time(NULL))); // 随机生成条件(抵消rand函数伪随机效果)cout << endl << "产生随机数为:" << endl;for(int j=0;j<n;j++){loop:r= rand() % n; // 随机生成范围为0~n-1的正整数for(int i=0;i<j;i++){if(R[i] == r) // 如果随机产生的数与已产生的数相等,则重新随机产生数{goto loop;}}R[j] = r; // 产生不重复的随机数cout << setw(4) << r + 1;for(int i=0;i<m;i++){PT_D[i][j] = PT_S[i][r]; // 顺序转置系数矩阵->随机转置系数矩阵}}}/**************************************************************************/ /*函数名:void Creat_H() */ /*功能:创建系统型奇偶校验矩阵H */ /*说明:系统型奇偶校验矩阵H由转置负系数矩阵和单位矩阵组成*/ /**************************************************************************/ void Creat_H(){int i,j,count0=0,count1=0,count2=0,count3=0;/*************生成单位矩阵Ih************/ //教材P101for(i=0;i<m;i++) //i表示行j表示列{for(j=0;j<n;j++){if((j >= k) && (i+k == j))Ih[i][j] = 1;elseIh[i][j] = 0;}}/*********生成转置负系数矩阵PT**********/for(i=0;i<m;i++) // 转置二进制转换数组到PT_S{for(j=0;j<n;j++){PT_S[i][j] = num[j][i]; // 生成顺序转置系数矩阵}}Random_Array();//将数组的列随机排放for(j=0;j<n;j++){for(i=0;i<m;i++){if(PT_D[i][j] == 0)count0 ++;}count1 = count0; // count1记录每一列1的个数count0 = 0;if(count1 == (m-1)) // 将只有一位为1其余位为0的列的所有位置0{for(i=0;i<m;i++){PT_D[i][j] = 0;}}else// COUNT数组记录只有一位为1其余位为0的列为0,其余位的值为PT_D列的位置值+1 COUNT[count2] = j + 1;count2 ++;}for(int q=0;q<n;q++) // 将PT_D的至少有两个1的列赋给PT{if(COUNT[q] > 0){for(i=0;i<m;i++)PT[i][count3] = PT_D[i][q];count3 ++;}}cout << endl;/********生成系统型奇偶校验矩阵H********/for(i=0;i<m;i++){for(j=0;j<n;j++){H[i][j] = PT[i][j] + Ih[i][j];}}cout << endl << "系统型奇偶校验矩阵H为:" << endl;for(i=0;i<m;i++) // 显示系统型奇偶校验矩阵H{for(j=0;j<n;j++){cout << setw(2) << H[i][j] << setw(2);}cout << endl;}}/**************************************************************************/ /*函数名:void Creat_G() *//*功能:创建系统型生成矩阵G */ /*说明:系统型生成矩阵G由单位矩阵和系数矩阵组成*/ /**************************************************************************/ void Creat_G(){int i,j;/*************生成单位矩阵Ig************/for(i=0;i<k;i++){for(j=0;j<n;j++){if(i == j)Ig[i][j] = 1;elseIg[i][j] = 0;}}/*************生成系数矩阵P*************/for(j=0;j<n;j++){for(i=0;i<k;i++){if(j>k-1)P[i][j] = PT[j-k][i];}}/**********生成系统型生成矩阵G**********/for(i=0;i<k;i++){for(j=0;j<n;j++){G[i][j] = P[i][j] + Ig[i][j];}}cout << endl << "系统型生成矩阵G为:" << endl;for(i=0;i<k;i++) // 显示系统型奇偶校验矩阵H{for(j=0;j<n;j++){cout << setw(2) << G[i][j] << setw(2);}cout << endl;}}/*******************************主函数*************************************/ int main(){int i,j;cout << setw(30) << "汉明码" << endl;cout << "请输入校验元位数m = ";cin >> m;n = pow(2,m) - 1; //码长k = pow(2,m) - 1 -m; //信息源位数cout << "提示:" << setw(10) << "您输入的为(" <<n<< "," <<k<< ")汉明码,可纠正" << t << "个错误" << endl;cout << endl;for(i=0;i<n;i++) // 将n个转换二进制数组存入二维数组{Binary_Conversion(i+1);for(j=0;j<m;j++){num[i][j] = N[j];//num[i][m-j-1] = N[j]; // m-j-1意义在于将二进制高位在前,低位在后}}cout << "n个二进制转换表为:" << endl;for(i=0;i<n;i++) // 输出二进制转换对应表低位在前高位在后{for(j=0;j<m;j++){cout << num[i][j] << setw(2);}cout << setw(4);}cout << endl;Creat_H();Creat_G();cout << endl << "请输入" << k << "位信息比特流:" << endl;for(i=0;i<k;i++)cin >> Ibit[i];for(i=0;i<n;i++){for(j=0;j<k;j++){Cbit[i] += (Ibit[j] * G[j][i]); // 十进制加法Cbit[i] = Cbit[i] % 2; // 将十进制转换二进制}}cout << endl << "输出" << n << "位码字比特流:" << endl;for(i=0;i<n;i++) //输出编码后的码字cout << setw(3) << Cbit[i];cout << endl;Err_Pro(); //错误概率函数Hamming_Decode(); //汉明译码return 0;}/**************************************************************************/ /*函数名:void Err_Pro() */ /*功能:产生错误概率函数*/ /**************************************************************************/ void Err_Pro(){float p;cout << endl << "请输入错误概率p = ";cin >> p;for(int x=0;x<n;x++){if((float)((rand() % 1001) * 0.001) < p) // 如果小于概率,则原码0与1互换{err ++;Err_Cbit[x] = (Cbit[x] + 1) % 2;}elseErr_Cbit[x] = Cbit[x]; // 如果大于错误概率,则赋值原码}cout << endl << "输出" << n << "位码字比特流(每位等概出错):" << endl;for(int y=0;y<n;y++)cout << setw(3) << Err_Cbit[y];cout << endl;}/**************************************************************************/ /*函数名:void Hamming_Decode() */ /*功能:汉明译码函数*//**************************************************************************/ void Hamming_Decode(){int i,j,flag=0,d;for(i=0;i<n;i++) // 得到H的转置矩阵HT{for(j=0;j<m;j++){HT[i][j] = H[j][i];}cout << endl << "输出转置奇偶校验矩阵HT为:" << endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout << setw(3) << HT[i][j] << setw(3);}cout << endl;}for(i=0;i<m;i++) // 计算伴随矩阵{for(j=0;j<n;j++){V[i] += Err_Cbit[j] * HT[j][i];}if(V[i] % 2 == 0) // 将十进制转换二进制V[i] = 0;elseV[i] = 1;}cout << endl << "输出伴随矩阵为:" << endl;for(i=0;i<m;i++)cout << V[i] << setw(2);cout << endl;for(i=0;i<m;i++){if(V[i] == 0) // 如果伴随矩阵为零矩阵,则直接输出原码流{if(i == m-1){cout << endl << "<译码正确!>输出码流为:" << endl;for(j=0;j<n;j++)cout << Err_Cbit[j] << setw(3);cout << endl;}}else{flag ++; // 如果伴随矩阵为非零矩阵,则标志位自加1break;}if(flag != 0){if(err == 1) // 伴随矩阵为非零矩阵时执行{for(i=0;i<n;i++){for(j=0;j<m;j++){if(V[j] == HT[i][j]){if(j == (m-1)) d = i;//d记录行}elsebreak;}}cout << endl << "<译码正确!>输出码流为:"<< endl;Err_Cbit[d] = (Err_Cbit[d] + 1) % 2;for(i=0;i<n;i++)cout << setw(3) << Err_Cbit[i] << setw(3);cout << endl;}elsecout << endl << "由于本次编码有" << err << "个错误位,大于纠错能力" << t << ",故<译码错误!>" << endl;}}六、程序运行结果。

汉明码的编码和译码算法

汉明码的编码和译码算法

汉明码的编码和译码算法汉明码(Hamming)的编码和译码算法本⽂所讨论的汉明码是⼀种性能良好的码,它是在纠错编码的实践中较早发现的⼀类具有纠单个错误能⼒的纠错码,在通信和计算机⼯程中都有应⽤。

例如:在“计算机组成原理”课程中,我们知道当计算机存储或移动数据时,可能会产⽣数据位错误,这时可以利⽤汉明码来检测并纠错。

简单的说,汉明码是⼀个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为汉明码。

如果对汉明码作进⼀步推⼴,就得出了能纠正多个错误的纠错码,其中最典型的是BCH码,⽽且汉明码是只纠1bit错误的BCH码,可将它们都归纳到循环码中。

各种码之间的⼤致关系显⽰如下。

⼀、汉明码的编码算法输⼊:信源消息u(消息分组u)输出:码字v处理:信源输出为⼀系列⼆进制数字0和1。

在分组码中,这些⼆进制信息序列分成固定长度的消息分组(message blocks)。

每个消息分组记为u,由k个信息位组成。

因此共有2k种不同的消息。

编码器按照⼀定的规则将输⼊的消息u转换为⼆进制n 维向量v ,这⾥n >k 。

此n 维向量v 就叫做消息u 的码字(codeword )或码向量(code vector )。

因此,对应于2k 种不同的消息,也有2k 种码字。

这2k 个码字的集合就叫⼀个分组码(block code )。

若⼀个分组码可⽤,2k 个码字必须各不相同。

因此,消息u 和码字v 存在⼀⼀对应关系。

由于n 符号输出码字只取决于对应的k ⽐特输⼊消息,即每个消息是独⽴编码的,从⽽编码器是⽆记忆的,且可⽤组合逻辑电路来实现。

定义:⼀个长度为n ,有2k 个码字的分组码,当且仅当其2k 个码字构成域GF(2)上所有n 维向量组成的向量空间的⼀个K 维⼦空间时被称为线性(linear )(n, k)码。

汉明码(n ,k ,d )就是线性分组(n, k)码的⼀种。

其编码算法即为使⽤⽣成矩阵G :v = u ·G 。

汉明码编译码及纠错性能验证

汉明码编译码及纠错性能验证

汉明码编译码及纠错性能验证目录一、实验目的 (2)二、实验原理 (2)1.汉明编译码介绍 (2)2.汉明编译码原理 (2)3.举例说明 (3)4.实验框图说明 (3)5.框图中各个测量点说明 (4)三、实验任务 (5)四、实验步骤 (5)1. 实验准备 (5)2.汉明码编码原理验证 (5)3.汉明译码观测及纠错能力验证 (8)4.实验结束 (10)五、实验分析 (11)一、实验目的1.学习汉明码编译码的基本概念;2.掌握汉明码的编译码方法;3.验证汉明码的纠错能力。

二、实验原理1.汉明编译码介绍汉明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码,所以它也仅用于信道特性比较好的环境中,如以太局域网中,因为如果信道特性不好的情况下,出现的错误通常不是一位。

汉明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是 1 就变成 0,原来是 0 就变成 1)来将其纠正。

2.汉明编译码原理●汉明码编码采用(4,7)汉明码,信息位数k=4,监督位数r=n-k=3,可以纠一位错码,生成矩阵G=[1 0 0 0 1 1 10 1 0 0 1 1 00 0 1 0 1 0 10 0 0 1 0 1 1],编码情况见表格1。

表格1 (7,4)Hamming编码表●汉明码译码计算校正子S=[S1,S2,S3],其中S1=a6⨁a5⨁a4⨁a2S2=a6⨁a5⨁a3⨁a1S3=a6⨁a4⨁a3⨁a0校正子S 的值决定了接收码元中是否有错码,并且指出错码的位置,见表格 2。

表格 2 错码位置示意3.举例说明信息位a6a5a4a3=1001,根据表格 1(4,7) Hamming 编码表,编码为1001100,如果在信道传输的过程中产生一位误码,编码接收时变为1101100 ,我们计算校正子:S1=a6⨁a5⨁a4⨁a2=1S2=a6⨁a5⨁a3⨁a1=1S3=a6⨁a4⨁a3⨁a0=0校正子S=110,查找表格 2 错码位置示意,a5产生误码,则译码输出信息位1001。

通信原理实验18 汉明码的编解码实验

通信原理实验18 汉明码的编解码实验

实验十七汉明码的编解码实验实验十八汉明码的编解码实验实验内容1. 熟悉汉明码码型变换编码实验2.熟悉汉明码码型变换译码实验一、实验目的1.了解汉明码的编解码原理2.掌握汉明码的编解码过程3. 学习通过CPLD编程实现汉明码编译码实验二、实验电路工作原理汉明码是1949年提出的一种能纠正单个错误的线性分组码。

它是在原有数据中插入若干校验码来进行错误检查和纠正的编码技术。

它在CDMA多载波系统中得到了广泛应用。

1.线性分组码的编码原理分组码中信息码元和监督码元是用线性方程联系起来的。

设分组系统码(n,k)中k=4,为能纠正一位误码,取r=3,则n=k+r=7。

我们用a0a1a2a3a4a5a6表示这7个码元,用S1,S2,S3表示由三个监督方程式计算得到的校正子,并假设S1S2S3三位校正子组码与误码位置的对应关系如表1-1所示。

由表可知: S1=6542(1-1)94实验十七 汉明码的编解码实验95S2=6531a a a a ⊕⊕⊕ (1-2) S3=6430a a a a ⊕⊕⊕ (1-3)在编码时,a6,a5,a4,a3为信息码元,取决于被传输的信息。

由式(1-1),(1-2),(1-3)可知,监督码元a2,a1和a0应根据以下的监督方程确定:a2=654a a a ⊕⊕(1-4); a1=653a a a ⊕⊕(1-5); a0=643a a a ⊕⊕(1-6)不难看出,上述(7.4)码的最小码距dmin=3,它能纠正一个误码或检测两个误码。

如超出纠错能力,则反而会因“乱纠”而增加新的误码。

2.线性分组码的实现方法 dataout(7)<='0';dataout(6 downto 3 ) <=datain(3 downto 0); dataout(2)<=datain(3)xor datain(2) xor datain(1); dataout(1)<=datain(2) xor datain(1) xor datain(0); dataout(0)<=datain(3) xor datain(2) xor datain(0); 3.线性分组码的解码原理接收端收到的每个码组后,计算出S1,S2和S3,如不全为0,则可按表1-1确定误码的位置,然后给以纠正。

汉明码编译码

汉明码编译码
图6误码率随Pe变化曲线图
图中绿线为BSC信道误码率,红线为设定Pe值,蓝线为Hamming码解码误码率。由图线可以看出仿真的BSC信道误码率与Pe一致。
在Pe<0.2时,Hamming码的解码误码率随着BSC信道错误传输概率Pe的减小而减小。Hamming码的解码误码率显著下降,约为Pe的1/2。Hamming码的纠1位错起到了很好的效果。
附录
clear all
[H,G,n,k] =hammgen(3,'D^3+D+1');%
2)产生随机的信息序列M
3)由 得到码字
4)进入信道传输
假设是BSC信道,错误转移概率设定为0.1
传输后接收端得到的码流为
红色表示错误比特。
5)计算 得到伴随式
错误图样
伴随式
1
001
010
100
查表可知第一行码字错误图样为0100000,第二行码字错误图样为1000000,第三行码字错误图样为0000001。
进行 即可得到纠错解码的码字C2。
6)得到解码码流
7)得到解码信息序列
可以看出解码信息序列与原信息序列一样,体现了汉明码的纠错能力。
2.性能分析
1)BSC信道仿真
设置BSC错误转移概率Pe从0到1变化,步进为0.01,在每个Pe值进行1000次蒙特卡洛仿真,得到图4所示误码率随Pe变化曲线图和图5所示误帧率随Pe变化曲线图。
0.2<Pe<0.5时,Hamming码的解码误码率大于Pe。这是因为在Pe>0.2时,传一个码字错误比特数近似为2,而Hamming码只能纠一位错,两位同时出错时会纠成另一个码字,这样就可能增加误比特数,使得“越纠越错”。
Pe>0.5时,情况恰好相反。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汉明码编译码汉明码编译码一设计思想汉明码是一种常用的纠错码,具有纠一位错误的能力。

本实验使用Matlab 平台,分别用程序语言和simulink来实现汉明码的编译码。

用程序语言实现就是从原理层面,通过产生生成矩阵,错误图样,伴随式等一步步进行编译码。

用simulink实现是用封装好的汉明码编译码模块进行实例仿真,从而验证程序语言中的编译码和误码性能分析结果。

此外,在结合之前信源编码的基础上,还可实现完整通信系统的搭建。

二实现流程1.汉明码编译码图 1 汉明码编译码框图1)根据生成多项式,产生指定的生成矩阵G2)产生随机的信息序列M3)由C MG得到码字4)进入信道传输S RH得到伴随式5)计算=T6)得到解码码流7) 得到解码信息序列2.汉明码误码性能分析误码率(SER )是指传输前后错误比特数占全部比特数的比值。

误帧率(FER )是指传输前后错误码字数占全部码字数的比值。

通过按位比较、按帧比较可以实现误码率和误帧率的统计。

3. 构建完整通信系统图 2 完整通信系统框图三 结论分析1. 汉明码编译码编写了GUI 界面方便呈现过程和结果。

输入信息序列Huffman 编码Hamming 编码信道Hamming 译码Huffman 译码输出信息序列噪声图 3 汉明码编译码演示GUI 界面以产生(7,4)汉明码为例说明过程的具体实现。

1)根据生成多项式,产生指定的生成矩阵G用[H,G,n,k] = hammgen(3,'D^3+D+1')函数得到系统码形式的校验矩阵H 、G 以及码字长度n 和信息位数k100101101011100010111H ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦1101000011010011100101010001G ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦2) 产生随机的信息序列M0010=01000111M ⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦3) 由C MG =得到码字010001101101000010111C ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦4) 进入信道传输假设是BSC 信道,错误转移概率设定为0.1传输后接收端得到的码流为000011110100000111101R ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦红色表示错误比特。

5) 计算=T S RH 得到伴随式011=100001S ⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦查表可知第一行码字错误图样为0100000,第二行码字错误图样为1000000,第三行码字错误图样为0000001。

进行ˆˆ=+CR E 即可得到纠错解码的码字C2。

6) 得到解码码流0110100200000001110010C ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦7) 得到解码信息序列0100200000010M ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦可以看出解码信息序列与原信息序列一样,体现了汉明码的纠错能力。

2.性能分析 1)BSC 信道仿真设置BSC错误转移概率Pe从0到1变化,步进为0.01,在每个Pe 值进行1000次蒙特卡洛仿真,得到图4所示误码率随Pe变化曲线图和图5所示误帧率随Pe变化曲线图。

图 6误码率随Pe变化曲线图图中绿线为BSC信道误码率,红线为设定Pe值,蓝线为Hamming 码解码误码率。

由图线可以看出仿真的BSC信道误码率与Pe一致。

在Pe<0.2时, Hamming码的解码误码率随着BSC信道错误传输概率Pe的减小而减小。

Hamming码的解码误码率显著下降,约为Pe的1/2。

Hamming码的纠1位错起到了很好的效果。

0.2<Pe<0.5时,Hamming码的解码误码率大于Pe。

这是因为在Pe>0.2时,传一个码字错误比特数近似为2,而Hamming码只能纠一位错,两位同时出错时会纠成另一个码字,这样就可能增加误比特数,使得“越纠越错”。

Pe>0.5时,情况恰好相反。

图 7误帧率随Pe变化曲线图可以看出随着Pe增加,BSC传输误帧率和Hamming译码误帧率成S 曲线上升达到1。

Hamming译码误帧率要低于BSC传输误帧率,体现了其纠错能力使得码字错误减少这一效果。

与误码率的图对比可以发现,误帧率要比误比特率高。

为了进一步验证结果的正确性,进行了simulink仿真。

图 8 BSC信道仿真框图用伯努利二进制发生器产生随机序列,进行汉明码编码,进入BSC 信道传输,之后进行汉明码译码,用Error Rate Calculation模块统计误码率,结果如下:图 9 simulink仿真BER随Pe变化曲线图与程序实现仿真的结果几乎一样。

2)AWGN信道仿真AWGN信道仿真直接用simulink实现。

图 10 AWGN信道仿真框图设置系统的数字调制方式为2FSK,设定AWGN信道的SNR从0到8dB以1dB步进变化,得到误码率统计图。

图 11 simulink仿真BER随SNR变化曲线图图中绿线为2FSK调制误码率,是由于AWGN带来的。

蓝线为汉明码解码后误码率。

可以看出,汉明码能够很好的降低误码率。

在SNR达到5dB时错误概率降低为0.001.3.完整通信系统的构建以传输图片为例,信道设置为BSC信道。

在不加入汉明码和加入汉明码两种情况下观察传输后图像的情况。

结果如下表所示。

BSC错误转0.1 0.05 0.01 0.001 0移概率PeBSC传输图像加汉明码误0.0652 0.02 0.0006 0 0码率加汉明码传输图像由结果可以看出,加入信道编码后,当BSC错误转移概率Pe<0.01后,图像恢复性能有明显的改善。

这体现了汉明码虽然只有纠一位错的能力,但由于一般信道的Pe不会很大,其纠错的实用性和效果还是很好的。

四 思考题解答1.采用循环Hamming 码在硬件实现中的优点?与普通的线性分组码译码电路相比,循环汉明码不需要存储伴随式及错误图样,显著的节省了寄存器的使用,起到简化电路的作用。

2.Hamming 码如何改进可提高纠检错性能?可以在H 校验矩阵基础上进行扩展,最后一行为全1行,最后一列矢量为[00…1]T 。

这样任何3列是线性无关的,d min =4,进行奇偶校验,纠错能力为1,检错能力为2。

即下面通过实例的方式说明扩展H 校验矩阵的检错性能。

首先在(7,4)汉明码的基础上进行扩展,得到(8,4)扩展汉明码的生成矩阵H 。

1110100001110100=1101001011111111H ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦简化译码表如下:说明对于错码个数为1的,既可以检错也可以纠错; 错码个数为2的,可以检错,但不能纠错;错码个数大于2的,被认为是错码个数为1,纠成其他码字。

0'=0111H H ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦M L附录clear all[H,G,n,k] = hammgen(3,'D^3+D+1');%%[H,G,n,k] = hammgen(3,'D^4+D^2+D+1');%[H,G,n,k] = hammgen(4,'D^4+D+1');%%[H,G,n,k] = hammgen(5,'D^5+D^2+1');%%%产生校验矩阵E=[zeros(1,n);fliplr(eye(n,n))];%产生错误图样一共是n+1个S=mod(H*E',2);%生成错误图样的伴随式%%产生消息序列%二进制随机矩阵%M= randi([0,1],1,k);%产生4位消息列nm=3;M= randi([0,1],nm,k);%产生4位消息列%消息序列code=mod(M*G,2);%对消息序列编码%BSC信道进入Pe=0.1;for j=1:nmfor i=1:ncode_bsc(j,i)=mod(code(j,i)+(unidrnd(round(1/Pe))==1),2);%模2加得到传输后的编码delta(j,i)=code_bsc(j,i)-code(j,i);%作差来计算错误位置endendep=find(delta~=0);%error positiondisplay(length(ep),'BSC错误位数')display(length(ep)/(nm*n),'BSC误比特率');Scode=mod(code_bsc*H',2 )'; %Scode=[1 1 0]';errow2=0;for i=1:nmif sum(code_bsc(i,:)-code(i,:))~=0errow2=errow2+1;endenddisplay(errow2,'BSC错误码字数');% display(errow2/nm,'BSC误码率');for m=1:nmfor i=1:n+1if S(:,i)==Scode(:,m)j=i;endend %找到对应的伴随式的位置dcode(m,:)=mod(code_bsc(m,:)+E(j,:),2);ender=length(find(dcode-code~=0));%计算误比特的个数enta=er/(nm*n);display(code,'信息序列码字')display(code_bsc,'BSC传输后的信息序列码字') display(dcode,'解码后的信息序列')% display(errow2/nm,'解码后误码率');% display(er,'解码后错误比特数');m2=dcode(:,n-k+1:end);display(dcode,'解码后信息序列');errow2=0;for i=1:nmif sum(dcode(i,:)-code(i,:))~=0errow2=errow2+1;endend% display(errow2,'解码后错误码字数');% display(errow2/nm,'解码后误码率');。

相关文档
最新文档