这是我大三上学期的一个作品。然后为了能够显示中间过程,用面向过程的思想编写。
- 注:强烈建议用 jupyter 运行代码
- n 代表运行顺序
- In [n]: 代表第 n 步运行
- Out [n]: 代表第 n 步运行对应的输入
- In [ ]: 代表不运行
In [1]:
import numpy as np
In [2]:
# 二进制 转 十进制
def Bin_to_Dec(Bin):
Dec = 0
for i in range(len(Bin)):
Dec += Bin[-i-1] * 2 ** i
return Dec
class HammingCode:
def __init__(self):
"""
定义 生成矩阵 G 和 校验矩阵 H
"""
self.G = np.array(
[[1, 0, 0, 0, 0, 1, 1],
[0, 1, 0, 0, 1, 0, 1],
[0, 0, 1, 0, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 1]], dtype = np.uint8)
self.H = np.array(
[[0, 0, 0, 1, 1, 1, 1],
[0, 1, 1, 0, 0, 1, 1],
[1, 0, 1, 0, 1, 0, 1]], dtype = np.uint8)
def getHammingCode(self, v):
"""
获取汉明码,由4位信息码生成7位汉明码
"""
vG = np.matmul(v, self.G)
for i in range(len(vG)):
vG[i] %= 2
return vG
def checkHammingCode(self, vG):
"""
检查汉明码,如果没有错误就打印ok;如果出现错误,自动纠正并打印正确的汉明码
"""
HvGT = np.matmul(self.H, vG.T)
for i in range(len(HvGT)):
HvGT[i] %= 2
if 1 not in HvGT:
print("ok")
else:
print("error")
error_i = Bin_to_Dec(HvGT) - 1
vG[error_i] = 0 if vG[error_i] == 1 else 1
print("True vG", vG)
In [3]:
hc = HammingCode()
In [4]:
# 以 1 0 1 0 为例
vG = hc.getHammingCode(np.array([1, 0, 1, 0], dtype = np.uint8))
print(vG)
print("信息码", vG[:4])
print("监督码", vG[4:])
hc.checkHammingCode(vG)
Out [4]:
[1 0 1 0 1 0 1] 信息码 [1 0 1 0] 监督码 [1 0 1] ok
In [5]:
# 输入错误的汉明码 1 0 0 0 1 0 1 error_vG = np.array([1, 0, 0, 0, 1, 0 ,1], dtype = np.uint8) hc.checkHammingCode(error_vG)
Out [5]:
error True vG [1 0 1 0 1 0 1]



