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