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码的局限性,它只能纠正单一比特错误。
在实际应用中,我们需要根据具体需求选择适当的纠错编码方式,以确保数据的可靠性和完整性。
海明码的实验报告

海明码的实验报告一、实验目的和背景海明码(Hamming Code)是一种能够检测和纠正单一错误的错误检测和纠正编码方法,它使用了冗余位(Redundancy Bit)来增加数据的可靠性。
本实验的目的是通过编写程序来实现海明码的生成、纠正和检测功能,并验证海明码的可靠性。
二、实验内容与步骤1. 生成海明码:编写程序实现海明码的生成功能,读取输入的原始数据并生成相应的海明码。
2. 引入错误:编写程序在生成的海明码中引入1个错误位。
3. 纠正错误:编写程序实现海明码的错误纠正功能,通过纠正之后的码字与原始数据进行比对,验证纠正效果。
4. 检测错误:编写程序实现海明码的错误检测功能,通过检测错误的海明码数据,输出错误位置。
三、实验过程与结果1. 生成海明码根据海明码的生成规则,我们编写了一个生成海明码的程序。
用户在控制台输入原始数据,程序经过处理后输出相应的海明码。
例如,输入数据为`1101`,生成的海明码为`1101001`。
2. 引入错误在生成的海明码中,我们通过编写程序随机选择一个位置并进行改写,引入1个错误位。
例如,原本生成的海明码为`1101001`,改写后为`1101101`。
3. 纠正错误根据海明码的纠正规则,我们编写了一个纠正错误的程序。
用户输入引入错误后的海明码,程序经过处理后输出经过纠正后的码字。
例如,输入的海明码为`1101101`,经过纠正后输出的码字为`1101001`。
4. 检测错误根据海明码的检测规则,我们编写了一个检测错误的程序。
用户输入海明码,程序经过处理后输出错误位置。
例如,输入的海明码为`1101101`,程序输出错误位置为`5`。
四、实验结果分析通过实验结果可以得出以下结论:1. 海明码的生成功能能够准确地将原始数据转换成相应的海明码。
2. 引入错误后,海明码的纠正功能可以将引入的错误位纠正回原始数据。
3. 海明码的检测功能能够准确地检测出错误位置。
综上所述,海明码具有较高的可靠性,能够有效地检测和纠正单一错误。
Hamming(7,4)编译码器实验报告8.8

8.8 Hamming(7,4)编译码器1.1实验目的·加深理解Hamming(7,4)码的编码方法和抗干扰性能;·通过编程实现Hamming(7,4)码的编码算法,进一步掌握按位二进制加法的实现原理。
1.2 实验原理·输入:长度为4的任意二进制序列。
·输出:输入数据经Hamming(7,4)编码器编码之后,通过8.7节的BSC信道(错误概率为0.1)传输后,再经过Hamming(7,4)译码器译码输出得到信宿端的长度为4的二进制序列。
·源程序格式整齐清晰,注释简单明了。
1.3 实验内容1.3.1 算法描述Hamming(7,4)码的生成矩阵为G=1000101 0100110 0010111 0001011⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦其校验矩阵为H=1110100 0111010 1011001⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦1.3.2 实验程序#include<stdio.h>#define M 7#define N 3int fun(int a,int b){if(a==b)return (0);elsereturn (1);}int main(void){int a[M],i,p[N];printf("请输入四位码 m1,m2,m3,m4:");scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]);p[0]=fun(fun(a[0],a[1]),a[2]);p[1]=fun(fun(a[0],a[2]),a[3]);p[2]=fun(fun(a[1],a[2]),a[3]);printf("%d%d%d%d%d%d%d\n",a[0],a[1],a[2],a[3],p[0],p[1],p[2]);return 0;}1.3.3 运行结果1.3.4 结果分析·运行结果正确。
汉明码编码实验报告

重庆工程学院
电子信息学院
实验报告
课程名称:_ 数据通信原理开课学期:__ 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.ZH5001A通信原理综合实验系统
2.20MHz双踪示波器
三、实验内容
2.编码规则验证
(1)输入数据为0011
(2)输入数据为1100
3.译码数据输出观测
(1)m序列方式为11
(1)不加错
♦观测加错指示TPC03与错码检测指示输出波形TPW03波形
(2)加1位错
♦观测加错指示TPC03与错码检测指示输出波形TPW03波形
(4)加3位错
(1)不加错
加2位错不能全部正确译码
(4)加3位错
四、思考题
2.汉明编码器模块的使能开关,译码器模块的使能模块(H_EN断路器)起什么作用?
从电路图中可以看出,没有插入H_EN时,汉明编码器被短路,输出数据没有经过汉明编码。
插入H_EN时,输出数据经过汉明编码。
北京交通大学-通信原理实验-汉明编码实验报告

通信原理实验电子信息工程学院实验十五汉明编码和译码实验实验前的准备(1) 预习本实验的相关内容。
(2) 熟悉实验指导书附录B和附录C中实验箱面板分布及测试孔位置相关模块的跳线状态。
(3) 实验前重点熟悉的内容:汉明码的编码规则、汉明码的纠错能力。
⑷思考题。
2)本实验中汉明编码器的输入数据速率为32kbps,输出数据速率为多少?为汉明编码器的输入信号选择m序列信号时,跳线开关SWCO1KCO1如何汉明编码器的输入信号选择来自ADPC模块的实验目的(1) 掌握汉明码编译码原理。
(2) 掌握汉明码纠错检错原理。
(3) 通过纠错编解码实验,加深对纠错编解码理论的理解。
三、实验仪器(1) ZH5001A通信原理综合实验系统⑵20MHz双踪示波器四、基本原理差错控制编码的基本原理是:由发送端的信道编码器在信息码元序列中增加一些监督码元。
这冗余的码元与信息之间以某种确定的规则建立校验关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。
不同的编码方法有不同的检错或纠错能力。
为了纠正位错码,在分组码1中最少要加入多少监督位才可行呢?编码效率能否提高呢?从这种思想出发进行研究,便导致了汉明码的诞生。
汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。
下面介绍汉明码的编码原理。
一般来说,若码长为n,信息位数为k,记作(n, k)码,则监督位数r n k,如果希望用r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求2r 1 n 或2r k r 1通信原理综合实验系统中的纠错码系统采用(7, 4)汉明码。
用a6a5…a。
表示这7个码元,用3、S?、$表小3个监督关系式中的校正子,则S&2S3的值与码元间构成偶数监督关系:a6a5a4a2S2a4a4a3a i S3a6a5a3a。
在发送端编码时,信息位玄6、85、a4和a3的值决定于输入信号,因此它们是随机的。
监督位a“印和a。
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码的检错能力和纠错能力。
实验报告书汉明码设计与实现

