欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入浅出:海明码校验与纠错原理及实现详解

时间:11-21 名人轶事 提交错误

老铁们,大家好,相信还有很多朋友对于深入浅出:海明码校验与纠错原理及实现详解和的相关问题不太懂,没关系,今天就由我来为大家分享分享深入浅出:海明码校验与纠错原理及实现详解以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

编码原理

若汉明码长度为n,信息位数为k,则需要插入r个监督位校验码。如果想让r个校验码组成r个关系来指示错误码的n个可能的位置,则需要

那是

例如,如果我们有一个8位二进制数需要编码,那么应该有

信息码位数为1245111226。校验码位数为2345

校验码位置

。汉明码的校验码都是2的整数次方,即1次、2次、4次等。

请注意,这不是数组索引,没有第0 位数字。

第n个校验码12345位于124816处。如果用pn来表示第n个校验码

dk 代表第k个数据

所以我们的8位二进制数编码结果应该是

位数1(0001)2(0010)3(0011)4(0100)5(0101)6(0110)7(0111)8(1000)9(1001)10(1010)11(1011)12(1100) 数据p1p2d1p3d2d3d4p4d5d6d7d8

校验码计算

校验位1的校验规则是:从当前位开始,校验一位数,跳过一位数,再校验一位数,再跳过一位数.也就是说,校验位的最后一位所有数据位位置号的二进制表示均被验证为1,即0001、0011、0101、0111、1001、1011

同理,第k个校验位的验证规则是从当前位开始连续检查位,然后跳过位……也就是说,应该检查第k个校验位。数据位位置编号的二进制表示的二进制表示的最后一位起第1 位为1。

其实就是一个二进制数的第k位表示

那么如何计算呢?

我以前学过奇校验和偶校验,现在我可以使用它们了。

奇校验要求整个待检查位中“1”的个数为奇数,偶校验要求整个待检查位中“1”的个数为偶数。

让我们尝试一下使用偶校验。

比如我们输入的数据是10111011

插入后应该是

位数1(0001)2(0010)3(0011)4(0100)5(0101)6(0110)7(0111)8(1000)9(1001)10(1010)11(1011)12(1100) 数据p1p21p3011p41011 计算p1。除p1 本身外,0001、0011、0101、0111、1001 和1011 位中有4 个1。所有p1 都为0,因此“1”的总数为0。

同理,p2为0

p3 为1

p4 为1

结果数据是

海明码纠错

与普通的奇偶校验相比,汉明码的强大之处在于它不仅可以实现校验,还可以实现1位纠错。

仍然以我们的偶校验为例

p1p2d1p3d2d3d4p4d5d6d7d8p1p2p3p4number 001101111011 可见,所有校验码位都不会受到其他校验码的影响。只检查我们自己,这样可以保证如果我们的一个校验码错误,不会影响其他校验码的验证结果,并且我们可以很容易地找到错误的校验码。

因此,如果我们的四个校验组中只有一个的计算结果是错误的,则说明该位的校验码错误,只需将其取反即可。

我们再看一下数据位。

由于每条数据都经过2-3次验证,错误验证组数必须大于1

如果两个检查组错误,则有d1、d2、d3、d5、d6、d8。每个数据位对应于校验组的组合形式,因此我们知道哪两个校验组是错误的。知道是哪一个出了问题。

如果三个检查组都出现错误,也可以用同样的方法找出是哪一组。

写写代码

我本来应该用FPGA来写verilog,但现在我只能在电脑上写python

我用Python做了一个汉明码编码和验证纠错。

汉明类():

def __init__(自身,数据):

self.data=数据

def 汉明编码(自身):

self.dataLen=len(self.data)

自我.r=0

while pow(2,self.r) - self.r self.dataLen + 1:

自我.r +=1

self.HammingLen=self.r + self.dataLen #求插入校验码后的总长度

self.HammingData=[0] * self.HammingLen

对于我在范围(self.r):

self.HammingData[pow(2,i)-1]=1#首先默认校验位设置为1

数据索引=0

for i in range(self.HammingLen):#插入数据

如果self.HammingData[i]==0:

self.HammingData[i]=self.data[dataIndex]

数据索引+=1

打印(self.HammingData)

for pn in range(1,self.r+1):#一一计算校验位

#pn位置

pos=pow(2,(pn-1)) - 1

温度=0

对于范围内的pr(pos,self.HammingLen+1,pow(2,pn)):

for i in range(pr,min(pr+pow(2,(pn-1)),self.HammingLen)):#疯狂异或

temp ^=self.HammingData[i]

