汉明码(Hamming Code)底层原理

news2024/11/15 7:08:14

汉明码(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缺点是只能发现和纠正一位错误
其他纠错码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023ISCC web wp

文章目录 1.羊了个羊2.小周的密码锁3.老狼老狼几点了4.ISCC疯狂购物节-15.ChatGGG6.Where_is_your_love7.ISCC内部零元购-28.ISCC单身节抽奖9.上大号说话10.ISCC滥用职权-3 1.羊了个羊 在url前缀加上view-source:来查看源码,在vue.global.js中发现可疑字符串。 两次…

这个数据机构是二叉树

文章目录 前言一、二叉树的链式存储二、二叉树链式结构的实现二叉树的结构设计手动构建二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历二叉树的层序遍历计算二叉树大小计算叶子节点个数计算二叉树高度计算第K层的节点个数查找某个值对应的节点二叉树的销毁 三、完整代…

2.7 协程设计原理

目录 一、为什么要有协程?二、协程的原语操作1、基本操作2、让出(yield)和恢复(resume) 三、协程的切换(switch)1、汇编2、ucontext3、longjmp / setjmp 四、协程结构的定义五、协程调度器结构的…

【C++】string类的深入介绍

【C】string类的深入介绍(1) 目录 【C】string类的深入介绍(1)标准库中的string类string类(了解即可)string类的常用接口说明(最常用的)详细介绍string::operator[] 迭代器string中的…

AI时代来临!使用ChatGPT和Kapa.ai协助学习成长!

在加密领域畅游时,常常会遇到不懂的技术名词或是其背后代表的含义,此时通常都需要花费大量的时间进行研究和学习方能掌握。但是自从ChatGPT人工智能的出现,通过简单有效地运用其特性,不仅可以大大提高研究的效率,还可以…

统信UOS V20 安装mysql5.7.42详细教程

1 安装包准备 到mysql官网可以看到最新的是8.0.33,想下载其他版本的点击 Looking for previous GA versions?Select Operating System: 选择如下版本的mysql 安装包 2 安装 2.1 上传文件至服务器 下载后通过远程将安装包上传至服务器,我这里将安装…

软件测试在不同应用场景中,我们该如何进行测试呢?

在我们的日常工作中,我们通常接触到的都是比较复杂的系统。而复杂的系统就意味着比较复杂的测试程序。首先,对于复杂的系统来说,如果想要做功能测试,一般需要考虑到测试数据的问题,还要考虑如何从全局出发,…

canal 环境搭建和配置

canal 环境搭建和配置 安装依赖环境 安装canal服务端 canal客户端配置 安装依赖环境 下载Linux版jdk 链接:百度网盘 请输入提取码 提取码:5r2e --来自百度网盘超级会员V5的分享上传到 /soft/java目录下,并解压-执行如下命令 tar -zxvf jdk…

基于Java在线医疗服务系统设计与实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

Media3:Android下一代媒体框架

无论您是在构建音乐播放器、视频流应用程序还是其他需要播放媒体内容的 Android 应用程序,拥有可靠的媒体播放库都是必不可少的。 这就是 Media3 发挥作用的地方。 什么是 Media3? Media3 是由 Google 作为 AndroidX 的一部分推出的强大媒体播放库。它…

从零开始 Spring Boot 38:Lombok 与依赖注入

从零开始 Spring Boot 38:Lombok 与依赖注入 图源:简书 (jianshu.com) 在之前的文章中,我详细介绍了 Lombok 的用法,考虑到在 Spring 中使用依赖注入(DI)是如此的频繁,因此有必要讨论使用 Lomb…

精通postman教程(五)postman请求参数化

作为一名测试工程师,那么Postman绝对是大伙必备的工具之一。 在这个系列教程中,我将为大伙详细讲解如何使用Postman进行API测试。 今天我带大伙实战一番postman如何请求参数化 ,让你们快速上手这款工具。 请求参数化 数据参数化是Postman…

Kivy系列(一)—— Kivy buildozer的Docker镜像制作

接触Kivy是奔着使用python便捷又是跨平台工具去的,如此一套代码可以发布为各类平台的成果。但是由于网络环境限制,以及kivy工具链上各类工具的频繁迭代,即使按照github上的kivy buildozer官方文档,也很难打包成功,kivy…

调试笔记-stm32的OTA/IAP 通过485升级固件

背景:最近需要在stm32上实现通过rs485升级固件功能。经过几天搜索和调试,实现了功能。 目标:使用cubeIDE实现stm32F407VGT6,通过RS485升级固件 调试记录: 步骤1. 在keil环境下的rs485升级固件(含源码):S…

react 18.2 官网学习笔记(1)

useMemo const cachedValue useMemo(calculateValue, dependencies);参数一:计算要缓存的值的函数。它应该是纯的,不应该接受任何参数,并且应该返回任何类型的值。React会在初始渲染时调用你的函数。在下一次渲染时,…

从搭建hadoop开始学习大数据中分而治之的MapReduce(伪集群模式)

环境准备 首先需要将如下四个必要的文件下载到计算机(已经附上了下载地址,点击即可下载)。 Vmware Workstation 17.x 【官方的下载地址】 CentOS-7-x86_64-Minimal-2009【阿里云镜像站下载地址】 openjdk-8u41-b04-linux-x64-14_jan_2020【开…

入栏需看——全国硕士研究生入学统一考试管理类专业学位联考

本栏意在收集关于全国硕士研究生入学统一考试管理类专业学位联考,简称管理类联考的知识点,考点,希望大家一起沟通,一起进步,管它贵不贵,考过了再说咯 英语 知识篇 阅读 完型填空 作文 技巧篇 第二章…

rolling的用法实例

在数据分析的过程中,经常用到对计算移动均值,使用rolling可以轻松实现这个功能~ rolling函数是一个用于时间序列分析的函数; 一、参数解析 首先,让我们来了解一下rolling的各个参数吧 DataFrame.rolling(window, min_periodsN…

Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位

这里写目录标题 需求背景图表展示X轴鼠标滑动或者缩放设置多列柱状图中某一列数据为0时不占位图表代码展示 需求背景 用柱状图展示12个月的项目对应的供应商数据;每个月有多个项目不确定,1-50之间,也就是说,12个月,每…

1.数据库的基本操作

SQL句子中语法格式提示: 1.中括号([])中的内容为可选项; 2.[,...]表示,前面的内容可重复; 3.大括号({})和竖线(|)表示选择项,在选择…