海明码中各个矩阵的原理:
https://blog.csdn.net/weixin_57915039/article/details/117523933?spm=1001.2014.3001.5501
本人初学python,代码仅供思路分享~ (优化不行)
一、
import numpy as np
def Change_Type(num_list):
num_list_new = [int(i) for i in num_list]
return num_list_new
def Sequence_adjustment(list_created):
M=np.mat((np.array([list_created])))
print(M)
1. 引入numpy
2. 定义Change_Type函数,功能为把list里的str转成int
3. 定义Sequence_adjustment,功能为把list变成矩阵的样子(美观)
二、
message=input('Input the message: ')
y=len(message)
print('the length of message y is: ', y)
p=0
while 2**p<p+1+y:
p=p+1
print('the number of parity bits are: ', p)
x=y+p
print('the total length of hamming code is: ', x)
m = Change_Type(message)
print('the message is: ', m)
print('\n')
4. 输入信息
5. 计算信息长度y
6. 利用while循环计算2^p>=p+1+y的整数最小值,p为奇偶校验位数量
7. 可以通过信息长度y加上奇偶校验位数量p得到海明码总长x
8. 利用Change_Type函数,把输入的信息放到list并转成int
三、
Ht=[]
for i in range(1, x+1):
DEC_to_BIN = bin(i)[2:].zfill(p)
L = list(reversed(Change_Type(DEC_to_BIN)))
Ht.append(L)
9. 生成一个Ht列表(矩阵),将1到x(海明码总长)的数转成二进制,并向右对齐,然后进行reversed。
四、
Ht_tool=[]
for i in range(1,x+1):
DEC_to_BIN = bin(i)[2:].zfill(p)
L = list(reversed(Change_Type(DEC_to_BIN)))
Ht_tool.append(L)
np.transpose(Ht_tool)
H=np.transpose(Ht_tool).tolist()
H_tool=H
10. 再生成一个Ht_tool,和上面算法一模一样,只是为了让Ht保持独立
11. 用np.transpose把整个Ht_tool(即Ht)矩阵 “翻过来”
效果如下:
12. 设置H_tool让H独立
五、
Parity_bit_list=[]
for j in range(0,p):
Parity_bit_list.append(2**j)
Parity_bit_list.reverse()
for i in Parity_bit_list:
del Ht_tool[i-1]
import numpy as np
np.transpose(Ht_tool)
H_tool=np.transpose(Ht_tool).tolist()
h=H_tool
13. 生成一个奇偶校验位位置的列表。
效果为:如p=3,即生成 [ 1, 2, 4 ]; 如p=4,即生成 [ 1, 2, 4, 8 ];
14. 将生成的奇偶校验位列表翻转,然后把Ht矩阵里对应奇偶校验位的行删除。
将奇偶校验位列表翻转可以避免:del每次循环都会生成一个新的表格,如果从低位开始减会出现第一次减第1个元素,第二次减新表格的第2个元素,从而出现bug。
15. 将减掉奇偶校验位的行的矩阵进行翻转,可以得到新矩阵h
六、
print("The Ht matrix of the message is: ")
Sequence_adjustment(Ht)
print('\n')
print("The H matrix of the message is: ")
Sequence_adjustment(H)
print(type(H))
print('\n')
print("The h matrix of the message is: ")
Sequence_adjustment(h)
print('\n')
16. 将各个list用Sequence_adjustment函数输出并变成矩阵的样子。
下面为完整代码~
# by ziki
import numpy as np
def Change_Type(num_list):
num_list_new = [int(i) for i in num_list]
return num_list_new
def Sequence_adjustment(list_created):
M=np.mat((np.array([list_created])))
print(M)
############################################################################
message=input('Input the message: ')
y=len(message)
print('the length of message y is: ', y)
p=0
while 2**p<p+1+y:
p=p+1
print('the number of parity bits are: ', p)
x=y+p
print('the total length of hamming code is: ', x)
m = Change_Type(message)
print('the message is: ', m)
print('\n')
#############################################################################
Ht=[]
for i in range(1, x+1):
DEC_to_BIN = bin(i)[2:].zfill(p)
L = list(reversed(Change_Type(DEC_to_BIN)))
Ht.append(L)
Ht_tool=[]
for i in range(1,x+1):
DEC_to_BIN = bin(i)[2:].zfill(p)
L = list(reversed(Change_Type(DEC_to_BIN)))
Ht_tool.append(L)
# Ht_tool can make H independent
np.transpose(Ht_tool)
H=np.transpose(Ht_tool).tolist()
H_tool=H
# H_tool can make H independent
Parity_bit_list=[]
for j in range(0,p):
Parity_bit_list.append(2**j)
Parity_bit_list.reverse()
for i in Parity_bit_list:
del Ht_tool[i-1]
import numpy as np
np.transpose(Ht_tool)
H_tool=np.transpose(Ht_tool).tolist()
h=H_tool
print("The Ht matrix of the message is: ")
Sequence_adjustment(Ht)
print('\n')
print("The H matrix of the message is: ")
Sequence_adjustment(H)
print(type(H))
print('\n')
print("The h matrix of the message is: ")
Sequence_adjustment(h)
print('\n')