汉明码(Hamming Code)底层原理

汉明码(Hamming Code)底层原理

3Blue1Brown:Hamming Code【Part1】
3Blue1Brown:Hamming Code【Part2】

Hamming Code如何检查错误和定位错误?
检查错误通过奇校验或偶校验确定是否发生错误
定位错误通过依次对行和列进行偶校验确定错误在哪

假设图片为要发送的信息,发送时被编码为0与1的形式

将要发送的数据每11个比特组成一个chunks,每个chunk放入一个16位的block中

我们关注其中一个block,试着将11位信息填入其中
第一个11位信息为:00110001110,1个block中共16个位置,其中第0位作为整个block的偶校验位,第 2 0 、 2 1 、 2 2 、 2 3 2^0、2^1、2^2、2^3 20212223 作为chunk的校验位,其余位置依次填入11位信息
说明:16位组成一个block,除了校验位,其余信息位组成一个chunk

接下来,我们根据chunk中信息的情况,填入校验位(两行或两列的第一个方框中为校验位的所在位置)
第2列和第4列中一共有偶数个1,则第一个校验位填入0(偶校验)

第3列和第4列中一共有奇数个1,则第二个校验位填入1(偶校验,填入1后使得这两列1的个数变为偶数)


第2行和第4行中一共有奇数个1,则第4个校验位填入1(偶校验)


第3行和第4行中一共有奇数个1,则第8个校验位中填入1(偶校验)

整个block中1的个数为偶数个,第0位校验位填入0(偶校验)

所有的block填好后,就可以将信息发送给接收方了,在发送过程中可能会出现噪声,使得某些位由1变为0,或由0变为1,接收方通过校验位检查是否发生了错误?哪里出现了错误?

接收方接收到的信息中其中一个block如下

先检查第2列和第4列中是否出现错误,第2列和第4列通过了偶校验(8位中总共2个1)则错误不可能出现在第2列和第4列,而可能出现在第1列或第3列中

检查第3列和第4列中是否出现错误,第3列和第4列没有通过偶检验(8位中有5个1)说明第3列和第4列中的某一列出现错误

综合上述检查列的结论
第一次列检查的结论是:第1列或第3列中可能出现错误
第二次列检查的结论是:第3列或第4列中可能出现错误
综合以上列检查结论:第3列发生了错误

我们再检查行是否出现错误
检查第2行和第4行,8位中共6(偶数)个1,通过了偶校验,说明错误不可能出现在第2行或第4行,而错误出现在第1行或第3行

检查第3行和第4行,8位中共5(奇数)个1,未能通过偶校验,说明错误出现在第3行和第4行

综合上述检查行的结论:
第一次行检查的结论是:第1行或第3行中可能出现错误
第二次行检查的结论是:第3行或第4行中可能出现错误
综合以上行检查结论:第3行发生了错误
综合行检查和列检查:
列检查结论:第3列发生了错误
行检查结论:第3行发生了错误
最终结论:第3行第3列出现了错误

整个block中1的个数为奇数个,说明错误只有1个而不是2个,如果有3处错误或更多那就不知道了

纠正第3行第3列的错误还原原信息
除去校验位,依次取出信息位为 00110001110(与发送信息一致)

回顾一下上述操作
假设第7个方框内比特位出现了错误,通过4次偶检验则可以判断出错位置




四次校验的结果为0111,其对应的十进制是7,这里7就代表着发生错误的位置

将每个位置代表的数字写为二进制数,我们用二进制数来对错误位置进行定位,为什么要用二进制数,因为计算机用二进制0与1进行运算,电路开关也对应0与1


二进制数中第一位为1的属于第一个偶校验组Q1



检查Q1时,似乎在问:发生错误的位置是否第一位为1?


二进制数中第二位为1的属于第二个偶校验组Q2


检查Q2时,似乎在问:发生错误的位置是否第二位为1?


