《基于c51的汉明码编码器和译码器的设计本科论文.doc》由会员分享,可在线阅读,更多相关《基于c51的汉明码编码器和译码器的设计本科论文.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于C51的汉明码编码器和译码器的设计摘要:数字信号在传输过程中,由于受到干扰的影响,码元波形将变坏。接收端收到后可能发生错误判决。由乘性干扰引起的码间串扰,可以采用均衡的办法纠正,而加性干扰的影响可以采用差错控制的措施了。汉明码就是一种能纠正一位错码且编码效率较高的线性分组码,它能纠正一个错码或检测两个错码。关键词:汉明码,编码,译码,C51Abstract: The digital signal during transmission, due to the impact of interference, the symbol waveform deterioration. Receive
2、r may receive an error after the verdict. By a multiplicative inter-symbol interference caused by crosstalk, a balanced approach can be used to correct, and the additive effects of interference can be used for error control measures. Hamming code is a code to correct a wrong and a higher coding effi
3、ciency of linear block codes that can correct a wrong code or wrong code detection two.Keywords: Hamming code, coding, decoding, C51 language目 录1绪论- 3 -1.1问题的背景及提出- 3 -1.2问题的研究及解决- 3 -1.3设计研究的目的- 4 -2KEIL及PROTEUS简介- 4 -2.1Proteus的简介- 4 -2.2Keil软件及其调试功能简介- 5 -2.3软件连接使用- 6 -3(15,11)汉明码的原理- 8 -3.1基本概念-
4、 8 -3.2监督矩阵H- 9 -3.3生成矩阵G- 10 -3.4伴随式(校正子)S- 10 -4(15,11)汉明码编解码器的设计- 11 -4.1(15,11)汉明码的编码思路- 11 -4.2(15,11)汉明码的编码程序设计- 12 -5(15,11)汉明码的译码思路及程序设计- 16 -5.1(15,11)汉明码的译码思路- 16 -5.2(15,11)汉明码的译码程序设计- 18 -6编译程序的调试及仿真- 20 -6.1系统仿真电路设计- 20 -6.1.1系统电路框图- 20 -6.1.2显示电路设计- 20 -6.1.3键盘电路设计- 21 -6.1.4整机设计- 22 -
5、6.2仿真分析- 22 -6.2.1仿真流程图- 22 -6.2.2调试过程- 23 -7致谢- 24 -8参考文献- 24 -9附录- 25 -附录一:整机原理图- 25 -附录二:仿真效果图- 25 -1 绪论1.1 问题的背景及提出 近年来,对高效可靠的数字传输和存储系统的需求日益增长。这种需求随着在商业、政府和军事领域面向数字信息的交换、处理和存储的大规模高速数据网的出现而变得更加迫切。通信系统得主要质量指标是通信的有效性和可靠性。在有噪声和损失存在的信道中,输入符号与接收符号不能一一对应,传输错误和判断错误的情况总会存在。可靠数字传输系统的设计要求通信与计算机技术的融合,系统设计者所
6、关心的一个主要问题就是如何控制差错以使得数据能够可靠重现。 在数字通信系统中,编码器分为两大类:一类是信源编码,另一类是信道编码。信源编码的目的是解决通信的有效性问题。信道编码的目的是解决通信可靠性问题。采用信道编码后,在信息码后增加了监督位,这样就可以增加了码元之间的相互关联,在接收端根据相应的译码规则,就能够察觉传输中有无误码,甚至能自动纠正错误。我们把建立在代数学基础上的编码称为代数码。在代数码中,常见的是线性码。在线性码中信息位和监督位是由一些线性代数方程联系着的。增加了冗余,必然降低了传输效率,却赢得了提高可靠性的好处。那么为了纠正一位错码,在分组码中最少要增加多少监督位才行呢?编码
7、效率能否提高呢?从这种思想出发进行研究,便导致汉明码的诞生。汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。那么怎么实现汉明码的编码与译码呢?本文将介绍基于C语言的汉明码的编码与译码系统,实现汉明码的编码与译码,从而实现传输的差错控制。1.2 问题的研究及解决本设计研究基于C语言的汉明码的编码与译码系统。根据汉明码的构成原理,我们需在信息位的后面加上监督位来监督码组中出现错码的位置,这样就方便在接收端对接收到的码组进行纠错以便得到正确的信息位,达到可靠的通信。在本设计中,我们采用m序列循环产生预编码信号,经过汉明码编码系统产生带监督位的线性分组码。发送这些码组,经过信道后这些码组由于受
8、到干扰的影响,某些码元波形会变坏,在接收端经过汉明码译码系统来检验错码及纠正错码,它能纠正一个错码或者检测两个错码。经过译码系统的检错与纠错,接收端就可以接收到正确的码组。1.3 设计研究的目的通过运用proteus软件仿真对汉明码的编码译码有更深入的了解和认识,掌握汉明码的构造原理,了解汉明码在实际生活中的应用,掌握差错控制的基本方法,即在发送端的信息码元序列中,以某种确定的编码规则加入一些码元(称为监督码元),使信息序列与监督码元之间具有某种相关性。在不断学习新的知识以及归纳复习老知识的同时,加强自身对通信系统设计的能力。2 Keil及Proteus简介2.1 Proteus的简介Prot
9、eus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件9。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
10、提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。Proteus主要用于绘制原理图并可进行电路仿真,Proteus ARES 主要用于PCB 设计。ISIS 的主界面主要包括:1 是电路图概览区、2 是元器件列表区、3 是绘图区。绘制电路图的过程如下:单击2 区的P 命令即弹出元器件选择(Pick Devices
11、)对话框,Proteus 提供了丰富的元器件资源,包括30 余种元器件库,有些元器件库还具有子库。利用该对话框提供的关键词(Keywords)搜索功能,输入所要添加的元器件名称,即可在结果(Results)中查找,找到后双击鼠标左键即可将该元器件添到2 区,待所有需要的元器件添加完成后点击对话框右下角的OK 按钮,返回主界面。接着在2 区中选中某一个元器件名称,直接在3 区中单击鼠标左键即可将该元器件添加到3 区。由于是英国的软件,特别要注意的是绘图区中鼠标的操作和一般软件的操作习惯不同,这正像是司机座位和人行道走向和国内不同一样。单击左键是完成在2 区中被选中的元器件的粘贴功能;将鼠标置于某
12、元器件上并单击右键则是选中该元器件(呈现红色),若再次单击右键的话则删除该元器件,而单击左键的话则会弹出该元器件的编辑对话框(Edit Component);若不需再选中任何元器件,则将鼠标置于3 区的空白处单击右键即可;另外如果想移动某元器件,则选中该元器件后再按住鼠标左键即可将之移动。元器件之间的连线方法为:将鼠标移至元器件的某引脚,即会出现一个“”符号,按住鼠标左键后移动鼠标,将线引至另一引脚处将再次出现符号“”,此时单击鼠标左键便可完成连线。连线时在需拐弯的地方单击鼠标左键即可实现方向的改变。绘制好电路后,可利用1 区的绿色边框对3 区的电路进行定位。2.2 Keil软件及其调试功能简
13、介目前流行的51系列单片机开发软件是德国Keil公司推出的Keil C51软件,它是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为Vision(通常称为V2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:Vision IDE集成开发环境(包括工程管理器、源程序编辑器、程序调试器)、C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及Monitor-51、RTX51实时操作系统。应用Keil进行软件仿真开发的主要步骤为:
14、编写源程序并保存建立工程并添加源文件设置工程编译/汇编、连接,产生目标文件程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。首先选择菜单FileNew,在源程序编辑器中输入汇编语言或C语言源程序(或选择FileOpen,直接打开已用其他编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单ProjectNew Project,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个
15、设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择Source Group1,右击鼠标弹出快捷菜单,选择“Add File to Group Source Group1”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其他文件)。加入文件后点close返回主界面,展开“Source Group1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择ProjectOption for Tar
16、get Target1(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项卡中选中“Creat Hex Fi”;其他选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。 成功编译/汇编、连接后,选择菜单DebugStart/Stop Debug Session(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。Keil能
17、以单步执行(按F11或选择DebugStep)、过程单步执行(按F10或选择DebugStep Over)、全速执行等多种运行方式进行程序调试。如果发现程序有错,可采用在线汇编功能对程序进行在线修改(DebugInline Assambly),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。对于一些必须满足一定条件(如按键被按下等)才能被执行的、难以用单步执行方式进行调试的程序行,可采用断点设置的方法处理(DebugInsert/Remove Breakpoint或DebugBreakpoints等)。在模拟调试程序后,还须通过编程器将.hex目
18、标文件烧写入单片机中才能观察目标样机真实的运行状况。Keil软件Eval版(免费产品)的功能与商业版相同,只是程序的最大代码量不得超过2kB,但对初学者而言已是足够。Keil软件由于其强大的软件仿真功能,友好的用户界面以及易于掌握的特点而受到工程技术人员的欢迎,有人甚至认为Keil是目前最好的51单片机开发应用软件。2.3 软件连接使用a、假若KeilC与Proteus均已正确安装在C:Program Files的目录里,把C:Programe FileLabcenter ElectronicsProteus 6 ProfessionalMODELSVDM51.dl 复制到C:Program
19、FileKeilCC51BIN目录里。b、用记事本打开C:Program FileskeilCC51TOOLS.INI文件,在C51栏目下加入:TDRV5=BINVDM51.DLL (Proteus VSM Monitor-51 Driver)其中“TDRV5”中的“5”要根据实际情况写,不要和原来的重复。(步骤1和2只需在初次使用设置。)c、进入KeilC Vision2开发集成环境,创建一个新项目(Project),并为该项目选定合适的单片机CPU器件(如:Atmel公司的AT89C51)。并为该项目加入KeilC源程序。d、单击“Project菜单/Options for Target”
20、选项或者点击工具栏的“option for ta rget”按钮,弹出窗口,点击“Debug”按钮,出现如图所示页面。在出现的对话框里在右栏上部的下拉菜单里选中“Proteus VSM Monitor一51 Driver”。并且还要点击一下“Use”前面表明选中的小圆点。再点击“Setting”按钮,设置通信接口,在“Host”后面添上“127.0.0.1”,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。在“Port”后面添加“8000”。设置好的情形如图所示,点击“OK”按钮即可。最后将工程编译,进入调试状态,并运行。 e、Proteus
21、的设置进入Proteus的ISIS,鼠标左键点击菜单“Debug”, 选中“use romote debuger monitor”,如图所示。此后,便可实现KeilC与Proteus连接调试。f、KeilC与Proteus连接仿真调试单击仿真运行开始按钮,我们能清楚地观察到每一个引脚的电频变化,红色代表高电频,蓝色代表低电频。3 (15,11)汉明码的原理3.1 基本概念海明码是一种可以纠正一位差错的编码。它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督关系式产生的r个校正因子来区分无错和在码字中的n个不同位置的一位错。它必需满足以下关系式:2r=n+1或2r
22、=k+r+1海明码的编码效率为:R=k/(k+r)式中 k为信息位位数,r为增加冗余位位数线性分组码是一类重要的纠错码,应用很广泛。在(n,k)分组码中,若督元是按线性关系相加而得到的,则称其为线性分组码。现在以(15,11)分组码为例来说明线性分组码的特点。设其码字为A=a6,a5,a4,a3,a2,a1,a0,其中前4位是信息元,后3位是监督元,可用下列线性方程组来描述该分组码,产生监督元: a2 = a6 + a5 + a4 a1 = a6 + a5 + a3 (2.1.1) a0 = a6 + a4 + a3显然,这3个方程是线性无关的。经计算可得(15,11)码的全部码字,如表2-1
23、所示。表2-1 (15,11)码的全部码字?/P序号码 字序号码 字信 息码元监 督 元信 息码元监 督 元00 0 0 00 0 081 0 0 01 1 11 0 0 0 10 1 191 0 0 11 0 02 0 0 1 01 0 1101 0 1 00 1 030 0 1 11 1 0111 0 1 10 0 140 1 0 01 1 012 1 1 0 00 0 150 1 0 11 0 113 1 1 0 10 1 060 1 1 00 1 114 1 1 1 01 0 070 1 1 10 0 015 1 1 1 11 1 1不难看出,上述(15,11)码的最小码距d0=3,它
24、能纠1个错或检2个错。汉明码是能够纠正单个错误的线性分组码,其特点是:最小码距d0=3,码长n与监督位满足n=2r-1的关系,上述的(15,11)线性分组码就是一个汉明码。3.2 监督矩阵H式(2.1.1)所示(15,11)汉明码的3个监督方程改写后可用矩阵形式表示为a14. 0 1 1 0 1 0 0. .a6. a5 1 1 1 0 1 0 0 a4 0 1 1 0 1 0 1 0 a3 = 0 (2.2.1) 1 0 1 1 0 0 1 a2 0 a1 a0并简记为 HAT=0T 或 AHT=0 (2.2.2)H称为监督矩阵,一旦H给定,信息位和监督位之间的关系也就确定了。H矩阵可以分成
25、2部分 1 1 1 0 1 0 0 H = 1 1 0 1 0 1 0 =P Ir (2.2.3) 1 0 1 1 0 0 1 HAT=0T,可以用来作为判断接收码字A是否出错的依据。3.3 生成矩阵G把监督方程补充完整并改写为矩阵形式a6 1 0 0 0a5 0 1 0 0a4 0 0 1 0 a6a3 = 0 0 0 1 a5 (2.3.1)a2 1 1 1 0 a4a1 1 1 0 1 a3a0 1 0 1 1 A = a6 a5 a4 a3 G (2.3.2)其中 1 0 0 0 1 1 1 0 1 0 0 1 1 0 G = 0 0 1 0 1 0 1 (2.3.3) 0 0 0 1
26、 0 1 1G称为生成矩阵,由G和信息组就可以产生全部码字。生成矩阵也可以分成2部分,即 G = Ik Q (2.3.4)其中 1 1 1 Q = 1 1 0 = PT (2.3.5) 1 0 1 0 1 13.4 伴随式(校正子)S设发送码组A= an1,an2,a1,a0 ,在传输过程中可能发生误码。接收码组B= bn1,bn2,b1,b0 ,收发码组之差定义为错误图样E,即 E = B - A(2.4.1)令S = BHT,称为伴随式或校正子。S = BHT =(A + E)HT = EHT(2.4.2)上述(15,11)汉明码的伴随式与错误图样的对应关系如表2-2所示。表2-2(15,
27、11)汉明码S与E的对应关系序号错误码位ESe6 e5 e4 e3 e2 e1 e0s2 s1 s00/0 0 0 0 0 0 00 0 01b00 0 0 0 0 0 10 0 12b10 0 0 0 0 1 00 1 03b20 0 0 0 1 0 01 0 04b30 0 0 1 0 0 00 1 15b40 0 1 0 0 0 01 0 16b50 1 0 0 0 0 01 1 07b61 0 0 0 0 0 01 1 14 (15,11)汉明码编解码器的设计4.1 (15,11)汉明码的编码思路(15,11)汉明码的编码就是将输入的四位信息码编成七位的汉明码,即加入三位监督位。根据式
28、(2.3.2)A = a6 a5 a4 a3 G可知,信息码与生成矩阵G的乘积就是编好以后的(15,11)汉明码,而生成矩阵G又是已知的,由式(2.3.3)得 1 0 0 0 1 1 1 0 1 0 0 1 1 0 G = 0 0 1 0 1 0 1(3.1.1) 0 0 0 1 0 1 1所以,可以得出如下方程组 a6 = a6 a5 = a5 a4 = a4 a3 = a3(3.1.2) a2 = a6 + a5 + a4 a1 = a6 + a5 + a3 a0 = a6 + a4 + a3根据式(3.1.2)就可以编出编码程序了。4.2 (15,11)汉明码的编码程序设计根据(15,1
29、1)汉明码的编码原理,首先画出程序设计的流程图:图3.1 编码流程图/*/ 该函数是模拟信道函数/ 作用:改变要传输的码字,/ 咐:码字经过该信道后,不产生错误的概率是70%,产生一位错误的概率是21%,两位错误的概率是6%,三位错误的概率是3%/ 入口参数:n(信源个数),rr(接收到的码字),cc(发送的码字)/ 出口参数:q(产生一位随机错误的码字个数)int Channel(int n,int rrA/MN,int ccA/MN) int a,i,j,k,a1,a2,a3,q=0; / k代表经过信道后码字会错几位,a1,a2,a3表示具体的错误位置srand( 18 );for(i=
30、0;in;i+) a=rand()%100; / a表示小于100的一个随机数if(a70) k=0; / 该判断语句控制没有产生错误的概率是70%else if(a91) k=1; / 该判断语句控制产生一位错误的概率是21%,在出错概率中占70% else if(a97)k=2; / 该判断语句控制产生两位错误的概率是6%,在出错概率中占20% else k=3; / 该判断语句控制产生三位错误的概率是3%,在出错概率中占10% switch (k) / 该语句判断出现几位错误,并作出相应的处理 case 0: for(j=0;jN;j+) / k0表示没有产生错误,接收到的码字r跟发送的
31、码字c相等 rrij=ccij; break; case 1: a1=rand()%7; / k=1表示产生一位错误,a1是随机产生的一个小于7的数,作为码字的错误位置 for(j=0;jN;j+) if(j=a1) rrij=(ccij+1)%2; / (ci+1)%2 是为了把对应位置上的ci值由0变1或者由1变0 else rrij=ccij; q+; / 统计产生一位随机错误的码字 break; case 2: a1=rand()%7; / k=2表示产生两位错误,a1和a2代表两个不同的错误位置 a2=rand()%7; while(a2=a1) / 该循环防止a1和a2相等 a2=
32、rand()%7; for(j=0;jN;j+) if(j=a1|j=a2) rrij=(ccij+1)%2; / (ci+1)%2 是为了把对应位置上的ci由0变1或者由1变0else rrij=ccij; break; case 3: a1=rand()%7; / k=3表示产生三位错误 a2=rand()%7; while(a2=a1) / a1和a2代表两个不同的错误位置,该循环防止a1和a2相等 a2=rand()%7; a3=rand()%7; while(a3=a2|a3=a1) / a1,a2,a3分别代表三个不同的错误位置,该循环防止a1,a2,a3相等 a3=rand()%
33、7; for(j=0;jN;j+) if(j=a1|j=a2|j=a3) rrij=(ccij+1)%2; / (ci+1)%2 是为了把对应位置上的ci由0变1或者由1变0 else rrij=ccij; break; default: printf(errorn);return q;最后,将算好的监督位与原来输入的信息码一起输出,这样,编码程序就算完成了。5 (15,11)汉明码的译码思路及程序设计5.1 (15,11)汉明码的译码思路(15,11)汉明码的译码就是将输入的七位汉明码翻译成四位的信息码,并且纠正其中可能出现的一个错误。由于生成矩阵G是已知的,所以根据式(2.3.4)G =
34、Ik Q ,可以得到矩阵Q的值 1 1 1 Q = 1 1 0 = PT(3.2.1) 1 0 1 0 1 1那么 1 1 1 0 P = 1 1 0 1(3.2.2) 1 0 1 1而监督矩阵H与PT又存在一定的关系,即H =P Ir(3.2.3)那么就可以算出监督矩阵H的值,即 1 1 1 0 1 0 0 H = 1 1 0 1 0 1 0(3.2.4) 1 0 1 1 0 0 1所以 1 1 1 1 1 0 1 0 1HT = 0 1 1 (3.2.5) 1 0 0 0 1 0 0 0 1根据式(2.4.2)S = BHT =(A + E)HT = EHT可以看出校正子S与错误图样E之间
35、有确定的线性变换关系。而E = en-1,en-2,e1,e0 ,这样就可以算出校正子S与(15,11)汉明码各位之间的关系,即 S2 = a2 + a6 + a5 + a4 S1 = a1 + a6 + a5 +a3 (3.2.6) S0 = a0 + a6 + a4 + a3对照表2-2,就可以确定每一位出错时,对应的校正子s2s1s0的值。这样,译码问题就迎刃而解了。5.2 (15,11)汉明码的译码程序设计根据(15,11)汉明码的译码原理,首先画出程序设计的流程图:图3.2.1 译码流程图/ 该函数是求码字函数/ 作用:求得纠正后的码字t/ 入口参数:n(信源个数),ee(陪首集),
36、tt(纠正后的码字),rr(接收到的码字)/ 出口参数:没有void TYard(int n,int eeA/MN,int ttA/MN,int rrA/MN) int i,j;for(i=0;in;i+) for(j=0;jN;j+) if(eeij) ttij=(rrij+1)%2;else ttij=rrij;最后,将没有错误的(15,11)汉明码或已经纠正1个错误的(15,11)汉明码输出,这样译码程序就完成了。为了方便阅读波形,加入输出了校正子S和错误位数C。若第0位(a0)出错,则C输出0,依次类推;若无错,则输出7。6 编译程序的调试及仿真6.1 系统仿真电路设计AT89C51单
37、片机驱动电路键盘电路显示电路串口6.1.1 系统电路框图6.1.2 显示电路设计6.1.3 键盘电路设计6.1.4 整机设计6.2 仿真分析 开机显示待编码数据按下编码键显示编码数据按下译码键显示译码数据确认码字正确,返回6.2.1 仿真流程图6.2.2 调试过程为期半年的毕业设计就这么结束了,忙碌而又辛劳,但是却让我学到了许多东西,为不久的将来走上工作岗位打下了一定的基础。一开始老师给我们布置了题目(15,11)汉明码的编解码器的设计。拿到题目,我们非常着急,以为这个题目很难,象一只没头的苍蝇,我们开始乱钻,最后,一头扎进了图书馆,借了好几本书。来仔细的翻看了通信原理的书和笔记,对(15,11)汉明码的一些基本概念有了进一步的会议。突然发现