找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6902|回复: 1
打印 上一主题 下一主题
收起左侧

MATLAB费诺编码实验报告与源码

[复制链接]
跳转到指定楼层
楼主
ID:350917 发表于 2018-6-13 12:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验三 费诺编码
一、实验目的和任务
  • 理解信源编码的意义;
  • 熟悉 MATLAB程序设计;
  • 掌握费诺编码的方法及计算机实现;
  • 对给定信源进行费诺编码,并计算编码效率;
二、实验原理介绍
给定某个信源符号的概率分布,通过以下的步骤进行费诺编码
1、信源符号按概率从大到小排列;
2、将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
3、将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
4、如此重复,直至每个组只剩下一个信源符号为止。
5、信源符号所对应的码字即为费诺码。            
三、实验设备介绍
1、计算机
2、编程软件MATLAB6.5以上

四、实验内容和步骤

编程如下;
  1. A=[0.4,0.3,0.1,0.09,0.07,0.04];
  2. A=fliplr(sort(A));%降序排列
  3. [m,n]=size(A);
  4. for i=1:n
  5. B(i,1)=A(i);%生成B的第1列
  6. end
  7. %生成B第2列的元素
  8. a=sum(B(:,1))/2;
  9. for k=1:n-1
  10. if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a)
  11. break;
  12. end
  13. end
  14. for i=1:n%生成B第2列的元素
  15. if i<=k
  16. B(i,2)=0;
  17. else
  18. B(i,2)=1;
  19. end
  20. end
  21. %生成第一次编码的结果
  22. END=B(:,2)';
  23. END=sym(END);
  24. %生成第3列及以后几列的各元素
  25. j=3;
  26. while (j~=0)
  27. p=1;
  28. while(p<=n)
  29. x=B(p,j-1);
  30. for q=p:n
  31. if x==-1
  32. break;
  33. else
  34. if B(q,j-1)==x
  35. y=1;
  36. continue;
  37. else
  38. y=0;
  39. break;
  40. end
  41. end
  42. end
  43. if y==1
  44. q=q+1;
  45. end
  46. if q==p|q-p==1
  47. B(p,j)=-1;
  48. else
  49. if q-p==2
  50. B(p,j)=0;
  51. END(p)=[char(END(p)),'0'];
  52. B(q-1,j)=1;
  53. END(q-1)=[char(END(q-1)),'1'];
  54. else
  55. a=sum(B(p:q-1,1))/2;
  56. for k=p:q-2
  57. if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a);
  58. break;
  59. end
  60. end
  61. for i=p:q-1
  62. if i<=k
  63. B(i,j)=0;
  64. END(i)=[char(END(i)),'0'];
  65. else
  66. B(i,j)=1;
  67. END(i)=[char(END(i)),'1'];
  68. end
  69. end
  70. end
  71. end
  72. p=q;
  73. end
  74. C=B(:,j);
  75. D=find(C==-1);
  76. [e,f]=size(D);
  77. if e==n
  78. j=0;
  79. else
  80. j=j+1;
  81. end
  82. end
  83. B
  84. A
  85. END
  86. for i=1:n
  87. [u,v]=size(char(END(i)));
  88. L(i)=v;
  89. end
  90. avlen=sum(L.*A)
  91. H=-sum(A.*log2(A))%输出信息熵
  92. p=H/avlen %输出编码效率
复制代码


结果如图:
  • 实验结论与心得
通过这次费诺码编程的实验,使我学到了不少实用的知识,实践与课堂知识相结合使学习知识得以运用,知识点学的更透彻了。更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅。

完整的Word格式文档51黑下载地址:
信息论编码实验5416546464184168418541(2).doc (55.54 KB, 下载次数: 14)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:151893 发表于 2019-5-15 17:48 | 只看该作者
好像有bug,输入序列为[0.2,0.2,0.2,0.2,0.2]或[ones(1,10)*0.1]这样的序列时进入死循环。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表