2021/11/26 from Xwhite
离散信源编码-香农编码
实验内容
实验代码
from math import *
import prettytable
# 求信息量函数
def ent(a):
return -log(a, 2)
if __name__ == '__main__':
value_list = input('请输入信源空间(以空格分隔):')
value_list = value_list.split(" ")
CP_list = [] # 累加概率
ent_list = [] # 信息量
cl_list = [] # 码长
pl_list = [] # pi*2^li
cw_list = [] # 码字
l = len(value_list)
temp = 0.00
value_list = [float(value_list[i]) for i in range(l)]
value_list.sort(reverse=True) # 降序排序
# 求累加概率
for i in range(0, l):
if i == 0:
CP_list.insert(i, 0.00)
temp = CP_list[i]
continue
CP_list.insert(i, temp + value_list[i - 1])
temp = CP_list[i]
CP_list[i] = round(CP_list[i], 2) # 保留两位
table = prettytable.PrettyTable(['Si', 'Pi', 'Li', 'Ent', 'CL', 'Pi*2^Li', 'CW'])
# 这里是为了 让表格更美观,所以将表头转为英文符号
for i in range(0, l):
ent_list.insert(i, ent(value_list[i])) # 求熵
cl_list.insert(i, ceil(ent_list[i])) # 求码长
pl_list.insert(i, CP_list[i] * (2 ** cl_list[i]))
cw_list.insert(i, floor(pl_list[i]))
cw_list[i] = floor(cw_list[i])
cw_list[i] = bin(cw_list[i])[2:] # 去掉0b
cw_list[i] = cw_list[i].zfill(cl_list[i]) # 不够码长的长度 前面补0
table.add_row([i + 1, value_list[i], CP_list[i], ent_list[i], cl_list[i], pl_list[i], cw_list[i]])
table.align = 'l'
print(table)
实验结果
有问题评论区请在评论区指正,白嫖或借鉴请点个赞。