二进制数中第三位为1的属于第三个偶校验组Q3


检查Q3时,似乎在问:发生错误的位置是否第三位为1?


二进制数中第四位为1的属于第四个偶校验组Q4


检查Q4时,似乎在问:发生错误的位置是否第四位为1?

为什么奇偶校验位落在了第1、2、4、8等 2 k 2^k 2k的位置上?
二进制中只有1比特位的数字为1,不就是上述中在检查Q1、Q2、Q3、Q4吗?

这些位置恰好使得一个奇偶校验组中只有一个奇偶校验位
例如第 2 1 2^1 21位置上有一个校验位,这是Q2中唯一一个校验位,其他校验组也一样,如果校验位落在 2 k 2^k 2k的位置上,则会确保一个校验组只有一个校验位


把所有信息为1所在位置的二进制数取出,做异或运算得到的结果就是出现错误的比特所在位置。为什么?

第一列异或时,相当于在问有多少高亮位置来自于第一个偶校验组Q1

第二列异或时,相当于在问有多少高亮位置来自于第二个偶校验组Q2,其他列类似

为什么异或结果可以告诉我们错误位置?
例如下图中是要发送的信息,如果将信息为1所在位置二进制做异或运算会得到0000


我们假设在传输过程中第12个位置的0变为了1,则接收方检查时,将所有信息为1的位置除了原来的1外还要加一个发生变化位置的1,这一加入使得异或结果不在是0000,而是它所在位置的二进制

这样Hamming Code的纠错机制最终转化为异或运算,当然Hamming Code缺点是只能发现和纠正一位错误
其他纠错码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/28362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将递归函数转成非递归函数的通用方法

看到过一道非常不错的面试题:不支持递归的程序语言如何实现递归程序? 之所以说这道题好,是因为: 首先,它不是纯粹考概念和死记硬背,求职者在回答问题之前需要进行一定的思考; 其次&#xff0c…

Debezium系列之:记录一次生产环境SQLServer数据库删除日志文件造成debezium connector数据不采集的解决方法

Debezium系列之:记录一次生产环境SQLServer数据库删除日志文件造成debezium connector数据不采集的解决方法 一、背景二、快速定位问题三、详细的解决步骤四、确认debezium connector恢复对数据库的数据采集五、经验总结一、背景 SQLServer数据库的日志把磁盘打满了,需要删除…

JAVA 实现 Redis 发布订阅

Redis 发布订阅 发布订阅:消息发布者发布消息 和 消息订阅者接收消息,两者之间通过某种媒介联系起来 例如订杂志,当自己订阅了爱格杂志,每个月会发刊一本。到发布的时候派送员将杂志送到自己手上就能看到杂志内容。只有我们订阅了…

C语言之结构体讲解

目录 结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 对于上期指针初阶(2)我们后期还会讲数组指针是什么?大家可以先思考一下,后期我们会讲 1.结构体的声明 结构是一些值的集合,这些值被称为成员变量&am…

第二类曲线积分

文章目录 第二类曲线积分一、向量场是什么?二、向量场可视化三、计算1. 计算方式一2. 计算方式二 第二类曲线积分 因为之前学习第二类曲线的时候,不是很理解;所以最近看了mit的多元微积分课程,做一些课程笔记。 一、向量场是什么…

字符集和java的编码与解码

一、ASCII和GBK字符集 计算机存储一个英文字符需要一个字节。 ASCII字符集,包括128(0000000B~1111111B)个数据,存储英文字母和字符,对于欧美国家够用。 例如,存储字符’a’,查询ASCII得到为97&a…

C语言中的基本数据类型

C语言中的基本数据类型分别为以下几种 整型、浮点型、字符类型 整型又分为整型int、短整型short、长整型long 浮点型分为单精度浮点型float、双精度浮点型double 1、短整型short 2.整型 3.长整型 短整型、长整型、整形都是表示整形的,并且输出结果也都为10&…

