计算机组成原理·海明编码及其实验

news2024/11/24 23:45:22

前言:海明编码这一块在刚开始的时候没有弄懂,后面通过做实验、复习慢慢摸清了门道。在学习计算机组成原理的过程中,实验实践是很重要的,它会让你去搞清楚事情背后的原理,逼着你学会你没听懂的东西。这篇文章会从海明码的理论部分实验部分进行阐述。

海明码

奇偶校验码

  为什么要谈到奇偶校验码呢?因为它和海明码一样,都属于校验码。所谓校验码,就是数据位校验位的合并,通过校验位的信息,你能知道数据是不是出错了,哪里出错了,它本应是多少。

注:后文均用 k k k 表示原式数据位数, r r r 表示校验位位数(也同时是校验组的组数), n n n 表示校验码(数据位 + 校验位)的总位数。

  正如上图所示,校验码主要是用于数据发送方和接收方通信用的,通过校验位可以检查传过来的数据是否准确。
  偶校验码通过设置 r = 1 r=1 r=1 位校验位 P P P,使得校验码 P D k ⋯ D 2 D 1 PD_k\cdots D_2D_1 PDkD2D1 所有位共有偶数个 1 1 1。计算公式是
P = D 1 ⊕ D 2 ⊕ ⋯ ⊕ D k (1) P=D_1\oplus D_2\oplus\cdots\oplus D_k\tag 1 P=D1D2Dk(1)

  比如发送方需要传输 k = 5 k=5 k=5 位数据 11001 11001 11001,会生成一位校验位 1 1 1,打包成校验码 1 11001 \red{1}11001 111001 送给接收方。如果传输过程没有发生错误,接收方收到的就是 111001 111001 111001,看一下有 1 1 1 的个数是偶数,应该是没问题。如果传输过程中有一位出错了,比如 111001 → 11 0 001 111001\rightarrow 11\red 0001 111001110001,接收方收到的数据就有奇数个 1 1 1,所以就能够判断传过来的数据出错了(但是不能分辨是哪一位错了)。
  奇偶校验码的缺点也是显而易见的,对偶校验码来说,如果传输过程中出现了 2 2 2 位错误,接收方就会认为是正确的,这说明奇偶校验码最多检错 1 1 1

码距

  定长编码中任意两个合法编码最少有多少位不同,这个编码的码距就是多少。比如上面的奇偶校验码码距就是 2 2 2。海明码的码距是 3 3 3

海明码

有多种类型的海明码校验,这里只介绍能纠一位错的海明码。

多校验组

  前面提到,奇偶校验码可以检测 1 1 1 位错,但是不具备纠错能力。并且所有数据位于 1 1 1 个校验组中,即 r = 1 r=1 r=1
  海明码在 k k k 位数据位中插入 r r r 个校验位,使得每个数据至少位于 2 2 2 个校验组中(为什么?后面会解释)。也就意味着对于某个 D s D_s Ds 而言,它至少要参与 P i P_i Pi P j ( i ≠ j ) P_j(i\neq j) Pj(i=j) 的生成。同样的, P i P_i Pi 是由某一些数据位异或得到的, P i P_i Pi 和这些数据位共同构成 1 1 1校验组(偶校验组)。
P i = D i 1 ⊕ D i 2 ⊕ ⋯ ⊕ D i t (2) P_i=D_{i1}\oplus D_{i2}\oplus \cdots\oplus D_{it}\tag 2 Pi=Di1Di2Dit(2)

  式 ( 2 ) (2) (2) 描述了第二个第 i i i 个校验位的生成。

省流:每个校验组都是由一个 P P P 和若干 D D D 构成的, P P P 是这些 D D D 的异或结果。

  接收方会生成一种叫检错码的东西,每个校验位生成 1 1 1 个检错码,所以一共有 r r r 个检错码,用 G i ( i = 1 , 2 , ⋯   , r ) G_{i}(i=1,2,\cdots,r) Gi(i=1,2,,r) 来表示。 接收方会干这样的事情:
G i = P i ′ ⊕ D i 1 ′ ⊕ D i 2 ′ ⊕ ⋯ ⊕ D i t ′ (3) G_i=P_i'\oplus D_{i1}'\oplus D_{i2}'\oplus\cdots\oplus D_{it}'\tag 3 Gi=PiDi1Di2Dit(3)

  其中加一个 ′ ' 表示数据传输后的结果,比如发送方的 D 4 D_4 D4 在接收方变成了 D 4 ′ D_4' D4