实验报告书------汉明码设计与实现汉明码编译码器系统班级: 姓名: 学号:一.实验原理描述1.1汉明码编码原理一般来说,若汉明码长为n ,信息位数为k ,则监督位数r=n-k 。
若希望用r 个监督位构造出r 个监督关系式来指示一位错码的n 种可能位置,则要求21r n -≥或211rk r -≥++(1)下面以(7,4)汉明码为例说明原理:设汉明码(n,k )中k=4,为了纠正一位错码,由式(1)可知,要求监督位数r ≥3。
若取r=3,则n=k+r=7。
我们用6543210a a a a a a a 来表示这7个码元,用123s s s 的值表示3个监督关系式中的校正子,则123s s s 的值与错误码元位置的对应关系可以规定如表1所列。
表1 校正子和错码位置的关系则由表1可得监督关系式: S 1=a 6⊕a 5⊕a 4⊕a 2 (2)S 2=a 6⊕a 5⊕a 3⊕a 1(3)S 3=a 6⊕a 4⊕a 3⊕a 0(4) 在发送端编码时,信息位6543a a a a 的值决定于输入信号,因此它们是随机的。
监督位2a 、1a 、0a 应根据信息位的取值按监督关系来确定,即监督位应使式(2)~式(4)中1s 、2s 、3s的值为0(表示编成的码组中应无错码){a 6⊕a 5⊕a 4⊕a 2=0a 6⊕a 5⊕a 3⊕a 1=0a 6⊕a 4⊕a 3⊕a 0=0(5)式(5)经过移项运算,接触监督位{a 2=a 6⊕a 5⊕a 4a 1=a 6⊕a 5⊕a 3a 0=a 6⊕a 4⊕a 3(6)式(5)其等价形式为: [1 1 1 0 1 0 01 1 0 1 0 1 01 0 1 1 0 0 1][ a 6a 5a 4a 3a 2a 1a 0]=[000](7)式(6)还可以简记为H ∙A T =0T 或A ∙H T =0 (8)其中H =[1 1 1 0 1 0 01 1 0 1 0 1 01 0 1 1 0 0 1]A =[a 6a 5a 4a 3a 2a 1a 0]P =[1 1 1 01 1 0 11 0 1 1]I r =[1 0 00 1 00 0 1]0=[0 0 0]所以有H =[PI r ](9)式(6)等价于[a 2a 1a a ]=[a 6 a 5 a 4 a 3][1 1 11 1 01 0 10 1 1]=[a 6 a 5 a 4a 3]Q (10)其中Q 为P 的转置,即T Q P (11)式(10)表示,信息位给定后,用信息位的行矩阵乘矩阵Q 就产生出监督位。
汉明码实验报告

Information Theory and Coding*名:**学号:**********班级:信息0704指导老师:**一、实验题目:Hamming Error Correction Code二、实验背景:当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错,简单的说,汉明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为汉明码。
与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。
利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置。
在接受端通过纠错译码自动纠正传输中的差错来实现码纠错功能,称为前向纠错FEC。
在数据链路中存在大量噪音时,FEC可以增加数据吞吐量。
通过在传输码列中加入冗余位(也称纠错位)可以实现前向纠错。
但这种方法比简单重传协议的成本要高。
汉明码利用奇偶块机制降低了前向纠错的成本。
In telecommunication, a Hamming code is a linear error-correcting code named after its inventor, Richard Hamming. Hamming codes can detect up to two simultaneous bit errors, and correct single-bit errors; thus, reliable communication is possible when the Hamming distance between the transmitted and received bit patterns is less than or equal to one. By contrast, the simple parity code cannot correct errors, and can only detect an odd number of errors.In mathematical terms, Hamming codes are a class of binary linear codes. For each integer m > 2 there is a code with parameters: [2m − 1,2m − m − 1,3]. The parity-check matrix of a Hamming code is constructed by listing all columns of length m that are pairwise independent.Because of the simplicity of Hamming codes, they are widely used in computer memory (RAM). In particular, a single-error-correcting and double-error-detecting variant commonly referred to as SECDED汉明码输入输出演示纠错码的生成Hamming(7,4) cod eHamming(11,7) cod e纠错能力:设数据位数为m,校验位数为k,则总编码位数为n,n=m+k,有Hamming不等式:对于这个不等式可以理解为:由于n位码长中有一位出错,可能产生n个不正确的代码(错误位也可能发生在校验位),所以加上k位校验后,就需要定位昭m+k(=n)个状态。
汉明码实验报告

一、实验目的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、加深对hanming码的产生、加错、纠错、译码的过程。
二、实验仪器1、JH5001通信原理综合实验系统一台2、20MHz双踪示波器一台3、JH9001型误码测试仪(或GZ9001型)一台三、实验原理差错控制编码的基本作法是:在发送端被传输的信息序列上附加一些监督码元,这些多余的码元与信息之间以某种确定的规则建立校验关系。
接收端按照既定的规则检验信息码元与监督码元之间的关系,一旦传输过程中发生差错,则信息码元与监督码元之间的校验关系将受到破坏,从而可以发现错误,乃至纠正错误。
通信原理综合实验系统中的纠错码系统采用汉明码(7,4)。
所谓汉明码是能纠正单个错误的线性分组码。
它有以下特点:码长n=2m-1 最小码距d=3信息码位k=2n-m-1 纠错能力t=1监督码位r=n-k这里m位≥2的正整数,给定m后,既可构造出具体的汉明码(n,k)。
用a6、a5、a4、a3代表4个信息元,a2、a1、a0三个监督码元可表示为:a2=a6+a5+a4a1=a6+a5+a3a0=a6+a4+a3汉明译码的方法,可以采用计算校正子,然后确定错误图样并加以纠正的方法。
校正子可表示为:s1=a6+a5+a4+a2;s2=a6+a5+a3+a1s3=a6+a4+a3+a0图9.1和图9.2给出汉明编码器和译码器电原理图。
a6a5a4a3a2a1a0a6a5a4a3图9.1汉明编码器电原理图a6a5a4a3a3a3a3图9.2汉明译码器电原理图表9.1 (7,4)汉明编码输入数据与监督码元生成表a6bit,其次是a5、a4……,最后输出a0位。
四、程序设计1、设计分析首先根据实验要求绘制出框图。
如下:图1 时钟产生框图实验的输入时钟为14.336MHz,编码输入的码元速率为32kbps,生成的4位m序列码元信息,再经编码器后变成7位汉明码发送,码元速率为32*7/4=56kbps。
hamming实验报告

hamming实验报告Hamming实验报告引言:Hamming实验是一种用于错误检测和纠正的编码技术。
它由美国科学家理查德·哈明(Richard Hamming)于20世纪50年代提出,并被广泛应用于计算机科学和通信领域。
本文将介绍Hamming实验的背景、原理、实验过程和结果,并探讨其在现代技术中的应用。
一、背景:在信息传输和存储过程中,出现错误是不可避免的。
特别是在电信和计算机网络中,数据传输的准确性至关重要。
传统的奇偶校验方法只能检测错误,而无法纠正。
为了解决这个问题,Hamming提出了一种能够检测和纠正错误的编码技术。
二、原理:Hamming编码是一种基于二进制的线性块编码。
它通过在数据中插入冗余位来实现错误检测和纠正。
冗余位的数量取决于数据位的数量,并且通过一系列算法计算得出。
Hamming编码的关键思想是将数据位与冗余位进行异或运算,以便在接收端进行错误检测和纠正。
三、实验过程:1. 准备数据:选择一组二进制数据作为实验对象,例如1011。
2. 计算冗余位:根据数据位的数量,计算所需的冗余位数量。
在本例中,需要添加两个冗余位。
3. 插入冗余位:将冗余位插入数据中,形成编码后的数据。
例如,将冗余位插入1011变为1101011。
4. 传输数据:将编码后的数据传输到接收端。
5. 接收数据:接收端接收到编码后的数据。
6. 检测错误:接收端使用Hamming编码的算法检测错误位。
7. 纠正错误:如果检测到错误位,接收端可以使用Hamming编码的算法进行错误纠正。
四、实验结果:在本次实验中,我们选择了1011作为实验数据。
根据Hamming编码的原理,我们计算出了两个冗余位,并将其插入到数据中,形成了1101011的编码数据。
在传输过程中,我们模拟了一个错误位,并将其插入到编码数据中。
接收端成功检测到错误位,并进行了错误纠正。
最终,接收端得到了正确的数据1011。
五、应用:Hamming编码在现代技术中有着广泛的应用。
Hamming码实验

云南大学数学与统计学实验教学中心实验报告一、实验目的:通过实验掌握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码的检错能力和纠错能力。
*/package HammingCode;import java.util.Scanner;/*** @author卢富毓* @see实现HammingCode的生成、检错、纠错**/public class HammingCode {int[][] H;int[][] G;/*** @param start* () Hamming码的具体实现* @param HMC* 类的实例*/public void start(HammingCode HMC) {int send[] = new int[11];int receive[] = new int[15];// step1 15,11Hamming 码的校验矩阵生成H = HMC.CreateCheckArray();// step1 15,11Hamming 码的生成矩阵生成G = HMC.GenerateArray();// 输入四个字符进行编码System.out.print("请输入需编码的字符(0、1)11个:");Scanner sc = new Scanner(System.in);for (int i = 0; i < 11; i++) {send[i] = sc.nextInt();}sc.reset();HMC.encode(G, send); // 编码System.out.println("\n----------------------------------------------------------");// 输入四个字符检测编码System.out.print("请输入需译码字符(0、1)15个:");for (int i = 0; i < 15; i++) {receive[i] = sc.nextInt();}HMC.checkAndDecode(H, receive);// 检错以及译码// sc.close();}/*** @param ToBinary* 校验矩阵十进制数转为二进制矩阵* @return返回校验矩阵*/public int[][] CreateCheckArray() { // 二进制校验矩阵int m = 1;int l = 1;int[][] b = new int[4][16];for (int i = 0; i < b.length; i++) {for (int j = 1; j < b[i].length; j++) {b[i][j] = 0;}}for (int i = 1; i < 16; i++) { // 二进制m = i;if (i != 1 && i != 2 && i != 4 && i != 8) {for (int j = 3; j >= 0; j--) {b[j][l] = m % 2;m = m / 2;if (m < 0) {break;}}l++;}}for (int j = 0; j < 4; j++) { // 二进制for (int i = 12; i < 16; i++) {if (i - 12 == j) {b[j][i] = 1;}}}System.out.println("(15,11)HammingCode校验矩阵生成:");System.out.println("----------------------------------------------------------");for (int i = 0; i < 4; i++) {for (int j = 1; j < 16; j++) {System.out.print(b[i][j] + " ");}System.out.println();}System.out.println("----------------------------------------------------------");return b;}/*** @param Generate* 生成矩阵十进制数转为二进制矩阵* @return*/public int[][] GenerateArray() {// 生成矩阵增加还没有做int g[][] = new int[4][12];int l = 1;int m = 1;for (int i = 1; i < 16; i++) { // 二进制m = i;if (i != 1 && i != 2 && i != 4 && i != 8) {for (int j = 3; j >= 0; j--) {g[j][l] = m % 2;m = m / 2;if (m < 0) {break;}}l++;}}// G 生成int[][] G = new int[11][15];for (int i = 0; i < G.length; i++) {for (int j = 0; j < G[i].length; j++) {if (j == i) {G[i][j] = 1;} else {G[i][j] = 0;}}}for (int j = 11; j < 15; j++) {for (int i = 0; i < G.length; i++) {G[i][j] = g[j - 11][i + 1];}}System.out.println("(15,11)HammingCode生成矩阵:");System.out.println("----------------------------------------------------------");for (int i = 0; i < 11; i++) {for (int j = 0; j < 15; j++) {System.out.print(G[i][j] + " ");}System.out.println();}System.out.println("----------------------------------------------------------");return G;}/*** @param encode* 用生成矩阵编码* @param G* 代表生成矩阵* @param send* 输入的字符诸位 1、0 等* @return*/public int[] encode(int[][] G, int[] send) { // 利用生成矩阵编码int[] newArray = new int[G[1].length]; // 得到X*G的一个矩阵for (int i = 0; i < newArray.length; i++) {newArray[i] = 0;for (int j = 0; j < G.length; j++)newArray[i] += send[j] * G[j][i];if ((newArray[i] & 1) == 1) {newArray[i] = 1;} else {newArray[i] = 0;}}System.out.print("(15,11)HammingCode的编码:");for (int i = 0; i < newArray.length; i++) {System.out.print(newArray[i] + " ");}return newArray;}/**** @param H* 校验矩阵错误* @param receive* 收到的信息* @return返回海明码的译码*/public int[] checkAndDecode(int[][] H, int[] receive) { // 检测错误以及纠正错误int[] e = new int[H.length]; // H*x得到int flag = 0;for (int i = 0; i < e.length; i++) { // 得到Hx的一个矩阵e[i] = 0;for (int j = 0; j < receive.length; j++) {e[i] = e[i] ^ (receive[j] & H[i][j + 1]);}}// 检测编码是否有错 H*x=0System.out.print("H*x为:");for (int i = 0; i < e.length; i++) {System.out.print(e[i] + " ");}System.out.println();for (int i = 0; i < e.length; i++) {if (e[i] != 0) {flag = -1;break;}}if (flag == -1) { // 代表有错 flag 得到位错的下标flag = 0;int k = 0;for (int i = e.length - 1; i >= 0; i--) {flag += Math.pow(2, i) * e[k];k++;}System.out.print("接收的数据第" + flag + "位有错:");for (int i = 0; i < receive.length; i++) {System.out.print(receive[i]);}System.out.println();// 进行纠错flag = flag - 1;receive[flag] = receive[flag] ^ 1;System.out.print("接收的数据纠错后:");for (int i = 0; i < receive.length; i++) {System.out.print(receive[i]);}} else {// System.out.println();System.out.print("接收正确,数据为:");for (int i = 0; i < receive.length; i++) {System.out.print(receive[i]);}}System.out.println();System.out.print("(15,11)HammingCode译码为:");for (int i = 0; i < 11; i++) {System.out.print(receive[i] + " ");}System.out.println();return e;}public static void main(String[] args) {HammingCode HMC = new HammingCode();HMC.start(HMC);}}结果如下:校验矩阵和生成矩阵结果如图:当输入正确与接收相同时结果如图:当收到结果有错的时候(其中错误为非校验位)结果如图:当收到结果有错的时候(其中错误为校验位)结果如图://进过三种不同的形式的检验,得到编写的15,11,3海明码的算法正确。
湖南大学信息论汉明码实验报告

汉明码实验报告1、原理信道可以分为三类:随机信道、突发信道和混合信道。
在随机信道中,错码的出现是随机的,且错码之间是统计独立的。
例如,由高斯白噪声引起的错码就具有这种性质。
因此,当信道中加性干扰主要是这种噪声时,就称这种信道为随机信道。
由于信息码元序列是一种随机序列,接收端是无法预知的,也无法识别其中有无错码。
为了解决这个问题,可以由发送端的信道编码器在信息码元序列中增加一些监督码元。
这些监督码元和信息码元之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。
在信息码元序列中加入监督码元就称为差错控制编码,有时也称为纠错编码。
不同的编码方法有不同的检错或纠错能力。
有的编码就只能检错不能纠错。
差错控制编码原则上是以降低信息传输速率为代价换取传输可靠性的提高。
汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。
汉明码是一种多重(复式)奇偶检错系统。
它将信息用逻辑形式编码,以便能够检错和纠错。
用在汉明码中的全部传输码字是由原来的信息和附加的奇偶监督位组成的。
每一个这种奇偶位被编在传输码字的特定比特位置上。
推导并使用长度为m位的码字的汉明码,所需步骤如下:a、确定最小的监督位数k,将它们记成DI、D2、…、Dk,每个监督位符合不同的奇偶测试规定。
b 、 原有信息和k 个监督位一起编成长为m+k 位的新码字。
选择k 监督位(0或1)以满足必要的奇偶条件。
c 、 对所接收的信息作所需的k 个奇偶检查。
d 、 如果所有的奇偶检查结果均为正确的,则认为信息无错误。
如果发现有一个或多个错了,则错误的位由这些检查的结果来唯一地 确定。
2、算法描述木次实验设计令一个二元(7, 4)汉明码的系统码形式的矩阵和校验 矩阵分别为如图所示,令7位数由左至右分别为第0到第6位,则第0、1、2、 3位为信息位,第4、5、6位为监督位。
1000101G= 01001110010110000 10 11等价的编码方为Ci=mi ,i=0,1,2,3C4=m0+ml+m2C5=ml+m2+m3C6=m0+ml+m3 1110100 H= 0 1 1 1 010 *******3、程序代码及注释-void mairiO{int aa[10000]:int i :int If ;//定义生成矩阵int b[4] [7] = {{1,O, 0, 0, 1,0, 1}^ {0,1,0, H, {0, 0, 15 0, 1,1,0}, {0, 0, 0, 1,0, 1,1}}:int s=O:int j, k, m;int 2[4],q[7],tr[10000/4*7];int p,D=O;int cc[2500], dd[2500];//定义错误囹样int e [8] [7] = {{1, O, 0, 0, 0, 0, 0打{0,1, 0, 0, 0, 0, 0}, {0, 0, L E E 0, 0}, {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0打{0, 0, 0, 0, 0, b 0}, {0, 0, 0, 0, 0, 0, 1}, {1,1, 0, 0, 0, 0,0}}: int ^[10000/4*7]:int H[7] [3] = {{l,0,l}, {1,1,1}』{1,1,0}, {0, 1,1}, {1,0,0}, {0,1,0}, {0,0,1}}:int A=0Ji!=O, L=8;int f [3]:int ww[10000/4*7]:printfC 汉日月(7, 4)码的编码与译码程序:\n r ):printff 请输入你想产生的二进制个数「);//输入想产生的信源的个数scanf &N ):while (N<4){printf C*输入无效,i 青重新输入 "): printfC 请输入你想产生的二进制个数; scant: }printfC 随机产生的二进制序列为;\小;“产生一个随机序列,并把它放入^[]中stand( (unsigned)tijne( NULL )):for(i=0;i<N;i 卄){aa[i]=rand.()%2;printf ("滋d"』aa[i]):}pMntf(W):"编码生成码字printfC 编码后变为:E):for (m.= 0 ;m<N/4;m++){for(i=y;i<(rM);i ++){a[i-y] = aa[i]:}〃取出4位出来for(j=0; j<7;j 卄){q[j]=0;for(k=0;k<4;k ++)q[j]-^a[k]*b [k] [j]:〃与生威矩阵相乗-#inelude #inelude Sinelude nelude <stdi o ・ h><string ・ h><stdlib.h><time ・ h>for(i=s:i<(s+7):i++)rr [i]=0;rr[i]=q[i-s]J52:printf (他笃rr[i])://将生成的帧入rr[]4>}y=y-M;//向后轸动4位s=s+7:///向后移动7位pdirtf(W):}printfC经过信道后变为:E);srand( (unsigned) time ( I«IULL )):for(j=0:j<N/4;j 卄){cc[j] = rand()%100://^ 生一个0为9 的随机數if(cc[j]<9)〃当随机数小于9时,一个码字产生2个错俣{for(i=D;i<(D+7):i++){v[i] = 0;[i]=(rr[i]+e [7] [i-D])552:Vprintf r%r,w[i]):}}else if((cc[j]>=9)U(cc[j]<=30))//当随机数在旷30时,一个码宇庐生一个错误{dd[j]=rand()%7:P=dd[j];///^机产生一个0飞的数,以确定是码字一个错误的位蛊■for(i=D;i<(D+7):L++){v[i]=0:^[i] = (rr[i]+e[p][i-D])%2;printf w[i]);}}else//当随机数在3旷99时,不发生错误{for(i=D;i<(L+7);i++){v[i]=0;v[i]=rr [i]:printf ("%d,V j w[i]):}}D=D+7 ://向后移动7位printf (沁T, cc [j]) :进行跟踪,以确定码学错几位prirrtf (W):}printfC经过译码后变为:\n ):for(i=0;i<N/4;i++){for(j=0;j<3;j++){f [j]=0:for(k=A:k<A+7:k++)f [j]+=w[k]*H[k-A] [j]:// 计算伴随式for (m=0 :jn<7: m++)for(j=0:j<3:j++)if ((f [j]%2)==H[in] [j])M=M+l:if (M==3)L=JU:M=0;//W^} 〃根据伴随武栈到出诸的位量for (m=0 :JTL<7 : m++){if (TTI==L){ww[如]=(讥如田羯2;//将出错的地方更正printf ("號d", ww [A+m]): }else{w[A+jn]=w[A+m];printf ("始d"s wwOtin]) ://没有出错的地方}}A二A十7:"向启移动7位L=8;//-§位M=0;///W^,复位printfCXn^);}systemC'pause"):4、运行结果及分析分析:该代码可以由输入者决定产生的二进制个数,产生的二进制序列为二进制个数除以4取整。
实验三 汉明码编译码实验

实验三汉明码编译码实验
汉明码编译码实验
一、实验目的
1、了解信道编码在通信系统中的重要性。
2、掌握汉明码编译码的原理。
3、掌握汉明码检错纠错原理。
4、理解编码码距的意义。
二、实验原理
1、实验原理框图汉明码编译码实验框图汉明码编码过程:数字终端的信号经过串并变换后,进行分组,分组后的数据再经过汉明码编码,数据由4bit变为7bit。
三、实验器材
1、主控&信号源、6号、2号模块各一块
2、双踪示波器一台
3、连接线若干
四、实验步骤汉明码编码规则验证连线汉明码1、2号模块的拨码开关S12#拨为 S22#、S32#、S42#均拨为;2、6号模块的拨码开关S16#拨为0001, S36#拨为0000按下6号模块S2系统复位键。
3、此时2号模块提供32K编码输入数据,6号模块进行汉明编译码,无差错插入模式。
4、用示波器观测6号模块TH5处编码输出波形。
汉明码检纠错性能检验1、6号模块S3拨成0001
按下6号模块S2系统复位。
2、对比观测译码结果与输入信号,验证汉明码的纠错能力。
3、对比观测插错指示与误码指示,验证汉明码的检错能力。
4、、6号模块S3按照插错控制表中的拨码方式,逐一插入不同错误,按下6号模块S2系统复位。
重复步骤2,验证汉明码的检纠错能力。
5、将示波器触发源通道接TP2帧同步信号,示波器另外一个通道接TP1插错指示,可以观测插错的位置。
五、实验数据错2位码时错码检测指示输出波形汉明译码纠错性能检验六、实验分析开头数字序号1。
实验四 纠错码Hamming码编译码

实验四纠错码Hamming码编译码一、实验原理差错控制编码的基本作法是:在发送端被传输的信息序列上附加一些监督码元,这些多余的码元与信息之间以某种确定的规则建立校验关系。
接收端按照既定的规则检验信息码元与监督码元之间的关系,一旦传输过程中发生差错,则信息码元与监督码元之间的校验关系将受到破坏,从而可以发现错误,乃至纠正错误。
通信原理综合实验系统中的纠错码系统采用汉明码(7,4)。
所谓汉明码是能纠正单个错误的线性分组码。
它有以下特点:码长n=2m-1 最小码距d=3信息码位k=2n-m-1 纠错能力t=1监督码位r=n-k这里m位≥2的正整数,给定m后,既可构造出具体的汉明码(n,k)。
汉明码的监督矩阵有n列m行,它的n列分别由除了全0之外的m位码组构成,每个码组只在某列中出现一次。
系统中的监督矩阵如下图所示:其相应的生成矩阵为:汉明译码的方法,可以采用计算校正子,然后确定错误图样并加以纠正的方法。
表3.4.1 (7,4)汉明编码输入数据与监督码元生成表二、实验仪器1、JH5001通信原理综合实验系统一台2、20MHz双踪示波器一台3、JH9001型误码测试仪(或GZ9001型)一台三、实验目的通过纠错编解码实验,加深对纠错编译码理论的理解;掌握纠错编译码的实现和应用。
AS CVSD四、 实验内容准备工作:(1)首先通过菜单将调制方式设置为BPSK 或DBPSK 方式;将汉明编码模块内工作方式选择开关SWC01中,编码使能开关插入(H_EN ),ADPCM 数据断开(ADPCM );将输入数据选择开关KC01设置在m 序列(DT_M )位置;设置m 序列方式为(00:M_SEL2和M_SEL1拔下),此时m 序列输出为1/0码。
(2)将汉明译码模块内输入信号和时钟选择开关KW01、KW02设置在LOOP 位置(右端),输入信号直接来自汉明编码模块;将译码器使能开关KW03设置在工作位置0N (左端)。
汉明码实验报告

实验名称:汉明码十三、实验环境软件环境: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蓉»>»»»»»>>»»» 増金很明码编码。
海明编码实验报告

海明编码实验报告
海明编码是一种在数据传输时使用的错误检测和纠正编码技术。
它是由美国编码理论家理查德·W·海明发明的,并被广泛应用于计算机、通信和存储系统中。
在海明编码技术中,数据被分为若干个字节,每个字节包含一定数量的数据位和校验位。
校验位是通过特定算法计算得出的,在传输数据时与数据一同传输。
接收方根据校验位对数据进行校验,并在发现错误时对数据进行纠正。
通过该技术,可以有效地检测和纠正数据传输过程中可能出现的错误,提高数据传输的可靠性。
本次实验主要介绍了海明编码技术的实现及其应用。
我们采用C语言编写程序,通过输入一串数据并进行编码,再通过变异实验方式,模拟传输过程中可能出现的错误,并对数据进行纠正,最终得到正确的数据。
我们首先定义了一个数据结构,用于存储每个字节的数据位和校验位。
接着,通过输入一串数据,并将数据分组,计算每个字节的校验位,最终得到编码后的数据。
我们还定义了一个函数,用于随机地变异编码后的数据,模拟传输过程中可能出现的错误。
在实验中,我们对编码后的数据进行了变异。
然后,我们对每个字节的数据位和校验位进行校验,并进行错误的纠正。
在实验中,我们发现该编码方式可以在发生多达两个错误的情况下依然可以有效地纠正数据。
由此可见,海明编码技术具有较高的纠错能力。
通过本次实验,我们深入了解了海明编码技术的原理及其应用。
该技术可以帮助我们在数据传输过程中有效地检测和纠正错误,提高数据的可靠性。
在实际的应用中,海明编码技术被广泛应用于计算机、通信和存储系统中,起到了保障数据传输安全和可靠的作用。
海明编码实验报告

海明编码实验报告一.实验目的:深刻理解海明编码,解码的原理,通过用代码将其实现掌握其中的技术。
增强动手解决实际问题的能力以及编程,调试程序的能力。
二.实验原理:主要思想:码字位的编号从左到右,最左边的比特是第一位;数据比特和监督比特融合在一起; 监督位处于2的幂数位位置,其它的位置放置数据比特;编码后的码串为行向量,用它乘以生成矩阵后,采用奇偶校验方式,得出矩阵方 程并求解该矩阵方程得到对应监督位的比特数值;待发送的数据比特和比特一起构成了发送编码码字海明纠错码的格式 码字的编号从左到右,最左边是第一位,其中2的幂数位是检验位,其余是k 个数据位(信息元)。
*---信息元 P---校验位 海明码的编码与译码的方法其中,lr =1或0(l=0为偶校验,l=1为奇校验),bij = 1 或 0例: 对数据1100进行编码 ************544332211022222p p p p p)101(111011101001110010100)0111000(=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡ 解: 数据信息为4位,取校验位数量为r=3。
(1)编码长度 n = 2r – 1 = 7 数据位 k = n – r = 4 校验位 r = 3由矩阵乘法得,p1 = 0 ,p2 = 1, p3 = 1解得海明码为 0111100(+表示异或运算)译码过程:收到海明码串以后,接收方把海明码串作为行向量,乘以相同的样本矩阵,检查约定的奇偶校验方式是否成立。
类似编码过程,进行矩阵方程运算;如果方程运算以后右边的结果与约定的奇偶校验行向量一致,则结果正确;如果方程运算以后右边的结果与约定的奇偶校验行向量不一致,则表明传输的数据有错,且该结果行向量对应的二进制比特转换为十进制数所对应编号的比特出错,把该比特取反后可得正确的数据。
对例题所得到的海明编码结果0111100进行传输,如果接收到的也是0111100,那么结果无错。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论与编码基础实验报告学院:电子科学与工程学院队别:四院二队专业: 2006级通信工程专业姓名:孙鹏跃学号: 200604015002国防科学技术大学电子科学与工程学院实验三 汉明码编译码一、【设计思想】1948年,Bell 实验室的C.E.Shannon 发表的《通信的数学理论》,是关于现代信息理论的奠基性论文,它的发表标志着信息与编码理论这一学科的创立。
Shannon 在该文中指出,任何一个通信信道都有确定的信道容量C,如果通信系统所要求的传输速率R 小于C,则存在一种编码方法,当码长n 充分大并应用最大似然译码(MLD ,MaximumLikelihoodDecdoding)时,信息的错误概率可以达到任意小。
从Shannon 信道编码定理可知,随着分组码的码长n 或卷积码的约束长度N 的增加,系统可以取得更好的性能(即更大的保护能力或编码增益),而译码的最优算法是MLD,MLD 算法的复杂性随n 或N 的增加呈指数增加,因此当n 或N 较大时,MLD 在物理上是不可实现的。
因此,构造物理可实现编码方案及寻找有效译码算法一直是,信道编码理论与技术研究的中心任务。
信息传输的可靠性是所有通信系统努力追求的首要目标。
要实现高可靠性的传输,可采用诸如增大发射功率、增加信道带宽、提高天线增益等传统方法,但这些方法往往难度比较大,有些场合甚至无法实现。
而香农信息论指出:对信息序列进行适当的编码后可以提高信道传输的可靠性,这种编码即是信道编码。
信道编码是在著名的信道编码定理指导下发展起来的,几十年来已取得了丰硕的成果。
现将信道编码定理简述如下:每一个信道都具有确定的信道容量C,对于任何小于C 的信息传输速率R,总存在一个码长为n,码率等于R 的分组码,若采用最大似然译码,则其译码错误概率Pe 满足: )(R nE E Ae P −≤其中A 为常数,E(R )为误差函数。
香农编码定理仅仅是一个存在性定理,他只是告诉我们确实存在这样的好码,但并没有说明如何构造这样的码,但定理却为寻找这种码指明了方向。
Hamming 1915年2月11日生于芝加哥。
1937年在芝加哥大学获得数学学士学位,1939年在内布拉斯加大学获得硕士学位,接着又于1942年在伊利诺伊大学获得博土学位,成为一名数学专家。
学成以后,他留校工作两年,然后转入肯塔基州位于俄亥俄河畔的路易斯维尔大学任教,两年后来到洛斯阿拉莫斯国家实验室,参与了著名的曼哈顿计划。
但在那里Hamming 也只呆了两年,就又转到贝尔实验室工作。
正是在这里,Hamming 遇到了他感兴趣和能发挥他特长的课题,也有一个适宜的工作环境,因此一干就是30年(1946—1976)。
Hamming 到贝尔实验室后接受的第一个任务就是解决通信中令人头痛的误码问题。
通信时发送方发出的信息在传输过程中由于信号的衰减和外界的电磁干扰,到接收方产生了畸变和失真,获得的是错误的信息。
这在商业、军事等应用中都会产生严重的后果,有时简直会祸国殃民,因此迫切需要加以解决。
但在相当一段时间里,这成了摆在许许多多科学家和工程师面前的一大难题,谁也找不出解决的好办法。
Hamming 接受这个任务以后,意识到通信线路质量的改善是有限度的,外界干扰是客观存在也无法绝对避免,因此这个问题不可能通过让发送的代码不出错这条途径去解决,而只能通过一旦出错如何发现、如何纠正才能解决。
这使Hamming 的研究沿着正确的路线进行。
经过深入探讨,1947年Hamming 终于发明了一种能纠错的编码,这种码就叫“纠错码”(error-correcting-code)或“Hamming 码”(Hamming code)。
哈明码是一种冗余码,即在有效信息代码中要加入校验位,这是为纠错而必须付出的代价。
其基本原理是使每一信息位参与多个不同的奇偶校验(parity check)。
所谓奇偶校验是在代码中设置一个校验位,通常置于代码的最左边。
若整个代码中“1”的个数为奇数认为代码正确,称为奇校验(odd check);反之,若整个代码中“1”的个数为偶数认为正确,则称为偶校验(even check)。
哈明码就是有多个奇偶校验位的一种代码,在适当安排下,通过这多个奇偶校验位就可以检查出代码传送中的错误并自动纠正。
一般而言,对于长度为n 位的代码,其中应包括r 个校验位,有效信息位为n-r,r 的值应满足以下公式:2r-1≥nHamming 码是一种能够自动检测并纠正一重错的线性纠错码,即SEC(Single Error Correcting)码,它不仅性能好,而且编译码电路非常简单,易于实现。
从20世纪50年代问世以来,在提高系统可靠性方面获得了广泛的应用。
最先用于磁芯存储器,60年代初用于大型计算机,70年代在MOS 存储器中得到应用,后来在中小型计算机中普遍采用,目前常用于RFID 系统中多位错误的纠正。
设数据位数为m,校验位数为k,则总编码位数为n,n=m+k,有Hamming 不等式:)(log 02∑=≥−ti i n C k n 对于这个不等式可以理解为:由于n 位码长中有一位出错,可能产生n 个不正确的代码(错误位也可能发生在校验位),所以加上k 位校验后,就需要定位昭m+k(=n)个状态。
用2 k 个状态中的一个状态指出“有无错”,其余2 k-1个状态便可用于错误的定位。
汉明码距指的是长度相同的两个符号序列(码字)a 和b 之间对应位置上不同码元的个数,用符号D(a,b)表示,如两个二元序列:a=101111,b=111100,则得D(a,b)=3。
有了汉明码距的概念,我们就可以用汉明码距来描述码的纠错检测能力。
如果一组编码的码长为n,将这些资源全部利用上,可以对2 n 个符号进行编码,但这样一来这个编码就没有任何抗干扰能力,因为合法码字之间的最小汉明码距为1,任何一个符号的编码的任意一位发生错误,就变成了另外一个符号的编码,它也是一个合法的码字。
接收端不能判断是不是有错误发生。
我们可以在2 n 个可用的码字中间选择一些码字来对信源符号进行编码,把这些码字称为合法码字,而其他没有使用的码字称为非法码字。
这样合法码字之间的汉明距离就会拉开,有些合法码字发生错误后有可能变成非法码字,接收端收到这些非法码字后就可以判断出传输过程中出现了错误。
码字之间的最小汉明距离越大,编码的抗干扰能力就越强。
如果编码的最小汉明距离为2,那么任何合法码字发生一位错误都会变成非法码字,但不能确定是由哪一个合法码字错误而来,因此这个编码可以发现一位错误;如果编码的最小汉明距离为3,那么任何合法码字发生一位错误都会变成非法码字,而且距离原来的码字距离为1,而距离其他任何合法码字的最小距离为2,因此可以确定这个非法码字是由哪一个合法码字发生错误而来,这个编码用作纠错编码可以发现一位错误并纠正一位错误。
如果发生了两位错误,也可以发现,但是如果试图纠正这个错误就会产生新的错误;如果把这种编码只当作检错编码,则可以发现两个错误。
筇此类推,可以总结出编码的最小汉明码距与编码纠错检错能力之间的关系:①要发现(检测)e个随机错误,则要求码的最小距离d min≥e+1;②要纠正e个随机错误,则要求码的最小距离d min≥2e+1;③要纠正e个随机错误,同时检测f(≥c)个错误,则要求码的最小距离d min≥e+f+1。
如果一个分组码的数据位长度为k,校验位长度为r,总的编码长度为n,n=k+r,则总的可以编码的合法码字的个数为2 k,总的码字个数为2 n,可以看出,检验位的长度越长,合法码字所占的比例就越小,如果这些码字能够尽可能地在所有的码字中均匀分布的话,合法码字之间的最小汉明码距就越大,编码的抗干扰能力也就越强,因此设计编码方法的最重要的任务就是尽量使合法码字尽可能地均匀分布。
虽然汉明码的思想是比较先进的,但是它也存在许多难以接受的缺点。
首先,汉明码的编码效率比较低,它每4个比特编码就需要3个比特的冗余校验比特。
另外,在一个码组中只能纠正单个的比特错误。
M.Golay研究了汉明码的这些缺点,并提出了两个以他自己的名字命名的高性能码字:一个是二元Golay码,在这个码字中Golay将信息比特每12个分为一组,编码生成11个冗余校验比特。
相应的译码算法可以纠正3个错误。
另外一个是三元Golay码,它的操作对象是三元而非二元数字。
三元Golay码将每6个三元符号分为一组,编码生成5个冗余校验三元符号。
这样由11个三元符号组成的三元Golay码码字可以纠正2个错误。
汉明码和Golay码的基本原理相同。
它们都是将q元符号按每k个分为一组.然后通过编码得到n-k个q元符号作为冗余校验符号,最后由校验符号和信息符号组成有n个q 元符号的码字符号。
得到的码字可以纠正t个错误,编码码率为为k/n。
这种类型的码字称为分组码,一般记为(q,n,k,t)码,二元分组码可以简记为(n,k,t)码或者(n,k)码。
汉明码和Golay码都是线性的,任何两个码字经过模q的加操作之后,得到的码字仍旧是码集合中的一个码字。
在Golay码提出之后最主要的一类分组码就是Reed-Muller码。
它是Muller在1954年提出的,此后Reed在Muller提出的分组码的基础上得到了一种新的分组码,称为Reed-Muller码,简记为RM码。
在1969年到1977年之间,RM码在火星探测方面得到了极为广泛的应用。
即使在今天,RM码也具有很大的研究价值,其快速的译码算法非常适合于光纤通信系统。
数十年来,经过几代人的不懈努力,已发现了许多性能优良的码及相应的译码方法,且10−误码所需信噪比越来越接近香农限。
如20世纪70年代采用卷积码和序列译码后,在5率条件下所需功率为4—5dB,距香农限(0dB)还很远。
而近几年正得到广泛研究的Turbo 码在同样的误码率条件下,所需信噪比降为0.7dB,这离香农限只有0.7dB,又向编码极限性能逼近了一大步。
正是在香农编码的指导下,信道编码理论和技术研究取得了一连串辉煌的成功。
二、【实现流程】本次实验的主要内容有:1、Hamming 码编码对给定的信息序列进行 Hamming 编码,给出码字;2、信道传输采用不同的 BSC 信道进行传输,改变错误转移概率p;3、Hamming 码译码在接收端进行译码,分析其误码性能。
根据2中不同的转移概率 p,绘出误码性能图。
通过实验进一步理解信道编码的基本原理以及香农信道编码定理的意义,掌握Hamming码的编译码方法,了解Hamming码的优缺点,并寻求改进方法。
本次实验各实验步骤及整个实验过程均在一个MATLAB操作界面上完成,界面上各可操作参数均有默认值,也可由用户自行输入。