汉明码(Hamming Code)分析
计算机数据为什么进行校验?
二进制数据进行传送存取环节时,由于存储器的触发器反转、电容电流流失等问题,容易导致存储数据发生变化,这就出现了检错和纠错的问题。
计算机的校验一般用于数据的通信和传递。
奇偶校验
奇偶校验是通过在数据前添加一位校验位来对传输数据进行校验。具体方法是:
偶校验在数据前加校验位(1或0),保证整组数据(校验位和数据位)1的个数为偶数。奇校验则是保证1的个数为奇数。
下面先以偶校验为例来看一下:
假设传输的数据为00101100,显然,数据中1只有三个,采用偶校验添加校验位的话应该添加1(保证1有四个)。那么生成的校验码就是100101100。
计算机只有一位出错的概率很大,一般默认出错位数就是一位
在此前提下,有了这个校验码之后,再进行数据传输,我们接受到的校验码应当是100101100,有偶数个1。一旦传输过程数据发生错误(要么0变为1,要么1变为0)。当我们接收数据时,就会发现1的个数为奇数个,显然数据发生了改变,这也就完成了检错过程。
但是我们无法确定出错的到底是哪一位,接下来我们采用分组的方式添加校验位。
还是以00101100这组数据为例,我们采用划分的方式进行分组,将0010分为一组,1100分为另一组,分别添加校验位:10010、01100。那么校验码就变成了1001001100。一旦数据改变,我们就可以通过第一组1的个数是否为偶数和第二组1的个数是否为偶数来确定出错位置是在第一组还是第二组。
以此为基础,下面我们来看一下汉明码。
汉明码(Hamming Code)
汉明码(Hamming Code)是计算机校验中应用比较广泛的一种校验码。
汉明码是如何检错的?
首先我们先举个例子(1010101).
位置: 1 2 3 4 5 6 7
数据: 1 0 1 0 1 0 1
采用一种非划分的方式进行分组:
p1组:1 3 5 7
p2组:2 3 6 7
p3组:4 5 6 7
用1来表示出错,那么:
p3 p2 p1
0 0 0
都没错
0 0 1
p1出错,p2,p3没错,由于3、5、7都在p2和p3中,只能是1出错。
0 1 1
p2,p1出错,p3没错,由于p2,p1中共有的为3和7,而7存在于p1,没出错,所以只能是3出错
1 1 1
p1,p2,p3共有的只有7,所以是7出错。
观察发现,按照组从大到下排列下来的二进制数转化为10进制数正好对应了出错位置,比如上面的数据:
000-------0,没出错
001-------1,1出错
011-------3,3出错
111-------7,7出错
通过这种分组方式就可以确定究竟是哪一位出错,完成了检错过程,而二进制数只能是0或1,只需将出错位变为1就可完成纠错过程。
汉明码是如何分组的?
规定用以下方式分组:
将1234567…n每个位置转化为二进制数。
满足以下形式:
p1(第一组):xxxx1 1,3,5,7…
p2(第二组):xxx1x 2,3,6,7…
p3(第三组):xx1xx 4,5,6,7…
以此类推。
汉明码校验位的位置?
规定以2的n次方为汉明码校验位(n=0,1,2,3…)
校验位出错不需纠错,因为需要的只是数据位
如何写出汉明码?
首先要确定汉明码有多少位,根据给定的数据,可利用公式:
2^k >= n+k+1.
n表示信息位,k表示校验位。
每一组都有错或不错两种状态,k个校验位表示了有k组,检验结果要指出n+k位哪一位错,而还有一种是没有错的状态。
利用该公式和给出的数据即可确定汉明码的位数。
也可不用汉明码直接写,把2的k次方的校验位单独留出来,其余位置添加对应数据即可。
例如
1011,采用偶校验
由于1 2 4是校验位,先将其空出来,然后顺序填入数据
1 2 3 4 5 6 7
1 0 1 1
0 1 0
(p1:1,3,5,7 两个1 添0
p2:2,3,6,7 三个1 添1
p3:4,5,6,7 两个1 添0)
由此得出汉明码为0110011
如何确定汉明码出错位置
根据所得汉明码(假设通过偶校验方式),传输之后,若发生数据的改变(一位),先求出每一组是否出现错误数据,再从大到小,根据前面的例子,对应写出二进制,转化为10进制就是出错的位置。也可直接根据每组的重合部分和对错进行分析,找到错误位置。
比如上述汉明码,经过数据传输后由0110011变为0110111.
分析:
p1:1 3 5 7对应0 1 1 1 显然1的个数不是偶数个,出错,为1.
p2:2 3 6 7对应1 1 1 1 显然1的个数是偶数个,没出错,为0,
p3:4 5 6 7对应0 1 1 1 显然1的个数不是偶数个,出错,为1。
那么就可以得出:
p3 p2 p1
1 0 1
转化为10进制数为5.
即第五位出错。由于第五位不是校验位,将第五位的1变为0,即可得到正确的码0110011.
从而得到读取的正确数据1011。
汉明码(Hamming Code)分析相关推荐
- 【信道编码/Channel Coding】汉明码Hamming Code
简介: 这是本专栏信道编码/Channel Coding的第三站,想对信道编码有一个系统性的认识可以看本专栏的 信道编码的整体框架 一文.而在本篇文章中,将介绍汉明码(Hamming Code)的构成 ...
- 【通信系统仿真系列】基于Matlab的汉明码(Hamming Code)纠错传输以及交织编码(Interleaved coding)仿真
基于Matlab的汉明码纠错传输以及交织编码仿真 前言 原理 汉明码 编码过程 冗余位数量计算 校验位位置计算 计算校验相关位 开始编码 解码过程 实验结果 仿真代码 可以修改的参数 下载链接 主函数 ...
- 学习笔记之——汉明码(Hamming Code)
差错控制编码 在通信系统中,信道通常是非理想的.信号经过信道时,一方面会受到噪声的干扰:另一方面,信道本身可能产生的复杂衰落变化也会对信号造成影响.这两种因素通常导致接收出现误码. 故此,在一个实际的 ...
- ECC校验——汉明码(Hamming Code)
本文参考板块与链接: https://en.wikipedia.org/wiki/Hamming_code #wiki英文版 https://zh.wikipedia.org/wiki/%E6%B1% ...
- 汉明码(Hamming Code)原理及实现
汉明码实现原理 汉明码(Hamming Code)是广泛用于内存和磁盘纠错的编码.汉明码不仅可以用来检测转移数据时发生的错误,还可以用来修正错误.(要注意的是,汉明码只能发现和修正一位错误,对于两位或 ...
- 海明码(汉明码、Hamming Code)
目录 文章目录 目录 简介 编码 概述 示例 第1步:校验位的位置 第2步:数据位的位置 第3步:填入数据位 第4步:如何计算出校验位的值 第5步:计算出校验位的值 侦测和更正 概述 示例 第1步:检 ...
- 码距和检错纠错能力的关系、CRC和Hamming Code
前言 CRC和Hamming Code都采用了冗余编码技术,而前者是一种检错编码,而后者是一种纠错编码.冗余(CRC中的FCS帧检验序列.Hamming Code中的校验位)的作用之一就是帮助扩大码距 ...
- matlab hamming code
Hamming code 是一种用于检测和纠正错误的纠错码,在 Matlab 中也可以实现它的编码和译码过程. 具体的实现方法可以通过自定义函数实现,例如实现编码和译码的过程,以及检测和纠正错误. 例 ...
- hamming code/汉明编码
hamming code/汉明编码 看了很多文章都没太讲明白汉明编码,都讲的太复杂了,概念复杂.操作也复杂,之后看了些资料,明白了一些,在此分享,希望能够简洁而本质的阐述汉明编码. 汉明编码的本质 通 ...
最新文章
- 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统
- Spring读取配置文件,获取bean的几种方式
- java文件file字符集_获取文件字符集(或文件编码) 的工具类
- python输入字符串从大到小排列_567. 字符串的排列(Python)
- Java私有方法解释_java接口中 定义 private 私有方法
- C 语言和C++语言的 struct对比
- 【Pytorch神经网络实战案例】10 搭建深度卷积神经网络
- toj 4596 一行盒子
- VMware SDS 什么是VSAN?? VSAN的体系结构 (含VSAN 6.0、6.1版的新内容)
- 微信发送模版消息,PHP代码简单案例
- Flutter之GridView简析
- fbinstool linux iso,大神给你传授fbinsttool下载
【操作教程】
的详细_
- 2023拼多多商品详情,拼多多sku采集
- linux安装程序出现了问题,linux安装extundelete以及对遇到问题的解决
- 史上最全网络通讯(IIOT、工业控制、5G、区块链)协议全景图
- 怎么用ChemDraw加反应条件
- Linux安装unrar
- 【小5聊】winform窗体之最小化事件捕捉以及最小化到任务栏功能
- 【每日早报】2019/08/06
- [paper] Multiple Human Parsing