海明码校验

ops/2024/10/21 3:06:07/
5.3.6 海明纠错码

    海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码,所以它也仅用于信道特性比较好的环境中,如以太局域网中,因为如果信道特性不好的情况下,出现的错误通常不是一位。

    海明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。

    要采用海明码纠错,需要按以下步骤来进行:计算校验位数→确定校验码位置→确定校验码→实现校验和纠错。下面来具体介绍这几个步骤。本文先介绍除最后一个步骤的其它几个步骤。

1.    计算校验位数

    要使用海明码纠错,首先就要确定发送的数据所需要要的校验码(也就是“海明码”)位数(也称“校验码长度”)。它是这样的规定的:假设用N表示添加了校验码位后整个信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位,它们之间的关系应满足:N=K+r≤2r-1。

    如K=5,则要求2r-r≥5+1=6,根据计算可以得知r的最小值为4,也就是要校验5位信息码,则要插入4位校验码。如果信息码是8位,则要求2r-r≥8+1=9,根据计算可以得知r的最小值也为4。根据经验总结,得出信息码和校验码位数之间的关系如表5-1所示。

表5-1   信息码位数与校验码位数之间的关系

信息码位数

1

2~4

5~11

12~26

27~57

58~120

121~247

校验码位数

2

3

4

5

6

7

8

2.确定校验码位置

    上一步我们确定了对应信息中要插入的校验码位数,但这还不够,因为这些校验码不是直接附加在信息码的前面、后面或中间的,而是分开插入到不同的位置。但不用担心,校验码的位置很容易确定的,那就是校验码必须是在2n次方位置,如第1、2、4、8、16、32,……位(对应20、21、22、23、24、25,……,是从最左边的位数起的),这样一来就知道了信息码的分布位置,也就是非2n次方位置,如第3、5、6、7、9、10、11、12、13,……位(是从最左边的位数起的)。

    举一个例子,假设现有一个8位信息码,即b1、b2、b3、b4、b5、b6、b7、b8,由表5-1得知,它需要插入4位校验码,即p1、p2、p3、p4,也就是整个经过编码后的数据码(称之为“码字”)共有12位。根据以上介绍的校验码位置分布规则可以得出,这12位编码后的数据就是p1、p2、b1、p3、b2、b3、b4、p4、b5、b6、b7、b8。

    现假设原来的8位信息码为10011101,因现在还没有求出各位校验码值,现在这些校验码位都用“?”表示,最终的码字为:??10011101

3.    确定校验码

经过前面的两步,我们已经确定了所需的校验码位数和这些校验码的插入位置,但这还不够,还得确定各个校验码值。这些校验码的值不是随意的,每个校验位的值代表了代码字中部分数据位的奇偶性(最终要根据是采用奇校验,还是偶校验来确定),其所在位置决定了要校验的比特位序列。总的原则是:第i位校验码从当前位开始,每次连续校验i(这里是数值i,不是第i位,下同)位后再跳过i位,然后再连续校验i位,再跳过i位,以此类推。最后根据所采用的是奇校验,还是偶校验即可得出第i位校验码的值。

    1)计算方法

    校验码的具体计算方法如下:

    p1(第1个校验位,也是整个码字的第1位)的校验规则是:从当前位数起,校验1位,然后跳过1位,再校验1位,再跳过1位,……。这样就可得出p1校验码位可以校验的码字位包括:第1位(也就是p1本身)、第3位、第5位、第7位、第9位、第11位、第13位、第15位,……。然后根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

    p2(第2个校验位,也是整个码字的第2位)的校验规则是:从当前位数起,连续校验2位,然后跳过2位,再连续校验2位,再跳过2位,……。这样就可得出p2校验码位可以校验的码字位包括:第2位(也就是p2本身)、第3位,第6位、第7位,第10位、第11位,第14位、第15位,……。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

    p3(第3个校验位,也是整个码字的第4位)的校验规则是:从当前位数起,连续校验4位,然后跳过4位,再连续校验4位,再跳过4位,……。这样就可得出p4校验码位可以校验的码字位包括:第4位(也就是p4本身)、第5位、第6位、第7位,第12位、第13位、第14位、第15位,第20位、第21位、第22位、第23位,……。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

    p4(第4个校验位,也是整个码字的第8位)的校验规则是:从当前位数起,连续校验8位,然后跳过8位,再连续校验8位,再跳过8位,……。这样就可得出p4校验码位可以校验的码字位包括:第8位(也就是p4本身)、第9位、第10位、第11位、第12位、第13位、第14位、第15位,第24位、第25位、第26位、第27位、第28位、第29位、第30位、第31位,……。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

