一、设计目标

实现任意Q符号信源的二进制香农编码,其中Q>10且由用户自行输入,信源的概率分布也由用户输入。展示编码结果、平均码长、信源熵、编码效率。

二、设计步骤

(1)输入模块:实现对Q和信源概率数组(odds)的输入,并对其作出判断:Q是否满足大于10、概率数组长度是否为Q、概率和是否为1;

(2)编码模块:

①对概率进行排序;

②求取各概率P(xi)的香农编码码字长度;

③求取累积Pi概率;

④通过累积概率求取各符号的码字;

(3)输出模块:打印编码结果和编码效率等参数。

三、代码实现

%%shannon code
%%输入Q值并判断
while(1)Q = input("请输入Q的值(Q>10): ");if(Q <= 10)disp('不满足Q>10的条件,请重新输入Q值!');elsebreak;end
end%%输入Q个元素的概率并判断
%%提供待测数组Q=11:[0.1274 0.1416 0.0199 0.1428 0.0989 0.0152 0.0435 0.0855 0.1497 0.1509 0.0246]
while(1)odds = input("请以数组形式[]输入Q个元素各自的概率(p>0):");length_odds = length(odds);if(length_odds ~= Q)disp('输入概率个数错误(不为Q),请重新输入!');elseif(sum(odds) ~= 1)disp(['概率之和为:',num2str(sum(odds))]);%%帮助概率纠错disp('输入概率数值有误,请重新输入!');elsebreak;end
end%%对概率进行排序并求计算累积概率
[sort_odds , sort_index] = sort(odds , 'descend');%%分别为排序后的概率与最初的索引
odds_log2 = -log2([sort_odds]);
length_shannon = ceil(odds_log2);%%求得二进制代码组的长度
p = zeros(1,11);%%累积概率
for i = 2 : Qp(i) = sum(sort_odds(1 : (i - 1)));
end%%编码
%%思路:将原本的积累概率乘2^L(即将二进制小数左移L位),可直接取整数部分的二进制值
%%过长的码字从截取最右端L位
shift_p = p.*(2.^length_shannon);%%移位后的值
shift_p_bin = dec2bin(shift_p);%%二进制结果,得到Q*Lmax char数组,可用shift_p_bin(i,:)调用
shannon_code = [];%%编码结果
for j = 1 : Ql1 = length_shannon(j);l2 = length(shift_p_bin(j,:));%%待截取码字长度code = shift_p_bin(j,:);%%待截取码字shannon_code = [shannon_code , str2num(code(l2-l1+1 : l2))];
end%%编码结果打印
disp('--------------------------------------');
disp('香农编码结果:');
len_shannon = 0;
for k = 1 : Qindex = sort_index(k);num = num2str(index);od = num2str(sort_odds(k));%%字符串形式的概率co = num2str(shannon_code(k));%%字符串形式的编码len_shannon = len_shannon + length_shannon(k)*sort_odds(k);if(length(co) ~= length_shannon(k))num_0 = length_shannon(k) - length(co);%%需要补充的0的个数for ii = 1 : num_0co = ['0',co];endenddisp(['第',num,'个符号的概率为:',od,',香农编码为:',co]);
end%%编码参数计算与展示
l = len_shannon;%%平均码长
H = sum(odds.*log2(1./odds));%%熵
eff = H / (l*log2(2));%%编码效率
disp('--------------------------------------');
disp(['平均码长:',num2str(l)]);
disp(['信源熵:',num2str(H)]);
disp(['编码效率:',num2str(eff)]);

四、运行结果

此处以提供的待测数组为测试对象:

五、总结

(1)Q的取值范围可根据代码最前段自行更改;

(2)概率和是否为1的判断可以删去,因为有时候会无故报错(我也不知道为啥);

(3)作者编程水平有限,希望为读者能提供一定帮助。