注意 G i G_i Gi(检错码) 和 P i P_i Pi (校验码)是不同的东西, P i P_i Pi发送方根据 D D D 生成的; G i G_i Gi接收方根据 P i ′ P_i' Pi D ′ D' D 生成的,用于检错。海明码的实现中结合了偶校验的思想。

  显然,如果接收方发现 G i = 1 G_i=1 Gi=1,就说明第 i i i 个校验组有数据出错了。但是到底是谁出错了?是 P i P_i Pi 还是对应的 D i t D_{it} Dit 呢?

海明码原理

  海明码致力于制定一套规则回答上面的问题。它将 k k k 个数据位 D D D r r r 个校验位 P P P某种方式组合成 n n n 位校验码 H H H,以某种方式划分校验组,以期达到这样的目标: G r ⋯ G 1 G_r\cdots G_1 GrG1 直接指示出错的位置。比如 G 3 G 2 G 1 = 011 G_3G_2G_1=011 G3G2G1=011,代表海明码的 H 3 H_3 H3 出错了。其中,预留 G 3 G 2 G 1 = 000 G_3G_2G_1=000 G3G2G1=000 代表没有错误。
  因此,对于海明码 n = k + r n=k+r n=k+r 位来说, 1 1 1 位错一共有 k + r k+r k+r 种可能,但是 G r ⋯ G 1 G_r\cdots G_1 GrG1 只能指示 2 r − 1 2^r-1 2r1 种错误。所以应该有:
k + r ≤ 2 r − 1 (4) k+r\leq 2^r-1\tag4 k+r2r1(4)

  并且,由于海明码要实现纠错功能,码距就不能是 2 2 2,至少要是 3 3 3,否则就会像奇偶校验码一样只能检错、不能纠错。为了减少冗余,海明码的码距设定为 3 3 3。这就意味着每个数据位 D s D_s Ds 至少要出现在 2 2 2 个校验组中。

假设数据位 D s D_s Ds 只出现在校验组 P i P_i Pi 中。当 D s = 0 D_s=0 Ds=0 时,记 P i = k P_i=k Pi=k,得到的海明码是 H \boldsymbol H H;当 D s = 1 D_s=1 Ds=1 时,根据异或的性质,有 P i = k ‾ P_i=\overline k Pi=k,得到的海明码是 H ′ \boldsymbol {H'} H。你会发现 H \boldsymbol H H H ′ \boldsymbol{H'} H 只有 D s D_s Ds P i P_i Pi 两位是不一样的,那么海明码的码距就是 2 2 2。但是我们海明码的码距是 3 3 3,所以 D s D_s Ds 只出现在一个校验组是不够的。

  现在我们来看海明码是怎么编码的。假设 r = 3 r=3 r=3 的海明码,检错位是 G 3 G 2 G 1 = 001 G_3G_2G_1=001 G3G2G1=001——这说明只有校验组 1 1 1 出错了。那可能是生成 P 1 P_1 P1 的那些 D D D 出错了吗?不可能,因为一旦 D D D 出错, G 3 G 2 G 1 G_3G_2G_1 G3G2G1 就至少有两个 1 1 1(至少两个校验组出错)了,因为每个数据位都至少要出现在 2 2 2 个校验组中。
  所以,对于 G 3 G 2 G 1 G_3G_2G_1 G3G2G1 只有一位 1 1 1 的情况,只能是校验组所对应的检错位出错了。
  那么 G 3 G 2 G 1 = 001 / 010 / 100 G_3G_2G_1=001/010/100 G3G2G1=001/010/100 分别对应检错位 P 1 , P 2 , P 3 P_1,P_2,P_3 P1,P2,P3 出错,根据海明码的目标“ G r ⋯ G 1 G_r\cdots G_1 GrG1 直接指示出错的位置”,应该把 P 1 P_1 P1 放在 H 1 H_1 H1 P 2 P_2 P2 放在 H 2 H_2 H2 P 3 P_3 P3 放在 H 4 H_4 H4。且看下面的表格:

