11汉明码编解码实验

合集下载

汉明码编码实验报告

汉明码编码实验报告

重庆工程学院
电子信息学院
实验报告
课程名称:_ 数据通信原理开课学期:__ 2015-2016/02_ 院(部): 电子信息学院开课实验室:实训楼512
学生姓名: 舒清清梁小凤专业班级: 1491003
学号: ********* *********
重庆工程学院学生实验报告
输入1000,编码1000111 输入1001,编码1001100 输入1010,编码1010010
输入1011,编码1011001 输入1100,编码1100001 输入1101,编码1101010
输入1110,编码1110100 输入1111,编码1111111
六、实验结果及分析
输入和输出会有一个时延,当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错,利用了奇偶校验位概念。

七、实验心得、体会及意见
通过实验我对汉明码有了进一步的认识,对生成矩阵有了一定得了解,重要的是我能够用我所学到的理论知识来解决我现所遇到的问题。

汉明码编码实验报告详细解释

汉明码编码实验报告详细解释

汉明码的实现详细实验报告一、实验目的1、掌握线性分组码的编码原理2、掌握汉明码编码方法3、了解编码对误码性能的改善二、实验内容1、自行设置汉明码的参数,生成矩阵,计算所设计出的汉明码;写出产生(3,1)汉明码的生成矩阵,给出生成码的源程序,并给出运行结果。

2、利用encode库函数实现汉明编码;3、搭建一个通信仿真模块,并给出运行结果,分析汉明码对通信性能的影响;4、整理好所有的程序清单或设计模块,并作注释。

三、实验原理(一)、汉明码的介绍汉明码是1951年由汉明(R.W.Hamming)提出的能纠正单个错误的线性分组码。

它性能良好,既具有较高的可靠性,又具有较高的传输效率,而且编译码电路较为简单,易于工程实现,因此汉明码在发现后不久,就得到了广泛的应用。

我们的目的是要寻找一个能纠正单个错误,且信息传输率(即码率r=k/n )最大的线性分组码。

我们已经知道,具有纠正单个错误能力的线性分组码的最小距离应为 3,即要求其H 矩阵中至少任意两列 线性无关。

要做到这一点,只要H 矩阵满足“两无”一一无相同的列, 无全零列就可以了。

(n,k )线性分组码的H 矩阵是一个⑴-"n 訂n 阶矩阵,这里 r =n —k 是校验元的数目。

显然,r 个校验元能组成2r 列互不相同的r 重 矢量,其中非全零矢量有2r -1个。

如果用这2r -1个非全零矢量作为H 矩阵的全部列,即令H 矩阵的列数n =2「一1,则此H 矩阵的各列均不 相同,且无全零列,由此可构造一个纠正单个错误的(n ,k )线性分 组码同时,2r -1是n 所能取的最大值,因为如果n 2r -1,那么H 矩 阵的n 列中必会出现相同的两列,这样就不能满足对 H 矩阵的要求。

而由于n =2 -1是门所能取的最大值,也就意味着码率 R 取得了最大 值,即这样设计出来的码是符合我们的要求的,这样的码就是汉明码 定义 若H 矩阵的列是由非全零且互不相同的所有二进制r 重矢量组成,则由此得到的线性分组码,称为 GF (2)上的(2r -1, 2r -1-r )汉 明码。

hamming实验报告

hamming实验报告

hamming实验报告Hamming实验报告引言:Hamming实验是一项重要的计算机科学实验,旨在研究和验证Hamming码的纠错能力。

Hamming码是一种用于纠正单一比特错误的错误检测和纠正编码方式,被广泛应用于数据传输和存储中。

本实验将通过模拟数据传输过程,并使用Hamming码进行纠错,来验证其在实际应用中的有效性。

实验目的:本实验的目的是通过模拟数据传输过程,验证Hamming码的纠错能力。

具体而言,我们将通过引入人为制造的错误,检测和纠正这些错误,以验证Hamming码的可靠性和有效性。

实验步骤:1. 设计Hamming码生成矩阵和校验矩阵。

2. 生成待发送的数据,并使用Hamming码进行编码。

3. 引入人为制造的错误,模拟数据传输过程中的错误。

4. 使用Hamming码进行错误检测和纠正。

5. 比较纠错前后的数据,验证Hamming码的纠错能力。

实验结果:在本次实验中,我们成功设计并实现了Hamming码的纠错过程。

通过引入人为制造的错误,我们模拟了数据传输过程中的错误情况。

使用Hamming码进行错误检测和纠正后,我们成功恢复了原始数据,并验证了Hamming码的纠错能力。

讨论:Hamming码作为一种常用的纠错编码方式,具有较高的纠错能力和可靠性。

通过本次实验,我们进一步验证了Hamming码的有效性。

然而,Hamming码并不能纠正所有错误,它只能纠正单一比特错误。

对于多比特错误或连续错误,Hamming码的纠错能力将受到限制。

因此,在实际应用中,我们需要综合考虑数据传输的可靠性需求,并选择适当的纠错编码方式。

结论:通过本次实验,我们验证了Hamming码的纠错能力。

Hamming码作为一种常用的纠错编码方式,在数据传输和存储中具有重要的应用价值。

然而,我们也需要认识到Hamming码的局限性,它只能纠正单一比特错误。

在实际应用中,我们需要根据具体需求选择适当的纠错编码方式,以确保数据的可靠性和完整性。

11汉明码编解码实验

11汉明码编解码实验