……

    我们把以上这些校验码所校验的位分成对应的组,它们在接收端的校验结果(通过对各校验位进行逻辑“异或运算”得出)对应表示为G1、G2、G3、G4,……,正常情况下均为0。

    2)校验码计算示例

    同样举上面的例子来说明,码字为??10011101

    先求第1个“?”(也就是p1,第1位)的值,因为整个码字长度为12(包括信息码长和校验码长),所以可以得出本示例中p1校验码校验的位数是1、3、5、7、9、11共6位。这6位中除了第1位(也就是p1位)不能确定外,其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验(也就是要求整个被校验的位中的“1”的个数为偶数),从已知的5位码值可知,已有3个“1”,所以此时p1位校验码的值必须为“1”,得出p1=1。

    再求第2个“?”(也就是p2,第2位)的值,根据以上规则可以很快得出本示例中p2校验码校验的位数是2、3、6、7、10、11,也是一共6位。这6位中除了第2位(也就是p2位)不能确定外,其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验,从已知的5位码值可知,也已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p2=1。

   再求第3个“?”(也就是p3,第4位)的值,根据以上规则可以很快得出本示例中p3校验码校验的位数是4、5、6、7、12,一共5位。这5位中除了第4位(也就是p3位)不能确定外,其余4位的值都是已知的,分别为:0、0、1、1。现假设采用的是偶校验,从已知的4位码值可知,也已有2个“1”,所以此时p2位校验码的值必须为“0”,得出p3=0。

   最后求第4个“?”(也就是p4,第8位)的值,根据以上规则可以很快得出本示例中p4校验码校验的位数是8、9、10、11、12(本来是可以连续校验8位的,但本示例的码字后面的长度没有这么多位,所以只校验到第12位止),也是一共5位。这5位中除了第8位(也就是p4位)不能确定外,其余4位的值都是已知的,分别为:1、1、0、1。现假设采用的是偶校验,从已知的4位码值可知,已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p4=1。

    最后就可以得出整个码字的各个二进制值码字为:111000111101(带阴影的4位就是校验码)。

4.纠错

循环冗余校验( CRC)和海明码的编码和校验方法_crc循环冗余校验和海明码校验-CSDN博客

使用上述方法同样得出包括对应校验位的异或值G,若为偶校验,那么最终值为0表示正确,若为奇校验,那么最终值为1表示正确。在由只有校验码组成的二进制数中,正确为0,错误为1,最后得到的十进制数就是出现错误的位数。

假设接收到的数据为111010111101(原数据中第五位由0变为1)

G1 = 第1位⊕第3位⊕第5位⊕第7位⊕第9位⊕第11位 = 1⊕1⊕1⊕1⊕1⊕0 = 1(错误,偶校验应该为0)

G2 = 第2位⊕第3位⊕第6位⊕第7位⊕第10位⊕第11位 = 1⊕1⊕0⊕1⊕1⊕0 = 0(正确)

G3 = 第4位⊕第5位⊕第6位⊕第7位⊕第12位 = 0⊕1⊕0⊕1⊕1 = 1(错误,偶校验应该为0)

G4 = 第8位⊕第9位⊕第10位⊕第11位⊕第12位 = 1⊕1⊕1⊕0⊕1 = 0(正确)

由G4 G3 G2 G1,构成的二进制数,错误填上1,正确填上0,得到 0 1 0 1,转化为10进制为5,表示数据中第五位错误。

同样的数10011101若使用奇校验,得到传输数据为001100101101,同样假设接收到数据时第五位发生变化,收到数据为001110101101

G1 = 第1位⊕第3位⊕第5位⊕第7位⊕第9位⊕第11位 = 0⊕1⊕1⊕1⊕1⊕0 = 0(错误,奇校验应该为1)

G2 = 第2位⊕第3位⊕第6位⊕第7位⊕第10位⊕第11位 = 0⊕1⊕0⊕1⊕1⊕0 = 1(正确)