海明码 H 1 H_1 H1 H 2 H_2 H2 H 3 H_3 H3 H 4 H_4 H4 H 5 H_5 H5 H 6 H_6 H6 H 7 H_7 H7
检错码/位置
G 3 G 2 G 1 G_3G_2G_1 G3G2G1
001 001 001 010 010 010 011 011 011 100 100 100 101 101 101 110 110 110 111 111 111
映射关系
(这一位 H H H 放什么)
P 1 P_1 P1 P 2 P_2 P2 D 1 D_1 D1 P 3 P_3 P3 D 2 D_2 D2 D 3 D_3 D3 D 4 D_4 D4
属于 G 1 G_1 G1 校验组
属于 G 2 G_2 G2 校验组
属于 G 3 G_3 G3 校验组

  这个表格是对应海明码在 ( n , k ) = ( 7 , 4 ) (n,k)=(7,4) (n,k)=(7,4) 时的分组规则。预留了 G 3 G 2 G 1 = 000 G_3G_2G_1=000 G3G2G1=000 ,对应海明码没有出错。其实上面 D D D 的位置是可以随便放的,这个只影响后面校验位 P P P 的生成表达式。按照上面的 D D D 的放置方式,有:
{ P 1 = D 1 ⊕ D 2 ⊕ D 4 P 2 = D 1 ⊕ D 3 ⊕ D 4 P 3 = D 2 ⊕ D 3 ⊕ D 4 (5) \begin{cases}P_1=D_1\oplus D_2\oplus D_4\\P_2=D_1\oplus D_3\oplus D_4\\P_3=D_2\oplus D_3\oplus D_4\end{cases}\tag 5 P1=D1D2D4P2=D1D3D4P3=D2D3D4(5)

  式 ( 5 ) (5) (5) 是发送方要干的事情。给发送方一个 D 4 D 3 D 2 D 1 D_4D_3D_2D_1 D4D3D2D1,发送方需要按照 ( 5 ) (5) (5) 生成 P 3 P 2 P 1 P_3P_2P_1 P3P2P1,然后打包成 H 7 H 6 H 5 H 4 H 3 H 2 H 1 = D 4 D 3 D 2 P 3 D 1 P 2 P 1 H_7H_6H_5H_4H_3H_2H_1=D_4D_3D_2P_3D_1P_2P_1 H7H6H5H4H3H2H1=D4D3D2P3D1P2P1,发送给接收方。
  根据式 ( 2 ) ( 3 ) (2)(3) (2)(3),接收方需要按照下面的方式生成检错位:
{ G 1 = P 1 ′ ⊕ D 1 ′ ⊕ D 2 ′ ⊕ D 4 ′ G 2 = P 2 ′ ⊕ D 1 ′ ⊕ D 3 ′ ⊕ D 4 ′ G 3 = P 3 ′ ⊕ D 2 ′ ⊕ D 3 ′ ⊕ D 4 ′ (6) \begin{cases}G_1=P_1'\oplus D_1'\oplus D_2'\oplus D_4'\\ G_2=P_2'\oplus D_1'\oplus D_3'\oplus D_4'\\ G_3=P_3'\oplus D_2'\oplus D_3'\oplus D_4'\end{cases}\tag 6 G1=P1D1D2D4G2=P2D1D3D4G3=P3D2D3D4(6)

  根据生成的 G 3 G 2 G 1 G_3G_2G_1 G3G2G1,接收方能够判断有没有出错,是谁出错了。

海明码的检错与纠错

  海明码的检错、纠错能力是有限的。由于码距是 3 3 3,因此它最多能够检测 2 2 2 位错;但是它不能区分 1 1 1 位错和 2 2 2 位错。同时,它只能够纠正 1 1 1 位错。

检测 2 2 2 位错的含义是,编码在传输过程中有 2 2 2 位出错,接收方拿到之后能够识别到异常;而不是接收方拿到数据,说我发现你发送过来的数据里面有 2 2 2 位错。

  举个例子,数据传输过程中 D 1 D_1 D1 出错,接收方得到的是 G 3 G 2 G 1 = 011 G_3G_2G_1=011 G3G2G1=011;但是如果 D 2 , D 3 D_2,D_3 D2,D3 同时出错,那么接收方得到的还是 G 3 G 2 G 1 = 011 G_3G_2G_1=011 G3G2G1=011。所以只有在假定最多发生 1 1 1 位错的前提条件下,海明码才能够正确地检错并纠错。

拓展海明码

  前面说了海明码不能区分 1 1 1 位错和 2 2 2 位错。如果再引入一个总偶校验位 P a l l P_{all} Pall,就能够分辨一位错和两位错。
P a l l = H n ⊕ ⋯ ⊕ H 2 ⊕ H 1 (7) P_{all}=H_n\oplus \cdots\oplus H_2\oplus H_1\tag7 Pall=HnH2H1(7) G a l l = P a l l ′ ⊕ H n ′ ⊕ ⋯ ⊕ H 2 ′ ⊕ H 1 ′ (8) G_{all}=P_{all}'\oplus H_n'\oplus \cdots\oplus H_2'\oplus H_1'\tag8 Gall=PallHnH2H1(8)

   ( 7 ) (7) (7) 是发送方做的事情, ( 8 ) (8) (8) 是接收方做的事情。假设没有 3 3 3 位错,接收方在发现 G 3 G 2 G 1 ≠ 000 G_3G_2G_1\neq 000 G3G2G1=000 即有错的条件下,可利用 G a l l G_{all} Gall 判断是一位错 ( G a l l = 1 ) (G_{all}=1) (Gall=1) 还是两位错 ( G a l l = 0 ) (G_{all}=0) (Gall=0)

海明码实验

海明编码

在这里插入图片描述
  实际上就是填写分组规则表,像前文的那个表格一样。这里原始数据有 k = 16 k=16 k=16 位,检错位有 r = 5 r=5 r=5 位加上 1 1 1 P a l l ( P 6 ) P_{all}(P_6) Pall(P6) P 1 P_1 P1~ P 5 P_5 P5 的线路连接参考式 ( 2 ) ( 5 ) (2)(5) (2)(5) P 6 P_{6} P6 的线路连接参考式 ( 7 ) (7) (7)

海明解码实验

在这里插入图片描述
  参考 ( 3 ) ( 6 ) (3)(6) (3)(6),根据分组规则表生成 G 1 G_1 G1~ G 5 G_5 G5 G 6 G_6 G6 根据 ( 8 ) (8) (8) 式生成。这里面多路选择器根据检错码 G \boldsymbol G G 的情况,选择一个数与原来的数据 D \boldsymbol D D 异或一下,使得异或的数据能够恢复成正确的数据。

资源获取

华中科技大学计算机组成原理实验
华中科技大学计算机组成原理实验——数据表示实验

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

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

相关文章

Vue3实战笔记(53)—奇怪+1,VUE3实战模拟股票大盘工作台

文章目录 前言一、实战模拟股票大盘工作台二、使用步骤总结 前言 实战模拟股票大盘工作台 一、实战模拟股票大盘工作台 接上文&#xff0c;这两天封装好的组件直接应用,上源码&#xff1a; <template><div class"smart_house pb-5"><v-row ><…

做外贸,怎么选国外服务器?

不管是新手还是外贸老司机&#xff0c;大家都知道要用海外服务器来做外贸网站&#xff0c;无论外贸独立站的客户是欧美、东南亚、还是非洲&#xff0c;都不能选择国内机房的服务器&#xff0c;必须选择海外服务器&#xff0c;这是共识。 但是今天&#xff0c;我要告诉大家一个…

关联规则(Apriori算法)

文章目录 1 关联规则1.1 关联规则简介1.2 典型例子1.3 频繁项集的评估标准1.3.1 支持度&#xff08;support&#xff09;1.3.2 置信度&#xff08;confidence&#xff09;1.3.3 提升度&#xff08;lift&#xff09; 1.4 最小支持度、最小置信度 2 Python实战2.1 Python实战关联…

基于网关的ip频繁访问web限制

一、前言 外部ip对某一个web进行频繁访问&#xff0c;有可能是对web进行攻击&#xff0c;现在提供一种基于网关的ip频繁访问web限制策略&#xff0c;犹如带刀侍卫&#xff0c;审查异常身份人员。如发现异常或者暴力闯关者&#xff0c;即可进行识别管制。 二、基于网关的ip频繁访…

面向Java程序员的Go工程开发入门流程

对于一个像我这样没有go背景的java程序员来说&#xff0c;使用go开发一个可用的程序的速度是肉眼可见的缓慢。 其难点不在于go语言本身&#xff0c;而是搭建整个工程链路的过程&#xff0c;即所谓的“配环境”。 本文主要讲述如何配出一个适合go开发的环境&#xff0c;以免有同…

STL:vector

文章目录 标准库中的vectorvector的构造vector的迭代器vector的容量vector的元素访问data vector的修改 vector和string的迭代器失效问题resize、reserve、insert、push_back、assigneraseg 和 vs 的区别string解决迭代器失效的方法 标准库中的vector vector是表示可变大小数组…

【学习Day3】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.5.4 Cache替换算法 Cache的页面淘汰算法 常用替换算法有&#xff1a; • 随机替换算法RA…

浏览器【详解】Cookie(含Cookie的起源,属性,个数和大小限制,作用,优点,缺点,JS 的操作方法等)

什么是 Cookie &#xff1f; Cookie 是一段不超过 4KB 的小型文本数据&#xff0c;由一个名称&#xff08;Name&#xff09;、一个值&#xff08;Value&#xff09;和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。 浏览器为什么需要 Cookie &#xff1f; …

atk-esp8266-01刷新固件-链接-配置

1.刷新固件 加载固件&#xff1a; 编写地址&#xff1a; 2.链接IO-->GND 关闭其他所有占用此串口的软件&#xff1b; 重新上电 开始刷新固件&#xff1a; 刷新完成&#xff1b; 拆掉IO与GND链接。 3.配置 ATCWMODE_DEF3 //配置模式 ATRST //重启 …

Linux学习笔记(清晰且清爽)

本文首次发布于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 Linux安装 关于安装这里就不过多介绍了&#xff0c;安装版本是CentOS 7&#xff0c;详情安装步骤见下述博客在VMware中安装CentOS7&#xff08;超详细的图文教…

3d模型移动中心点偏移太远怎么解决?---模大狮模型网

在3D建模和动画制作中&#xff0c;移动模型时确保中心点的准确性至关重要。然而&#xff0c;有时候在移动模型时&#xff0c;中心点可能会偏移得太远&#xff0c;导致操作不便甚至影响到后续的工作流程。本文将介绍在3D模型移动中心点偏移太远时的常见原因&#xff0c;并提供解…

基于Linux的文件操作(socket操作)

基于Linux的文件操作&#xff08;socket操作&#xff09; 1. 文件描述符基本概念文件描述符的定义&#xff1a;标准文件描述符&#xff1a;文件描述符的分配&#xff1a; 2. 文件描述符操作打开文件读取文件中的数据 在linux中&#xff0c;socket也被认为是文件的一种&#xff…

JSON源码类学习

json源码学习 parse把json转换成Object parseObject转换为jsonObject parseArray从字符串数组解析成真正的数组 tojsonString把真正的json解析json 数组的方法 作用&#xff1a;类型转换 为什么要做类型转换 开发一个方法验证 这个方法先封装方法&#xff0c;是否为json …

长难句打卡5.31

In a workplace that’s fundamentally indifferent to your life and its meaning, office speak can help you figure out how you relate to your work—and how your work defines who you are. 在一个对你的生活和生活意义漠不关心的工作场所中&#xff0c;办公室语言可以…

绿色积分合法化 时代牺牲品!云联惠

各位朋友&#xff0c;我是吴军&#xff0c;在科技产业界从事多年市场分析工作。今天&#xff0c;我想与你们共同探讨一个曾引起广泛关注的企业案例——云联惠。 云联惠&#xff0c;这个曾被誉为商业创新典范的平台&#xff0c;一度风光无限。在其鼎盛时期&#xff0c;它不仅吸引…

【Python】解决Python报错:IndexError: queue index out of range

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

让WSL内核使用BBR拥塞控制算法

使用git命令从Linux内核的Git仓库中获取源代码,$ git clone --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel.git,找到对应的内核版本$ git log --grep="5.15.146.1-microsoft-standard-WSL2",回退到本机安装的内核版本$ git checkout <commit-id&…

失之毫厘差之千里之load和loads

起源 最近在读pandas库的一些文档的时候&#xff0c;顺便也会将文档上的一些demo在编辑器中进行运行测试&#xff0c;其中在读到pandas处理Json数据这一节的时候&#xff0c;我还是像往常一样&#xff0c;将文档提供的demo写一遍&#xff0c;结果在运行的时候&#xff0c;直接…

Linux - 磁盘管理1

1.磁盘的分区 1.1 磁盘的类型&#xff08;标签&#xff09; MBR&#xff1a; ① 最大支持2T以内的硬盘 ② 有主分区p 拓展分区e 逻辑分区l之分 > 主分区编号1-4&#xff0c;主分区可以格式化使用 拓展分区编号1-4&#xff0c;拓展分区不能格式化 拓展分区最多能有1个&…

01Linux以及操作系统概述

课程目标 1.了解现代操作系统的整体构成及发展历史 2.了解Linux操作系统及其分支版本 3.直观上理解服务器端与桌面端版本的区别 课程实验 1.通过对CentOS和Ubuntu的演示&#xff0c;直观理解Linux与Windows的异同 课堂引入 本章内容主要为大家详细讲解Linux操作系统(以下简…