010 011 100 101 110 111 3、信道选择(选择加错位置) SW103-6,SW103-5,SW103-4,SW103-3 0000 0001 0010 0011 …… 1111 4、加错数目选择 SW103-2,SW103-1 00 01 10 11
BCH 码编码 卷积码编码 Turbo 码编码 扩展用 扩展用 汉明码交织编码
加错位置 从 0 位置加错 从 1 位置加错 从 2 位置加错 从 3 位置加错 ……. 从 15 位置加错
加错位置 加 0 位错 加 1 位错 加 2 位错 加 3 位错
从 SW103-6,SW103-5,SW103-4,SW103-3 指示的位置开始,每帧加错的位数有 SW103-2,SW103-1 的状 态决定。 5、编码输出设置 D116,D115,D114,D113,D112,D111,D110,D109,D108,D107,D106,D105,D104,D103, D102,D101 为 16 位编码输出位。TP102 和 TP103 分别可以测量编码输出的帧和对应该帧的时钟信号。 6、解码方式选择 SW201-3,SW201-2,SW201-1 000 001 010 解码方式 汉明码解码 CRC 解码 BCH 码解码
AWGN Channel的参数SNR设置为SNR; Bernoulli Binary Generator的参数Sample Time设置为SampleTime。 2、仿真程序 clear all; SampleTime=1; SNR=1; sim('hammingsim'); figure(1); subplot(2,2,1); stem(hammingin); title('编码输入序列'); subplot(2,2,2); stem(hammingen); title('编码输出序列'); subplot(2,2,3); stem(hammingene); title('解码输出序列'); subplot(2,2,4); stem(hammingde); title('解码输出序列'); clear all; SampleTime=1/1000; for i=1:8 SNR=i-3; sim('hammingsim'); biterr(i)=0; for j=1:length(err) biterr(i)=biterr(i)+err(j,1); end; biterr(i)=biterr(i)/length(err); end; figure(2);

Hamming码实验.

Hamming码实验.

云南大学数学与统计学实验教学中心实验报告课程名称:计算机网络实验学期:2012-2013学年第二学期成绩:指导教师:陆正福学生姓名:卢富毓学生学号:20101910072实验名称:Hamming码实验实验要求:必做实验学时:4学时实验编号: No.9 实验日期:2013/5/28完成日期:2013/6/3学院:数学与统计学院专业:信息与计算科学年级: 2010级一、实验目的:通过实验掌握Hamming码编码实验的构造算法,以及其重要思想。

二、实验内容:Hamming码编码实验1.熟悉Hamming码的设计原理;2.编程实现(15,11,3)Hamming的编码和译码算法;3.验证Hamming码的检错能力和纠错能力三、实验环境Win7、Eclipse四、实验过程(请学生认真填写):实验过程、结果以及相应的解释:1. 预备知识A、与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。

利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置。

B、Hamming码中主要的是生成矩阵以及校验矩阵。

通过得到这二者,我们就可以对需要的字符串进行编码、检错、纠错、译码的工作了。

C、具体如下:2. 实验过程A、原理分析:这里主要对如何纠错进行简要分析:编码所对应的码字为C = 0110011。

若接收到R = 0110001 。

有H*x=0可以判断其存在错误。

Erro={1 1 0}。

用Erro中的元素与校验矩阵中的每一列表,与其中一列全部相同。

则带便这一列有错。

找到第六位有错。

异或运算后得到R = 0110011。

当然这里需要注意的是Hamming 码只能纠正一位错误。

当出现两位错误时,将无法纠错后得到正确结果。

好了,废话不多说了。

先把代码贴上来。