G3 = 第4位⊕第5位⊕第6位⊕第7位⊕第12位 = 1⊕1⊕0⊕1⊕1 = 0(错误,奇校验应该为1)

G4 = 第8位⊕第9位⊕第10位⊕第11位⊕第12位 = 0⊕1⊕1⊕0⊕1 = 1(正确)

由G4 G3 G2 G1,构成的二进制数,错误填上1,正确填上0,得到 0 1 0 1,转化为10进制为5,表示数据中第五位错误。

​​​​​​​

5. 码距

两个相同长度的字符串中,把其中一个字符串替换成另一个字符串需要的操作次数
如: 10000 和 10001 的码距为 1,只需要把末尾的 0 换成 1 即可
而: 00000 和 11111 的码距为 5,需要把五个 0 换成 1
编码的海明距是指该种编码中最小的存在的码距

对此引出如下结论
1)海明码“纠错” d 位,需要的编码码距最小为 2d + 1
2)海明码“检错” d 位,需要的编码码距最小为 d + 1

对于 1)
因为只有当码距大于 2d + 1 时,才存在一个码距最接近的值与之对应
例:编码为 A(100000) B(111111) 如果 A 发生了两位错误变成了 100011 则此时这段与 A 的码距为 2,与 B 的码距为 3,所以能推断是 A 发生了错误,并对其进行纠正,相反如果编码为 A(10000) B(11111) ,此时 A 发生了两位错误变成了 10011,此时这段字符串与 A 的码距为 2,与 B 的码距也为 2,无法判断是 A 发生了错误还是 B 发生了错误,所以说需要码距大于 2d + 1
对于 2)
在编码码距为 d + 1 中只改变了 d 位的数据是不可能变为另一个合法值的,所以最小为 d + 1 位

更详细的可以看一下 NR-LDPC编码(一):纠错编码基本原理 - 知乎 (zhihu.com)


http://www.ppmy.cn/ops/37632.html

相关文章

“王翦五讨赏地,萧何三贬其身”的背后,正是智者安身的处世之道

冯子曰:智者,术所以生也;术者,智所以转也。 智慧的人,从不蛮行横性,而是懂得如何在世道和自我之间谋得最佳的处境。 最近在《智囊全集》中偶然瞥到的一则小故事,恰如文首所言。 01、王翦五讨…

WPF (Windows Presentation Foundation) 中 Attribute(属性)和 Property(属性)

在 WPF (Windows Presentation Foundation) 中,Attribute(属性)和 Property(属性)是两个相关但不同的概念。 Attribute(属性)是一种元数据,用于给类型、成员或其他代码元素添加附加…

Hive数据模型

Hive数据模型 1. 表(Table): 表是数据库中的基本组成单位,用于存储数据。它由一系列的行和列组成,每行代表一个记录,每列代表一种属性或字段。创建表时,你需要定义列的数据类型、约束和索引等信…

Redis单机安装

1.编译 cd redis安装目录 makemake install2.修改配置文件redis.conf #端口修改 port 6379 #后台进程启动 yes daemonize yes # daemonize no #注释掉 为了可以远程连接 #bind 127.0.0.1 #设置密码 requirepass pwd3.启动 ./redis-server ../redis.conf查看进程 [rootlocal…

零售全渠道营销业务链分析,让企业管控能力大幅加强!

对于传统的、规模化的零售快消企业来讲,面临着很大的渠道管理和建设问题,如何尽快实现整个营销体系的全渠道数字化转型是当务之急、重中之重。 面对错综分散的经销商,零售快消企业订货流程会越复杂,加之对门店管理较为粗放&#…

参数服务器

参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。 参数服务器,一般适用于存在数据共享…

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)

🐶原文: Preventing Content Cloning in NFT Collections 🐶写在前面: 这是一篇 2023 年的 CCF-C 类,本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT​ and Blockchains with Native S…

Axure实现菜单抽屉效果

Axure是怎么实现如下效果的? 菜单打开和收起侧边栏菜单抽屉效果 实现效果 两级菜单,点击菜单收起其他菜单,打开当前菜单。 实现原理 单击一级菜单时,1)切换当下二季菜单的显示/隐藏状态 2)隐藏其他菜单…