天津理工大学信息论与编码实验(3)

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)

实验结果

在这里插入图片描述

在这里插入图片描述
有问题评论区请在评论区指正,白嫖或借鉴请点个赞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值