一下子理解海明码

前提:

1.最多只能检测出两位错,或者检测出一位错并能纠正,这里只讨论检一纠一的情况

2.会用到奇偶校验法,默认使用偶校验

发送方:

若数据为“1100”,长度n=4

1.计算校验码所需要的位数k ,使满足 : 2^k >= n+k+1

    此时k=3,满足2^3>=4+3+1 

    于是数据总位数共n+k=7位,从高到低设为H7,H6,.......,H1

2.留出2的幂次方,作为校验码在数据中的位置

   即第2^0位,第2^1位,第2^2位.....

    这里即H1,H2,H4为校验位,位值待求,其余皆为数据位,依次存放待发送数据

      

3.分组,确定每个校验位用来校验哪些数据位

    (分组方法:

            先将校验码的位置用二进制表示,将二进制中的1不变,0做通配符,

            然后将数据位的位置也用二进制表示,并与其匹配)

            如图

—————

4.根据偶校验原理,确定每组校验位的位值

第一组:H1校验H7,H5,H3,即100,有奇数个1,根据偶校验,H1应=1

第二组:H2校验H7,H6,H3,即110,有偶数个1,根据偶校验,H2应=0

第三组:H4校验H7,H6,H5,即110,有偶数个1,根据偶校验,H4应=0

即最终应发送数据为“1100001”

接收方:

1.从低到高,逐组查看校验位。若符合本组偶校验,则记标志S=0;若不符合偶校验,记标记S=1

        若收到“1000001”,H1=“1”检验H7H5H3=“100” ,本组偶校验通过,置S1=0

        H2=“0”校验H7H6H3=“100”,本组偶校验不通过,置S2=1

        同理,H4所属组,偶校验不通过,置S3=1

2.每组标记共同组成的二进制数值,代表着出错位的位置

        这里S3S2S1=“110”,即代表第6位(H6)出错

        若S3S2S1=“000”,则表示数据未出错(因为没有H0)

        #海明码 #计算机网络 #408 #考研

### 实现海明校验实验 #### 设计目标 在Logisim环境中构建并测试海明校验与解电路,验证其检测和纠正单比特错误的能力[^1]。 #### 准备工作 启动Logisim软件,并熟悉界面布局以及基本元件库的操作方法。确保安装最新版本以便利用全部功能特性[^2]。 #### 编器设计 创建一个新的组合逻辑子电路用于生成带有冗余位的数据帧。输入端口应接受原始数据流作为参数;输出则需提供经过处理后的扩展序列,其中包含了按照特定算法插入的检验位[^3]。 对于给定长度的消息m=m_0,m_1,...,m_{k-1},通过计算得出所需附加的r个监督位p=p_0,p_1,…,p_(r−1),形成最终传输形式d=d_0,d_1,…,d_n (n=k+r)[^4]。 ```c // 计算海明距离函数伪代码示例 function calculateHammingDistance(dataBits[], parityPositions[]) { int hammingCode[] = new int[dataBits.length + parityPositions.length]; // 初始化汉明码数组 for(int i=0; i<hammingCode.length; ++i){ if(isParityPosition(i+1)){ hammingCode[i]=0; }else{ hammingCode[i]=dataBits[indexOfDataBit(i)]; } } // 设置奇偶校验位 foreach(parityPos in parityPositions){ setParity(hammingCode,parityPos); } return hammingCode; } ``` #### 解器实现 建立另一个独立模块负责接收来自发送方的信息包并对之执行反向运算过程——即剥离额外加入的部分同时评估是否存在任何异常情况发生。当发现有误时尝试定位具体位置进而实施修复措施。 一旦接收到含有可能出错信号y=y_0,y_1,…,y_n ,便依据预设规则重新核算各部分之间的关系来判断是否满足既定条件S_i=S'_i 。如果不符,则意味着出现了差错事件;此时可根据综合所得指示找出确切受影响之处s=s_0,s_1,…,s_r 并加以改正。 ```c // 检测并修正错误位伪代码示例 function detectAndCorrectError(receivedCodeword[]){ bool errorDetected=false; int syndrome[]=calculateSyndrome(receivedCodeword); if(!allZeros(syndrome)){ errorDetected=true; // 找到错误的位置并翻转该位以完成更正操作 flipBitAtPosition(receivedCodeword,getErrorMessageIndexFromSyndrome(syndrome)); } return receivedCodeword; } ``` #### 结果分析 对比预期结果同实际观测值之间差异程度,记录下每次试验过程中遇到的问题及其解决方案。总结经验教训有助于加深理解整个机制运作原理的同时也为后续改进提供了宝贵资料支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值