如果温度==1:

self.HammingData[pos]=0

打印(self.HammingData)

def makeMistake(self,k):

如果self.HammingData[k]==0:

self.HammingData[k]=1

否则:

self.HammingData[k]=0

打印(self.HammingData)

def hammingDecode(self):

错误列表=[]

for pn in range(1,self.r+1):#逐一计算检查组

#pn位置

pos=pow(2,(pn-1)) - 1

温度=0

对于范围内的pr(pos,self.HammingLen+1,pow(2,pn)):

for i in range(pr,min(pr+pow(2,(pn-1)),self.HammingLen)):#疯狂异或

temp ^=self.HammingData[i]

打印(温度)

如果温度==1:

errorList.append(pn)#记住哪个检查组是错误的

如果错误列表:

print("原始数据",self.HammingData)

if len(错误列表)==1:

self.HammingData[pow(2,wrongList[0]-1)-1] ^=1

elif len(错误列表)==2:

如果错误列表中为1,错误列表: 中为2

self.HammingData[2] ^=1

elif 1 在错误列表中,3 在错误列表: 中

self.HammingData[4] ^=1

elif 1 在错误列表中,4 在错误列表: 中

self.HammingData[8] ^=1

elif 2 在错误列表中,3 在错误列表: 中

self.HammingData[5] ^=1

elif 2 在错误列表中,4 在错误列表: 中

self.HammingData[9] ^=1

elif 4 在错误列表中,3 在错误列表: 中

self.HammingData[11] ^=1

elif len(错误列表)==3:

如果错误列表中为1,错误列表中为2,错误列表中为3:

self.HammingData[6] ^=1

elif 1 在错误列表中,2 在错误列表中,4 在错误列表: 中

self.HammingData[10] ^=1

print("当前数据",self.HammingData)

返回错误

否则:

返回真

a=汉明([1,0,1,1,1,0,1,1])

a.hammingEncode()

a.hammingDecode()

文章到此结束,如果本次分享的深入浅出:海明码校验与纠错原理及实现详解和的问题解决了您的问题,那么我们由衷的感到高兴!

用户评论

予之欢颜

太棒了!终于找到了能解释海明码这么简单的教程。

    有19位网友表示赞同!

来自火星球的我

我一直对校验和纠错不太懂,这个标题听起来很吸引人,我要去看一看!

    有10位网友表示赞同!

如你所愿

超级无敌简单?那肯定是我需要的!

    有9位网友表示赞同!

寒山远黛

想学习一下海明码的原理,这个文章看起来很有帮助。

    有14位网友表示赞同!

全网暗恋者

看来实现海明码并不复杂,期待教程中详细讲解。

    有10位网友表示赞同!

淡淡の清香

终于有人做出易懂的海明码资料了,真是太棒了!

    有16位网友表示赞同!

嗯咯

以前想学习海明码都觉得好难懂,这个标题给我希望能了解清楚。

    有5位网友表示赞同!

单身i

我已经开始尝试理解海明码了,这篇教程正好能帮到我。

    有17位网友表示赞同!

挽手余生ら

学习一下校验和纠错原理,将来写代码肯定有用!

    有17位网友表示赞同!

ゞ香草可樂ゞ草莓布丁

海明码听起来很酷,我要知道它是如何工作的!

    有13位网友表示赞同!

凉话刺骨

简单易懂的教程一直是我喜欢的形式,期待看看这个海明码的介绍。

    有15位网友表示赞同!

陌颜

想用海明码解决数据传输的问题,这篇文章或许能给我一些启发。

    有18位网友表示赞同!

柠夏初开

终于有机会学习一下海明码的代码实现了,好激动!

    有17位网友表示赞同!

柠栀

看了标题感觉这篇教程很实用,我要收藏起来备用!

    有12位网友表示赞同!

清羽墨安

之前对海明码概念还有些模糊,这篇文章能让我更加清晰地了解它。

    有10位网友表示赞同!

ok绷遮不住我颓废的伤あ

分享一下这个超级无敌简单的教程,希望能帮到想要学习海明码的朋友!

    有10位网友表示赞同!

坠入深海i

相信这篇教程也能帮助我理解校验和纠错的原理!

    有10位网友表示赞同!

惯例

学习海明码不仅有趣,还能提升我的编程技能!

    有12位网友表示赞同!

抓不住i

想要了解更多关于校验和纠错技术的知识,这篇文章一定是一个很好的起点。

    有17位网友表示赞同!

【深入浅出:海明码校验与纠错原理及实现详解】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活