【大数据之Hive】十一、Hive-HQL查询之基本查询

基础语法 select [all | distinct] select_expr,select_expr, ...from table)name --从什么表查[where where_condition] --过滤[group by col_list] --分组查询[having col_list] --分组后过滤[order by col_list] --排序[cluster by col_list | …

leetcode 152.乘积最大子数组

题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 子数组 是数组的连续子序列。 来源:力扣&a…

C++入门攻略

C补足C语言部分缺陷 1.命名空间:1.1 命名空间namespace关键字1.命名空间中可以定义变量、函数、类型2.命名空间可以嵌套3.相同命名空间共存 1.2 命名空间的使用方式:1.名称加用域作用限定符的方式访问(同上)2.使用using引入某个空…

Java并发之 Lock 锁

一、Lock接口 1 Lock简介&地位&作用 锁是一种工具,用于控制对共享资源的访问Lock和synchronized是最常见的两个锁,他们都能够达到线程安全的目录,但是使用和功能上又有较大的不同Lock接口最常见的实现类就是ReentrantLock通常情况下…

C:\Users\BC>conda -V ‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

C:\Users\BC>conda -V ‘conda’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 注意!:Anaconda安装路径和Scripts路径,两个都添加进去Path 解释:将 Anaconda 安装路径和 Scripts 路径都添加到系统的 PA…

文心一言 VS 讯飞星火 VS chatgpt (40)-- 算法导论5.4 4题

四、一次聚会需要邀请多少人,才能让其中 3 人的生日很可能相同? 文心一言: 为了解决这个问题,我们需要先计算出所有可能的生日组合数,然后计算出其中生日相同的组合数。 已知需要邀请的人数为:23人 根据组合数公式…

k8s如何使用ceph rbd块存储(静态供给、存储类动态供给)

目录 前言安装ceph集群ceph集群创建rbd块存储rbd块存储不支持ReadWriteManyk8s配置rbd块存储(静态供给)创建secret创建pv创建pvck8s节点安装客户端依赖包部署pod查看pod验证是否持久化 k8s配置rbd块存储(动态供给)查看官网ceph集群…

【ARM AMBA AXI 入门 6 - AXI3 协议中的锁定访问之AxLOCK信号】

文章目录 1.1 Locked accesses 1.1 Locked accesses 当主机使用 AxLOCK 信号来指示事务是锁定的事务时,互连(Interconnect)必须确保只有该主机可以访问目标从属区域,直到来自同一主机的未锁定事务完成。互连中的仲裁器(arbiter)必须执行此限制。 在主机…

湖南大学CS-2017(另一张)期末考试解析

【特别注意】 答案来源于wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 由于这张试卷没有电子版,我就直接拍我自己的作答了

Monocle2拟时基因富集分析

****Monocle2全部往期精彩系列:1、群成员专享:Monocle2更新(就是重新梳理一下)2、一键跑完monocle2?3、ggplot2个性可视化monocle2结果4、ggplot修饰monocle2拟时热图:一众问题全部解决5、Monocle2终极修改…

Day975.如何使用JWT结构化令牌 -OAuth 2.0

如何使用JWT结构化令牌 Hi,我是阿昌,今天学习记录的是关于如何使用JWT结构化令牌的内容。 OAuth 2.0 规范并没有约束访问令牌内容的生成规则,只要符合唯一性、不连续性、不可猜性就够了。这就意味着,可以灵活选择令牌的形式&…

天然气井远程监控解决方案

天然气井远程监控解决方案 一、项目背景 随着天然气开发规模日益增长,天然气井的数量也在不断增加。且位置分散环境恶劣。传统的人工巡检方式越来越不能满足天然气井的生产需求和安全保障。天然气井井由储罐和集气站组成。 集气站通过计量站将天然气输入储罐或由集…

深入学习 Mybatis 的四大组件源码

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接:体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收…