香农编码的MATLAB实现相关推荐

  1. 香农编码的 matlab 实现

    close all;clear all;clc; % 香农编码matlab实现 p = [0.5 0.19 0.19 0.07 0.05] %输入概率 n = length(p); y = flipl ...

  2. 信息论与编码|香农编码的Matlab实现

    1. 香农编码原理 (1)将信源消息符号按其出现的概率大小依次降序排列为: (2)对概率向上取整求整数码长K (3)为了编成唯一可译码,计算第i个消息的累加概率P (4)将累加概率转换成二进制数 (5 ...

  3. 实验三-香农编码的MATLAB实现

    信息论编码实验3~9连载,更多看专栏. 香农编码仿真实现 一.香农编码的原理 二.香农编码实例 三.程序及流程图 四.程序运行结果 五.程序自评价 一.香农编码的原理 香农码严格意义上来说不是最佳码, ...

  4. 香农编码用matlab实验报告,信息论与编码实验指导书

    实验一 绘制二进熵函数曲线(2个学时) 一.实验目的: 1. 掌握Excel 的数据填充.公式运算和图表制作 2. 掌握Matlab 绘图函数 3. 掌握.理解熵函数表达式及其性质 二.实验要求: 1 ...

  5. 香农编码与Huffman编码之间的对比

    目录 一.[上机目的] 二.[环境] 三.[上机原理] 四.[上机内容] 五.设计思路 5.1霍夫曼编码特点 5.2霍夫曼编码原理 5.3二进制哈夫曼编码过程 5.4计算结果 5.5霍夫曼编码的MAT ...

  6. 信息论与编码matlab实验报告,信息论实验报告(实验三、香农编码)

    <信息论实验报告(实验三.香农编码)>由会员分享,可在线阅读,更多相关<信息论实验报告(实验三.香农编码)(3页珍藏版)>请在人人文库网上搜索. 1.学生实验报告院别电子工程学 ...

  7. 计算信源熵和香农编码C语言,信息论与编码课程设计报告-统计信源熵与香农编码.pdf...

    信息论与编码课程设计报告 设计题目: 统计信源熵与香农编码 专业班级 电 信 12-06 学 号 学生姓名 指导教师 教师评分 2015 年 3 月 30 日 目 录 - 0 - 一.设计任务与要求 ...

  8. 香农编码二叉树c语言,shannon码的编码实验总结.docx

    shannon码的编码实验总结 本科生实验报告 实验课程信息理论与编码 学院名称信息科学与技术学院 专业名称 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一六年九月----二〇一六年十一月 ...

  9. 信源编码的代码实现 (香农编码、费诺编码、哈夫曼编码、游程编码、算术编码)

    文章目录 香农编码 费诺编码 哈夫曼编码 C++版 C语言版 游程编码 算术编码 香农编码 (1) 将信源消息符号按其出现的概率大小依次排列 p1 ≥ p2 ≥ - ≥ pn (2) 确定满足下列不等 ...

  10. 香农编码的C++实现及求平均码长和编码效率

    香农编码C++分布实现 编码步骤 香农编码的步骤如下: (1)将信源符号按其出现概率从大到小排序: (2)计算出各概率对应的码字长度: (3)计算累加概率: (4)把各个累加概率由十进制转化为二进制, ...

最新文章

  1. consul服务下线通知_Consul微服务的配置中心体验篇-阿里云开发者社区
  2. IDEA 这样配置注释模板,让你高出一个逼格
  3. vue项目中 axios请求拦截器与取消pending请求功能 - 年少、 - 博客园
  4. C语言指针变量的运算
  5. 使用linux expect进行ssh和telnet自动化登录等操作
  6. C语言之文件读写探究(二):fputc、fgetc、feof(一次读写一个字符(文本操作))
  7. 制定2015年的移动开发策略
  8. Python+OpenCV:立体图像深度图(Depth Map from Stereo Images)
  9. app集成极光推送笔记(angular js)
  10. React 组件生命周期详解
  11. 孙鑫VC学习笔记:第四讲 MFC消息映射机制和CDC类的使用
  12. 为什么用虚拟机做服务器,虚拟机的优势:保留虚拟机的4个理由
  13. timesat数据如何读取_CMPR软件安装教程和如何转换XRD格式
  14. Matlab计算机视觉/图像处理工具箱推荐
  15. windows7系统损坏修复_火绒安全警报:微软发布高危漏洞补丁 火绒“漏洞修复”模块已完成升级...
  16. 计算机word虚线分割,Word文档里的波浪线、虚线、分割线都是怎么打出来的?
  17. PPT文档打不开提示访问出错怎么办
  18. Ps 如何制作网格背景
  19. 消除Pe177,pe150警告
  20. 【C语言】scanf,getchar,getch函数详解

热门文章

  1. 最全NISP二级习题汇总
  2. android-倒计时工具类
  3. 迅雷7.22 和迅雷5.9 去广告优化增强绿色版
  4. 计算机在输电线路设计中的应用研究,计算机在输电线路基础设计中的应用原稿(电子版)...
  5. MySQL大表优化方案
  6. python是一种什么类型的植物_植被类型预测
  7. 怎么下载并使用向日葵远程工具
  8. 向日葵远程控制工具安装
  9. “蹲坑神器”与它背后男人们不得不说的故事
  10. java计算101~200之间的素数