B、具体代码如下:/* HammingCode的实验**1.熟悉Hamming码的设计原理;*2.编程实现(15,11,3)Hamming的编码和译码算法;*3.验证Hamming码的检错能力和纠错能力。

汉明码编译码及纠错能力验证实验

汉明码编译码及纠错能力验证实验

课程名称通信原理实验序号实验8实验名称汉明码编译码及纠错能力验证实验实验地点B702实验学时 2 实验类型验证性指导教师实验员专业_电子信息工程__ 班级14电信一班学号姓名2016年12 月15 日五、测试/调试及实验结果分析图片说明:CH1(黄色)帧同步信号CH2(浅蓝色)编码后信号CH3(粉红色)编码前信号CH4(深蓝色)译码后信号保护位无加错的时候设置的原始信号是:1100,编码后的信号是:1100001,译码后的信号为:1100。

对照图片的波形图,无误输出,汉明码正确。

有延时的现象。

1位加错的时候:设置的原始信号是:1100,编码后的信号是:1101001译码后的信号是:1100 通过计算S1、S2、S3可知错误位为:a3 对照译码后的波形与编码前的波形,可知已经纠错成功。

汉明码的一位纠错功能实现。

有延时的现象。

2位加错的时候:设置的原始信号是:1100,编码后的信号是:1111001码后的信号是:0111 对照无错的编码后序列,可知错误位为:a3、a4 对照译码后的波形与编码前的波形,可知译码后的波形与编码前的波形对不上。

(7,4)汉明码的2位纠错功能无法实现。

3位加错的时候:设置的原始信号是:1100,编码后的信号是:1011001码后的信号是:0111 对照无错的编码后序列,可知错误位为:a3、a4、a5 ,对照译码后的波形与编码前的波形,可知译码后的波形与编码前的波形对不上。

(7,4)汉明码的3位纠错功能无法实现。

4位加错的时候:设置的原始信号是:1100,编码后的信号是:0011001码后的信号是:0111 对照无错的编码后序列,可知错误位为:a3、a4、a5 、a6 ,对照译码后的波形与编码前的波形,可知译码后的波形与编码前的波形对不上。

(7,4)汉明码的4位纠错功能无法实现。

六、实验结论与体会1.课堂上对汉明码的理解不够深入,经过本次实验明显加深了我对汉明码的理论的认识和理解,实际动手才是关键2.经过编码后的编码序列,在加错码的时候,对a0、a1、a2位没有影响,也就是说这三位不会在无错的时候编码是什么,加错后这三位的编码还是一样3.一位加错时,(7,4)汉明码有检错以及纠错的功能,两位加错的时候,只有检错的功能,却没有纠错的功能,三位或三位以上加错时,既没有检错的功能,也没有纠错的功能;4.(7,4)汉明码作为一种信道编码的方式,具有一定的纠错检错能力。

汉明码实验报告

一、实验目的1. 理解汉明码的基本原理及其在数据传输中的作用。

2. 掌握汉明码的编码和译码方法。

3. 通过实验验证汉明码在纠正单个错误和检测多个错误方面的能力。

4. 增强对编码理论在实际应用中的理解和应用能力。

二、实验原理汉明码是一种线性分组码,由理查德·汉明于1950年提出。

它通过在原始数据中插入额外的校验位来检测和纠正错误。

汉明码的特点是,它可以纠正单个错误,同时也能检测出两个或更多的错误。

在汉明码中,校验位的位置是按照2的幂次来安排的,即第1位、第2位、第4位、第8位等。

信息位则填充在这些校验位之间。

在编码过程中,校验位通过计算特定信息位的逻辑和来确定。

三、实验内容1. 设置汉明码参数:选择要编码的信息位长度和校验位长度。

例如,选择7位信息位和4位校验位,总共编码为11位。

2. 生成生成矩阵:根据校验位的数量,生成对应的生成矩阵。

例如,对于7位信息位和4位校验位,生成矩阵为:```G = [1 0 0 0 1 0 10 1 0 0 1 1 00 0 1 0 1 1 10 0 0 1 1 1 1]```3. 编码:将信息位与生成矩阵相乘,得到编码后的数据。

例如,信息位为`1101010`,编码后的数据为`1111000110`。

4. 译码:在接收端,首先计算每个校验位的值。

如果所有校验位的值都为0,则认为没有错误。

否则,通过计算错误位置,纠正错误。

5. 纠错:如果检测到错误,根据错误位置进行纠正。

例如,如果检测到第3位(校验位)错误,则将其反转。

四、实验步骤1. 编码过程:- 初始化信息位和校验位。

- 使用生成矩阵对信息位进行编码。

- 输出编码后的数据。

2. 译码过程:- 初始化校验位。

- 计算每个校验位的值。

- 根据校验位的值判断是否有错误。

- 如果有错误,纠正错误。

3. 纠错过程:- 根据错误位置,反转对应的位。

五、实验结果与分析1. 正确性验证:通过实验验证,编码后的数据在传输过程中发生单个错误时,能够被正确纠正。

汉明码编译码实验报告

汉明码编译码实验报告引言:汉明码是一种检错纠错编码方法,常用于数字通信和计算机存储中。

它通过在数据中插入冗余位,以检测和纠正错误,提高数据传输的可靠性。

本实验旨在通过编写汉明码的编码和解码程序,对汉明码的编译码原理进行实际验证,并分析其性能。

一、实验目的:1. 了解汉明码的编码和解码原理;2. 掌握汉明码编码和解码的具体实现方法;3. 验证汉明码在检测和纠正错误方面的有效性;4. 分析汉明码的性能及其应用范围。

二、实验原理:1. 汉明码编码原理:汉明码的编码过程主要包括以下几个步骤:(1)确定数据位数和冗余位数:根据要传输的数据确定数据位数n,并计算冗余位数m。

(2)确定冗余位的位置:将数据位和冗余位按照特定规则排列,确定冗余位的位置。

(3)计算冗余位的值:根据冗余位的位置和数据位的值,计算每个冗余位的值。

(4)生成汉明码:将数据位和冗余位按照一定顺序排列,得到最终的汉明码。

2. 汉明码解码原理:汉明码的解码过程主要包括以下几个步骤:(1)接收数据:接收到经过传输的汉明码数据。

(2)计算冗余位的值:根据接收到的数据,计算每个冗余位的值。

(3)检测错误位置:根据冗余位的值,检测是否存在错误,并确定错误位的位置。

(4)纠正错误:根据错误位的位置,纠正错误的数据位。

(5)输出正确数据:输出经过纠正后的正确数据。

三、实验过程:1. 编码程序设计:根据汉明码编码原理,编写编码程序,实现将输入的数据进行编码的功能。

2. 解码程序设计:根据汉明码解码原理,编写解码程序,实现将输入的汉明码进行解码的功能。

3. 实验数据准备:准备一组数据,包括数据位和冗余位,用于进行编码和解码的实验。

4. 编码实验:将准备好的数据输入编码程序,得到编码后的汉明码。

5. 传输和接收实验:将编码后的汉明码进行传输,模拟数据传输过程,并接收传输后的数据。

6. 解码实验:将接收到的数据输入解码程序,进行解码,检测和纠正错误。

7. 实验结果分析:分析编码和解码的正确性,检测和纠正错误的能力,并对汉明码的性能进行评估。

汉明码编译码实验

7、心得体会
本次实验较为简单,我们小组很快就能做出来,而且实验原理及实验结果也很容易看懂,所以我们在很短的时间就完成了本次实验,唯一就是需要记录的数据较前两次实验较多,所以本次记录的时间就较多,不过我们还是成功的完成了本次实验。
1100
1101
1110
1111
五、实验记录与处理(数据、图表、计算等)
汉明码编码规则验证:
输入
编码输出
α6α500
0000000
0001
0001011
0010
0010101
0011
0011110
0100
0100110
0101
0101101
0110
0110011
(1)将2号模块的拨码开关S12#拨为10100000,拨码开关S22#、S32#、S42#均拨为00000000;
(2)将6号模块的拨码开关S16#拨为0001,即编码方式为汉明码。开关S36#拨为0000,即无错模式。按下6号模块S2系统复位键。
3、此时系统初始状态为:2号模块提供32K编码输入数据,6号模块进行汉明编译码,无差错插入模式。
0111
0111000
输入
编码输出
α6α5α4α3
α6α5α4α3α2α1α0
1000
1000111
1001
1001100
1010
1010010
1011
1011001
1100
1100001
1101
1101010
1110
1110100
1111
1111111
六、实验结果及分析
本项目通过改变输入数字信号的码型,观测延时输出,编码输出及译码输出,验证汉明码编译码规则。

汉明码实验报告

实验名称:汉明码十三、实验环境软件环境:Windows 2000, Microsoft Visual C++6.0硬件环境:P4,2.4GHz,256内存,IBM-PC及兼容机十四、实验目的了解汉明码的编码原理,纠错原理,译码原理;给定汉明码的监督矩阵,能够写出生成矩阵,能够通过监督矩阵或生成矩阵进行编码,能够通过监督矩阵进行校码与译码,会计算汉明码的错误概率以及导出增余汉明码等相关知识。

十五、实验内容在Microsoft Visual c++ 6.0软件环境下,编写一个程序,使之实现汉明码以及增余汉明码的编码、检码、译码过程。

1、通过对书本的学习,以及对课堂知识的掌握,了解汉明码的纠错原理,编写出汉明码的纠错程序。

2、基于汉明码的编写,进一步完成对检码译码及增余汉明码的实现。

3、实验验证程序的合理性,结果的正确性,和结构的完善性。

十六、实验过程与实验结果源程序:#in clude<iostream>#in cludevstri ng>using n amespace std;#define Pe 0.0001class HMCodi ng{private:int n ,k,r;〃汉明码参数int i,j;〃用于指示循环次数int **H,*X,**G ,**check_code;stri ng *H_Colu mn ,*H_Colu mn _Z,code_str;int code_ nu m,code_ num_z;public:void In itializi ng(i nt,i nt);void Show_H(i nt,i nt);void Get_G();void Show_G(i nt,i nt);void HM_Efficiency_Analysing();/*对汉明码进行编码效率分析*/int Bin ary_Str_Check(stri ng);void En codi ng();〃汉明码编码void En codi ng_Z();〃增余汉明码编码void Decodi ng();〃汉明码译码void Decodi ng_Z();〃增余汉明码译码void Get_H_Colum n();〃获取汉明码监督矩阵的每一列void Get_H_Colu mn _Z();//获取增余汉明码监督矩阵的每一列void Get_Judge_Result();/获取汉明码校码结果void Get_Judge_Result_Z();/获取增余汉明码校码结果初 始 化 模 块void Check in g();〃 汉明码校码 void Checki ng_Z();〃增余汉明码校码 void GOTO_HMCdi ng_Z();};HMCodi ng hmcodi ng;〃 全局变量/******************************************************************/ void HMCod in g::I nitializ in g(i nt _n ,i nt _k) { 一 一n=_n;k=_k;r=_n-_k;cout«"请给定("<<n<<" ,"<<k<<")汉明码的监督矩阵H["vvrvv"]["vv nvv"]:"v<e ndl;H=new int *[叶 1];//初始化(n,k)汉明码监督矩阵for(i=0;i< r+1;i++)H[i]=new int[n+1];for(i=0;i<r;i++)for(j=0;j <n ;j++)cin >>H[i][j];//初始化增余项for(j=0;j< n+1;j++)H[r][j]=1;for(i=0;i<r;i++)H[i][ n]=0;//为X 分配存储单元X=new int[n+1];for(j=0;j< n+1;j++)X[j]=0;Get_H_Colum n();〃获取监督矩阵的每一列Get_H_Colum n_Z();〃进一步获取增余监督矩阵的每一列}〃获取监督矩阵的每一列,用于汉明码校码void HMCodi ng::Get_H_Colum n(){ 一 一stri ng temp;H_Column=new stri ng[n+1];for(i=0;i <n ;i++){temp="";for(j=0;j<r;j++){if(!H[j][i]) temp+='0';elsetemp+='1';}H_Colu mn [i]=temp;} _H_Colu mn[n ]="000";}〃获取增余监督矩阵的每一列,用于增余汉明码校码void HMCodi ng::Get_H_Colum n_Z(){ ~ ~ ~H_Colu mn_Z=new stri ng[n+2];for(i=0;i< n+1;i++)H_Colum n_Z[i]=H_Colum n[ i]+'1'; H_Colu mn _Z[ n+1]="0000"; }void HMCodi ng::Show_H(i nt x,i nt y){ _for(i=0;i<x;i++){for(j=0;jvy;j++)cout<<H[i][j]<<"";cout«e ndl;}}void HMCod in g::Get_G(){G=new int *[k];for(i=0;i<k;i++)G[i]=new int[n];for(i=0;i<k;i++)for(j=0;j<k;j++){if(i==j)G[i][j]=1; elseG[i][j]=0;}for(i=0;i<r;i++)for(j=0;j<k;j++)G[j][i+k]=H[i][j];}void HMCodi ng::Show_G(i nt x,i nt y)"<<e ndl; 码的{Get_G();for(i=0;i<x;i++){for(j=0;j<y;j++) cout«G[i][j]vv"" cout«e ndl;}}void HMCodi ng::HM_Efficie ncy_A nalysi ng(){cout«"对("<<*<", "<<k<<")汉明码的评价如下: cout«"( "vvnvv" , "vvkvv"E=k/ n*100%="vvk*1.0/n*100<v"%"vve ndl;cout«" ( "<< n<<" , "vvkvv")P=n*(n-1)*Pe*Pe="<< n*( n-1)*Pe*Pe<<e ndl;} /******************************************************************/〃二进制序列合理性检测int HMCodi ng::Bi nary_Str_Check(stri ng temp){ 一 一int flag=1;//先假设输入的消息串不含除0、1外的字符for(int i=0;temp[i]!='\0';i++){if(!(temp[i]=='0'||temp[i]=='1')) {flag=0; break;}} retur n flag;}〃汉明码编码void HMCodi ng::E ncodi ng(){A: stri ng bin ary_str;int flag;int binary_num=0;coutvv"请输入待编码的二进制序列:"<<e ndl;cin>>bin ary_str;flag=Bi nary_Str_Check(bi nary_str);while(bi nary_str[bi nary_nu m]!='\0')bin ary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%k!=O&&flag)/*序列所含码元个数不是 k 的整数倍,无法 全部编码*/{coutvv"您输入的二进制序列存在冗余,请重新输入!\n";goto A;}if(bi nary_num%k!=O&&!flag){ _coutvv"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!\n";goto A;}if(bi nary_num%k==0&&!flag){ _coutvv"您输入的二进制序列含除0、1外的字符,请重新输入!\n"; goto A;}code_str="";for(i=O;i<b inary_nu m;i=i+k){for(j=O;j<k;j++)/* 获取k 位信息元*/{if(bi nary_str[i+j]=='O')X[j]=O;elseX[j]=1;}int temp;stri ng partial_str="";for(i nt t=O;t< n;t++){/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/temp=O;for(j=O;j<k;j++)temp+=X[j]*G[j][t];if(temp%2==O)partial_str+='O';elsepartial_str+='1';}code_str+=partial_str;} 一一coutvv"进行("vv*v","vvkvv")汉明码编码后的二进制序列为:\n"< vcode_strvve ndl;计算机科学与工程系竺}〃增余汉明码编码void HMCodi ng::E ncodi ng_Z(){ _ code_str="";A_Z:stri ng bi nary_str;int flag;int binary_num=O;coutvv"请输入待编码的二进制序列:"<<e ndl;cin>>bin ary_str;flag=Bi nary_Str_Check(bi nary_str);while(bi nary_str[bi nary_nu m]!='\0')bin ary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%k!=0&&flag)/*序列所含码元个数不是k的整数倍,无法全部编码*/{coutvv"您输入的二进制序列存在冗余,请重新输入!\n";goto A_Z;} _if(bi nary_num%k!=O&&!flag){ _coutvv"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!\n";goto A_Z;} _if(bi nary_num%k==0&&!flag){coutvv"您输入的二进制序列含除0、1外的字符,请重新输入!\n"; gotoA_Z;}for(i=0;ivb inary_nu m;i=i+k){ _for(j=0;jvk;j++)/* 获取k 位信息元*/{if(bi nary_str[i+j]=='0')X[j]=0;elseX[j]=1;}int temp;stri ng partial_str="";for(i nt t=0;tv n;t++){/*用k位信息元组成的向量与生成矩阵作矩阵乘法,得到对应n元码组*/ temp=O; for(j=0;j<k;j++) temp+=X[j]*G[j][t]; if(temp%2==0){ partial_str+='O'; X[j+k]=O;} else{ partial_str+='1'; X[j+k]=1;}}//生成增余汉明码最后一位//监督规则:对原汉明码所有n个码元取模2和int sum=0;for(j=0;j <n ;j++)sum+=X[j];if(sum%2==0)partial_str+='0';elsepartial_str+='1';code_str+=partial_str;} 一一cout«"进行("<<n+1<<","<<k<<")增余汉明码编码后的二进制序列为:\n"< <code_str<<e ndl;}/********************************* 校*********************************/〃利用汉明码校码void HMCodi ng::Checki ng(){B: stri ng bi nary_str;int flag;int binary_num=0;coutvv"请输入待译的二进制序列:"<<e ndl;cin>>bin ary_str;flag=Bi nary_Str_Check(bi nary_str);while(bi nary_str[bi nary_nu m]!='\0')bin ary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%n!=0&&flag)/*序列所含码元个数不是n的整数倍,无法全部译码*/{coutvv"您输入的二进制序列存在冗余,请重新输入!\n";goto B;}if(bi nary_num% n!=0&&!flag) { _coutvv"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!\n";goto B;}if(bi nary_num% n==0&&!flag){coutvv"您输入的二进制序列含除0、1外的字符,请重新输入!\n"; goto B;}code_num=binary_num/n;/统计n 元码组的个数check_code=new in t*[code_ nu m];for(i=0;i<code_ nu m;i++)check_code[i]=new in t[ n];for(i=0;i<code_ nu m;i++){/*每次取n个码元进行校正*/for(j=0;j< n;j++){check_code[i][j]=b in ary_str[i* n+j]-'0';} 一一} Get_Judge_Result();} 一一〃利用增余汉明码校码void HMCodi ng::Checki ng_Z(){ _B_Z:stri ng bin ary_str;int flag;int binary_num=0;coutvv"请输入待译的二进制序列:"<<e ndl;cin>>bin ary_str;flag=Bi nary_Str_Check(bi nary_str);while(bi nary_str[bi nary_nu m]!='\0')bin ary_num++;/*统计输入的二进制序列所含码元个数*/if(binary_num%(n+1)!=0&&flag)/*序列所含码元个数不是n+1的整数倍,无法全部译码*/ -{coutvv"您输入的二进制序列存在冗余,请重新输入!\n";goto B_Z;} _if(bi nary_num%( n+1)!=0&&! flag){ _coutvv"您输入的二进制序列存在冗余且含除0、1外的字符,请重新输入!\n";goto B_Z;} _if(bi nary_num%( n+1)==0&&! flag){ _coutvv"您输入的二进制序列含除0、1外的字符,请重新输入!\n";goto B_Z;} _code_num_z=binary_num/(n+1);/统计n+1 元码组的个数check_code=new in t*[code_ nu m_z];for(i=0;i<code_ nu m_z;i++)check_code[i]=new int[n+2];for(i=0;i<code_ nu m_z;i++){/*每次取n+1个码元进行校正*/for(j=0;j< n+1;j++){check_code[i][j]=bi nary_str[i*( n+1)+j]-'0';} 一一}Get_Judge_Result_Z();} 一一一〃获取汉明码校码结果void HMCodi ng::Get_Judge_Result(){ 一一int temp;int flag;stri ng partial_str;coutvv" ("vv*v","vvkvv")汉明码校码结果如下:"<<endl;coutvv"码组状态校正后"vve ndl;for(i nt t=0;tvcode_ nu m;t++){ _flag=0;partial_str="";for(i=0;ivr;i++){temp=0;for(j=0;j vn ;j++)temp+=H[i][j]*check_code[t][j];if(temp%2==0)partial_str+='0';elsepartial_str+='1';//对partial_str进行判断for(i=0;i< n+1;i++){if(H_Colu mn [i]==partial_str) { 一一flag=1;break;}}if(flag&&i<n)〃表示第i个码元出错,将其改正{for(j=0;j <n ;j++)cout<<check_code[t][j];cout«" 第"<<i+1<<"位错,可纠正";check_code[t][i]=(check_code[t][i]+1)%2;//1 变0, 0 变1 for(j=0;j<n ;j++)cout<<check_code[t][j];}if(flag&&i==n)〃表示全对{for(j=0;j <n ;j++) cout<<check_code[t][j];cout«" 全对";for(j=0;j <n ;j++)cout<<check_code[t][j];} _cout«e ndl;}}〃获取增余汉明码校码结果void HMCodi ng::Get_Judge_Result_Z(){ 一一一int temp;int flag;stri ng partial_str;cout«"( "<<n+1<<","<<k<<")增余汉明码校码结果如下(注:*表示无法识别的码元):"<<endl;cout«"码组状态校正后"<<e ndl;for(i nt t=0;t<code_ nu m_z;t++){flag=0;partial_str="";for(i=0;i< r+1;i++){temp=O; for(j=0;jv n+1;j++)temp+=H[i][j]*check_code[t][j];if(temp%2==0)partial_str+='O';elsepartial_str+='1';} _//对partial_str进行判断for(i=0;i< n+2;i++){if(H_Colu mn _Z[i]==partial_str){ ~ ~ 一flag=1;break;}}if(flag&&i<n+1)〃表示第i个码元出错,将其改正{check_code[t][ n+1]=1;〃表示正确接收for(j=0;j< n+1;j++)cout<<check_code[t][j];cout«" 第"<<i+1<<"位错,可纠正check_code[t][i]=(check_code[t][i]+1)%2;//1 变0, 0 变1 for(j=0;j<n+1;j++)cout<<check_code[t][j];} _if(flag&&i==n+1)// 表示全对{check_code[t][ n+1]=1;〃表示正确接收for(j=0;j< n+1;j++)cout<<check_code[t][j];cout«" 全对";for(j=0;j< n+1;j++)cout<<check_code[t][j];} _if(!flag){check_code[t][ n+1]=0;〃表示两位出错并无法纠正for(j=0;j<n+1;j++)cout<<check_code[t][j];coutvv" 某两位出错,无法纠正";for(j=0;j< n+1;j++)coutvv'*';//*表示无法正确识别的码元表示无cout«e ndl; }}/********************************* *********************************/〃利用汉明码译码void HMCodi ng::Decodi ng() {cout<<" ( "<<n<<", "<<k<<")汉明码译码结果为:"<<endl; for(i=0;i<code_ nu m;i++) { _for(j=0;j<k;j++)cout<<check_code[i][j];} cout«e ndl; }〃利用增余汉明码译码void HMCodi ng::Decodi ng_Z() { _coutvv"( "<<n+1vv","vvkvv")增余汉明码译码结果为(注:* 法识别的码元):"<<endl;for(i=0;i<code_ nu m_z;i++){ 一 一 if(check_code[i][ n+1]==1){ _for(j=0;j<k;j++) cout<<check_code[i][j]; }else { for(j=0;j<k;j++) cout«'*'; }} cout«e ndl; }/********************************* *********************************/void HMCodi ng::GOTO_HMCd in g_Z() {char choice 仁'';cout<<"\n *************** 欢迎进入("<<n+1<<","<<k<<")增余汉明码编码/校码/译码系统****************\n";coutvv"由汉明监督矩阵导出的增余监督矩阵 H["v<叶1vv"]["vvn+1<<"]为:"<<endl;"<<e ndl;cout<v"20091883 cout<v"20091888 cout<<"20091908 cout<<"20091909 cout<<"20091911 潘柳燕"<<e ndl;李文超"<<e ndl;周发洪"<<e ndl; 吴针朋"<<endl;张丹(组长)"<<endl;hmcod in g.Show_H(r+1, n+1);Z: cout<<"\n >>>>>>>>>>>>>>>>>>>>> ("vvn+1<<","<<k<<")增余汉明码编码/校码/译码系统vvvvvvvvvvvvvvvvvvvv'n";coutvv" "vv"E.增余汉明码编码"<<" "vv"D.增余汉明码校码/译码"<<" "vv"R.返回"<<" "vv"Q.退出"<<endl;cout«"请输入您要操作的步骤:";cin> >choice1;if(choice 仁='E'||choice1=='e')/进行编码{hmcod in g.E ncod in g_Z();goto 乙}else if(choice 1=='D'||choice1=='d'){hmcod in g.Check in g_Z();hmcod in g.Decodi ng_Z();goto 乙}else if(choice1=='R'||choice1=='r')return;else if(choice1=='Q'||choice 1=='q')/退出{exit(0);}else//如果选了选项之外的就让用户重新选择{coutvv"您没有输入正确的步骤,请重新输入!"<<e ndl;goto 乙}coutvve ndl;}void mai n(){char choice='';〃用于记录初始化情况int flag=0;int n ,k;cout<v"\n09计科二班信息论第二实验小组小组成员:学号一一姓名coutvv"\n ************************* 汉明码编码/ 校码/译码系统*************************\n"・cout«"请输入汉明码的码长n=";cin>>n;cout«"请输入汉明码的信息元个数k=";cin> >k;while(choice!=Q&&choice!='q')〃当choice 的值不为q 且不为Q 时循环{C: cout<<"\n >>>>>>>>>>>>>>>>>>>>>>> ("vvn<v","vvk<v")汉明码编码/校码/译码系统vvvvvvvvvvvvvvvvvvvv\n";coutvv" "vv"l.输入建立"<<" "vv"E.汉明码编码"<<" "vv"D.汉明码校码/译码\n";cout«" "vv"Z.进入相应的增余汉明码系统"<<" "vv"Q.退出\n";coutvv"请输入您要操作的步骤:";cin> >choice;if(choice==T||choice=='i')〃初始化{if(!flag){〃初次执行初始化操作flag=1;}hmcodi ng.ln itializi ng(n, k);coutvv"您输入的监督矩阵H["<<n-k<v"]["vv*<"]为:"<<endl; hmcoding.Show_H( n-k, n);coutvv"该监督矩阵对应的生成矩阵G["v<kvv"]["vvn<<"] 为:"vve ndl;hmcodi ng.Show_G(k, n);hmcodi ng.HM_Efficie ncy_An alysi ng();} 一一else if(choice=='E'||choice=='e')/进行编码{if(!flag){coutvv"操作错误!请执行输入建立操作后再进行本操作!"vve ndl;goto C;}hmcodi ng.E ncod in g();}else if(choice=='D'||choice=='d')//校码、译码{if(!flag){coutvv"操作错误!请执行输入建立操作后再进行本操作!"<<endl;goto C;}hmcodi ng.Check in g();hmcodi ng.Decod in g();}else if(choice=='Z'||choice=='z'){if(!flag){COUtVV"操作错误!请执行输入建立操作后再进行本操作!"<<e ndl;goto C;}//进入增余汉明码系统hmcodi ng.GOTO_HMCdi ng_Z();}else if(choice==Q||choice=='q')//退出{exit(0);}else//如果选了选项之外的就让用户重新选择{coutvv"您没有输入正确的步骤,请重新输入!"<<e ndl;goto C;}cout«e ndl;}}运行结果:1首先需输入建立(n,k)汉明码3、汉明码编码注:输入的信息序列应为k 的整数倍,否则会报错>»»»»»»>>mg>» (7,4)墓明一…務谕二进制序列:曲潮请输入卡祢正确编码:码/松码/译码氢统 <<<<<<<<<<<<<<<<<<<< 祐囉严译码4、汉明码校码、译码注:待译的二进制序列应为n 的整倍数,否则报错醫统後码■X)- E”汉(7余 >増> -£n d・・等应:洌"建霧序”入入步制>>1.2.作二01制二 ”番01番 ”要译10二译码/枚码 h 译码系统 <<<<<<<<<<<<<<<<<<<< 码 嚼严译码2、给定监督矩阵,导出相应的生成矩阵,显示出错误概率及编码效率演示:全对、1位错(可纠正)5、导出相应的增余汉明码y 译码系统 <<<<<<<<<<<<<<<<<<<<I R.返回 Q ■退出很明码编码码#译码系统<<<<<<<<<<<<<<<<<<<< 汉哺码校码*臬稿乩返回Q.退岀6、增余汉明码编码注:输入的信息序列应为k 的整数倍,否则会报错»»»»»»>»»»» (8.4)很明码编码/ Ua饷 ° m舫識绷驟请重际 100001300010陡行(乳4增余汉明码编码后的二进制序列为:10000111010^101100101101»»>>»>»»»»»»(8,4)[■青输锡畫蝶會議■ D7、增余汉明码校码、译码注:待译的二进制序列应为(n+1 )的整倍数,否则报错 演示:全对、1位错(可纠正)、2位错(不可纠正)请重新输入1严译码 校正宕1000011 010010110000910100101110100101r (7.4)汉明码榜跆果如 鸭组叢态100SS91 宣&忙借, 0100101 全对^| (叫町汉明码译百唏果为 丄0观血»»»»»»»>»»»»(7,4)汉明码编码/校码/译码系统<<<<<<<<<<<<<<<<<<<< I •输入建皇”心几E-汉男独豁码---「应的壇余汉明码累统::d回瞒矍蘇D的諾卿斷余"请重新输入,1O30B11101001001oa 130001r (8( <増余汉明码璽码结果如下〔注:*表示无法识别的码 码组 o 楼正后 1000B111 全对 10000111 01001001 乏?任僭,可纠正 01 RI?lPtt BBiaaeai 集爾社出tt,无法纠正 …“… 「6 <增余汉明码译码结果为(注:共表示无法识别的码元): 1000P1 00****8退出系统>»»»»»»»»»» (s,4)増余汉明码编码/栓码#译码系统<<<<<<<<<<<<<<<<<<<< 青輸熾羈鶴輙« ^耘明码校卸詞“返回 讥出 P FES :盂 giny key to continueL」[元):I# 译码系统 <<<<<<<<<<<<<<<<<<<< I Rr 返回 4退出>»»»»»»»»»»(8,4) I10001100®AR<<出 "退■<<回<<返Vs蓉»>»»»»»>>»»» 増金很明码编码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

