hamming code只能纠错单个错误
汉明码的精髓就在于,在2^n处为纠错码,如果有data传输错误,会有两个纠错码发现错误,这两个纠错码何在一起就是错误点的坐标。
以下为例子:
假设data为:001_1000_1110,是一个11bit位数:
如上表绿色为data,蓝色为编码值,右下角角标为地址。
address=0x0001: p1 = address_0x0101 ^ address_0x1001 ^ address_0x1101 ^ address_0x0011 ^ address_0x0111 ^ address_0x1011 ^ address_0x1111 = p5 ^ p9 ^ p13 ^ p3 ^ p7 ^ p11 ^ p15 ([0]=1)
address=0x0010:p2 = address_0x0110 ^ address_0x1010 ^ address_0x1110 ^ address_0x0011 ^ address_0x0111^ address_0x1011 ^ address_0x1111 = p6 ^ p10 ^ p14 ^ p3 ^ p7 ^ p11 ^ p15 ([1]=1)
address=0x0100:p4 = address_0x0101 ^ address_0x0110 ^ address_0x0111 ^ address_0x1100 ^ address_0x1101 ^ address_0x1110 ^ address_0x1111 = p5 ^ p6 ^ p7 ^ p12 ^ p13 ^ p14 ^ p15 ([2]=1)
address=0x1000:p8 = address_0x1001 ^ address_0x1010 ^ address_0x1011 ^ address_0x1100 ^ address_0x1101 ^ address_0x1110 ^ address_0x1111 = p9 ^ p10 ^ p11 ^ p12 ^ p13 ^ p14 ^ p15 ([3]=1)
如果说不出错的话:p1 ^ p2 ^ p2 ^ p3 ^ p4 ^ p5 ^ p6 ^ p7 ^ p8 ^ p9 ^ p10 ^ p11 ^ p12 ^ p13 ^ p14 ^ p15 = (p3 ^ p3 ^ p3) ^ (p5 ^ p5 ^ p5) ^ (p6 ^ p6 ^ p6) ^ (p7 ^ p7 ^ p7 ^ p7) ^ (p9 ^ p9 ^ p9) ^ (p10 ^ p10 ^ p10) ^ (p11 ^ p11 ^ p11 ^ p11) ^ (p12 ^ p12 ^ p12)^ (p13 ^ p13 ^ p13 ^ p13) ^ (p14 ^ p14 ^ p14 ^ p14) ^ (p15 ^ p15 ^ p15 ^ p15 ^ p15) = p3 ^ p5 ^ p6 ^ p9 ^ p10 ^ p12 ^ p15
将值为1的address来做异或:
0 0 1 0
0 1 0 0
0 1 1 0
0 1 1 1
1 0 0 0
1 1 0 0
1 1 0 1
异或 1 1 1 0
--------------------------------
0 0 0 0
假设有一个值由0变成1:
0 0 1 0
0 1 0 0
0 1 1 0
0 1 1 1
1 0 0 0
1 1 0 0
1 1 0 1
异或 1 1 1 0
new_address
--------------------------------
0 0 0 0
异或 new_address
-------------------------------
= new_address
同理一个值由1变为0,上面的公式就是去掉一个原来存在的address,最后的结果就是输出原来存在的address,不管是由1变0还是由0变1,最后都能找到该错误值的地址
硬件实现时:
个位数地址:addr0 = p1_传输 ^ p1_计算结果(传输结果=计算结果,则个位数地址为0)
p1_传输 = p1
p1_计算 = p5 ^ p9 ^ p13 ^ p3 ^ p7 ^ p11 ^ p15 (都是传输过来的值,再计算)
同理可得到add1 = p2_传输 ^ p2_计算结果;
addr2 = p4_传输 ^ p4_计算结果
addr3 = p8_传输 ^ p8_计算结果
错误的地址addr_error = {addr3, addr2, addr1, addr0}, 用分类讨论(case)将对应的结果把值翻转即可
https://www.bilibili.com/video/BV1pV411y7E8/?spm_id_from=333.788.recommend_more_video.-1&vd_source=8fe00fe985db84afad067de6c9f4df1e