加错位置 从 0 位置加错 从 1 位置加错 从 2 位置加错 从 3 位置加错 ……. 从 15 位置加错
加错位置 加 0 位错 加 1 位错 加 2 位错 加 3 位错
从 SW103-6,SW103-5,SW103-4,SW103-3 指示的位置开始,每帧加错的位数有 SW103-2,SW103-1 的状 态决定。 5、编码输出设置 D116,D115,D114,D113,D112,D111,D110,D109,D108,D107,D106,D105,D104,D103, D102,D101 为 16 位编码输出位。TP102 和 TP103 分别可以测量编码输出的帧和对应该帧的时钟信号。 6、解码方式选择 SW201-3,SW201-2,SW201-1 000 001 010 解码方式 汉明码解码 CRC 解码 BCH 码解码
semilogy(-2:5,biterr,'*'); hold on; semilogy(-2:5,biterr); xlabel('SNR(dB)'); ylabel('BER'); grid on; 3、仿真结果 (1)编解码波形
(2)白高斯噪声信道误码率仿真结果
五、实验中的汉明码编解码程序
1、汉明编码
010 011 100 101 110 111 3、信道选择(选择加错位置) SW103-6,SW103-5,SW103-4,SW103-3 0000 0001 0010 0011 …… 1111 4、加错数目选择 SW103-2,SW103-1 00 01 10 11
BCH 码编码 卷积码编码 Turbo 码编码 扩展用 扩展用 汉明码交织编码
AWGN Channel的参数SNR设置为SNR; Bernoulli Binary Generator的参数Sample Time设置为SampleTime。 2、仿真程序 clear all; SampleTime=1; SNR=1; sim('hammingsim'); figure(1); subplot(2,2,1); stem(hammingin); title('编码输入序列'); subplot(2,2,2); stem(hammingen); title('编码输出序列'); subplot(2,2,3); stem(hammingene); title('解码输出序列'); subplot(2,2,4); stem(hammingde); title('解码输出序列'); clear all; SampleTime=1/1000; for i=1:8 SNR=i-3; sim('hammingsim'); biterr(i)=0; for j=1:length(err) biterr(i)=biterr(i)+err(j,1); end; biterr(i)=biterr(i)/length(err); end; figure(2);
实验一 汉明码编解码实验
一、实验目的
1、掌握汉明码的编解码原理。 2、掌握汉明码的软件仿真方法。 3、掌握汉明码的硬件仿真方法。 4、掌握汉明码的硬件设计方法。
二、预习要求
1、掌握汉明码的编解码原理和方法。 2、熟悉 matlab 的应用和仿真方法。 3、熟悉 Quatus 的应用和 FPGA 的开发方法。
三、实验原理
1、信道编码的概念 通信信号是通过信道的传输,从信源传到信宿。由于信道有着不同的特征,这些特征将会影响传输中 的通信信号,使信宿不能正确接受和识别信源的信号。因此需要采取各种方式抗信道干扰,信道编码就是 一种广泛采用的抗信道干扰的方法。信道编码的思想是按照一定规律在待发送的信息码中加入一些冗余的 信息,接收端根据这些冗余信息和信息码来恢复原来的信号。因此,信道编码的任务就是以最小的冗余代 价来换取抗干扰性能最好的码。 2、汉明码的原理 汉明码是 1949 年提出的一种能纠正单个错误的线性分组码。实验中采用的含明码为(7,4)汉明码,其 采用的本原多项式为 f ( x ) x x 1 。 其生成矩阵为 G=[1011000,1110100,1100010,0110001]。 监督矩阵为:H=[1001110,0100111,0011101]。 当输入编码序列为 I 时,输出编码序列 R=IG,输出的编码序列为系统码。接收的待译码序列 D=R +E,E 为错误序列。错误图样 S=DHT,根据错误图样 S 可以判决得到错误序列 E。将错误序列和接收的 待译码序列运算可以得到正确的译码输出。 设 (7, 4) 汉明码中共有 4 个信息码, 3 个监督码。 我们用 a6 a5 a4 a3 a2 a1a0 表示这 7 个码元, 用 S1,S2,S3 表示三个监督关系式中的校正子,则 S1,S2,S3 的值与错码的位置的对应关系规定如下表所示: (其中 S1 a6 a5 a4 a2 ; S 2 a6 a5 a3 a1 ; S 3 a6 a4 a3 a0 )
七、实验内容
1、用 matalab 中的 simulink 对(7,4)汉明码进行软件仿真,绘制(7,4)汉明码的误码率图,分析它的纠 错能力和码率; 2、在 Quatus 中分别对(7,4)汉明码的编码和解码程序进行仿真,分析(7,4)汉明码的编解码过程; 3、 在实验系统中, 分别置 SW102-2, SW102-1, SW102-0 为”000”和 SW201-3, SW201-2, SW201-1 为”000”, 选择汉明码编解码方式。置 SW103-6,SW103-5,SW103-4,SW103-3,SW103-2,SW103-1 为”000000”, 即不加任何错。 4、由 SW101-8, SW101-7 ,SW101-6 , SW101-5, SW101-4 ,SW101-3 , SW101-2, SW101-1 任意输入 8 位数据,观察并记录 D116,D115,D114,D113,D112,D111,D110,D109,D108,D107,D106,D105, D104,D103,D102,D101 对应的编码后的输出数据。其中 D115,D114,D113,D112,D111,D110, D109 对应于 SW101-8,SW101-7,SW101-6,SW101-5 输入的四位数据的汉明码编码结果;D107,D106, D105,D104,D103,D102,D101 对应于 SW101-4,SW101-3,SW101-2,SW101-1 输入的四位数据的汉 明码编码结果。D116 和 D108 为保持一帧 16 位的补零数据。 5、用示波器分别测量 TP102 和 TP103,观察并编码输出的帧的帧格式。 6、观察并记录解码数据输出端 D208,D207,D206,D205,D204,D203,D202,D201 的解码输出状态和错误指示 灯(当判断出数据有错码时就指示)D220 的输出状态。看是否译码正确。 7、通过 SW103-6,SW103-5,SW103-4,SW103-3,SW103-2,SW103-1 选择在任意位置设置一位错误。 8、看看解码模块的解码输出数据 D208,D207,D206,D205,D204,D203,D202,D201 以及误码指示 D220。看是 否译码正确。 9、换几组数据(至少 4 组数据)重复上述步骤 3-8。
011 100 101 110 111
卷积码解码 Turbo 码解ቤተ መጻሕፍቲ ባይዱ 扩展用 扩展用 汉明码交织解码
7、解码数据输出端:D208,D207,D206,D205,D204,D203,D202,D201。错误指示灯(当判断出数据有错码时 就指示) :D220。 8、其他:七段码显示表明维特比译码的四路路径度量。
如图所示:编码输入为 0001,编码输出为 0001011。 2、汉明解码 (1)端口设置 cs_hanming:输入汉明解码设置使能位,’1’电平有效; datain_hanming:输入 7 位汉明编码位; error_hanming:输出错误标志位,当信道加错时,输出‘1’电平表示信道有错; dataout_hanming:输出 4 位汉明解码位。 (2)主要程序 --产生错误图样 sel(2)<=(datain_hanming(6) xor datain_hanming(5)) xor (datain_hanming(4) xor datain_hanming(2)); sel(1)<=(datain_hanming(6) xor datain_hanming(5)) xor (datain_hanming(3) xor datain_hanming(1)); sel(0)<=(datain_hanming(6) xor datain_hanming(4)) xor (datain_hanming(3) xor datain_hanming(0)); --输出错误序列 with sel select
(1)端口设置 cs_hanming:输入汉明编码使能位,’1’电平有效; datain_hanming:输入 4 位编码输入位; dataout_hanming:输出 16 位编码输出位,低 7 位为编码输出位,高 9 位为 0。 (2)主程序 if cs_hanming='1'then dataout_hanming(6 downto 3)<=datain_hanming(3 downto 0); dataout_hanming(0)<=datain_hanming(3) xor datain_hanming(1) xor datain_hanming(0); dataout_hanming(1)<=datain_hanming(3) xor datain_hanming(2) xor datain_hanming(0); dataout_hanming(2)<=datain_hanming(3) xor datain_hanming(2) xor datain_hanming(1); dataout_hanming(15 downto 7)<="000000000"; else dataout_hanming(15 downto 0)<="0000000000000000"; end if; (3)输出结果
相关文档
最新文档