一、设计目标

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

二、设计步骤

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

(2)编码模块:先创建一个两行Q列的元胞,第一行存储各符号的概率,第二行存储各符号的码字,都为char类型。再对输入的概率进行排序并分组:分组由函数fano实现,每一次的fano函数都对传入函数的元胞cel作一次分组,并为两组概率各自分配码元(概率大者分配0,小者分配1),最后判断两个分组长度是否为1,不为1则对该分组继续进行fano函数操作(递归到各组都只包含一个概率为止);

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

三、代码实现

%%fano 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个元素各自的概率:");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');%分别为排序后的概率与最初的索引
pri_cell = creat_charcell(2,Q);%第一行储存分组后的概率,第二行码字
aft_cell=fano(Q,sort_odds,pri_cell,1);%%编码结果打印
disp('--------------------------------------');
disp('费诺编码结果:');
len_fanocode = 0;%计算平均码长
for k = 1 : Qindex = sort_index(k);num = num2str(index);od = num2str(sort_odds(k));%字符串形式的概率co = char(aft_cell(2,k));%字符串形式的编码len_fanocode = len_fanocode + length(co)*sort_odds(k);disp(['第',num,'个符号的概率为:',od,',费诺编码为:',co]);
end%%编码参数计算与展示
l = len_fanocode;%平均码长
odds(find(odds==0))=[];
H = sum(odds.*log2(1./odds));%信源熵
eff = H / (l*log2(2));%编码效率
disp('--------------------------------------');
disp(['平均码长:',num2str(l)]);
disp(['信源熵:',num2str(H)]);
disp(['编码效率:',num2str(eff)]);%---------------------------------函数分割线---------------------------------%
%%fano函数:对已有的Q个递减概率进行费诺分组
%%输入参数分别为:待排序序列长度,待排序序列,元胞,本次操作的起始列数
%%输出参数分别为:输出元胞
function output = fano(Q,sort_odds,cel,start)
sum_odds = [];sub_odds = [];%比较各处分组的概率和,以确定分组位置
sumi_odds = 0; subi_odds = 0;
sum1 = sum(sort_odds);%待分组概率之和
for i = 1:Qsumi_odds = sumi_odds + sort_odds(i);%概率累加值subi_odds = sum1 - sumi_odds;%累加后剩余值sum_odds = [sum_odds ,sumi_odds];sub_odds = [sub_odds ,subi_odds];
end
diff = abs(sum_odds - sub_odds);%两组概率之差
[useless1,index_min] = min(diff);%概率差最小值及其索引
%%根据索引进行分组
group1 = sort_odds(1:index_min);
group2 = sort_odds(index_min + 1:end);
%%转化为字符串以便保存在cell数组中
group1_str = num2str(group1);
group2_str = num2str(group2);
Q1 = length(group1);
Q2 = length(group2);
%%修改output第一行--分组
cel(1,start) = {group1_str};
cel(1,index_min+start) = {group2_str};
%%分配码元,大的分组分配0,小的分组分配1
if(sum(group1) >= sum(group2))cel(2,start:index_min+start-1) = {[char(cel(2,start)),'0']};cel(2,index_min+start:index_min+start+Q2-1) = {[char(cel(2,index_min+start)),'1']};
elsecel(2,start:index_min+start-1) = {[char(cel(2,start)),'1']};cel(2,index_min+start:index_min+start+Q2-1) = {[char(cel(2,index_min+start)),'0']};
end
output = cel;
%%递归
if(Q1 ~= 1)output = fano(Q1,group1,output,start);
end
if(Q2 ~= 1)output = fano(Q2,group2,output,start+index_min);
end
end
%---------------------------------函数分割线---------------------------------%
%%charcell函数:创建a*b维的cell类型的空char数组
function charcell = creat_charcell(a,b)
charcell=cell(a,b);
for i=1:afor j=1:bcharcell(i,j)=cellstr(num2str(charcell{i,j}));%%charcell中的元组由double→char→{char}end
end
end

四、运行结果

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

五、写在最后

(1)如果需要编码的符号数不足10个,修改输入模块即可;

(2)哈夫曼、香农编码如果有需要请留言(好像是叫留言或是评论?);

(3)代码较为冗杂,作者编程水平有限。第一次发csdn,不太会丰富内容和排版,但希望能为有需要者(eg.信息论与编码课程相关)提供一些帮助。

费诺编码的MATLAB递归实现相关推荐

  1. 费诺码设计matlab,费诺编码的matlab实现.doc

    费诺编码的matlab实现.doc 多媒体技术实验报告学院:城南学院 姓名:学号:指导老师:尹波时间:2015年11月25日 教师评语:成绩 评阅教师 日期 实验一:费诺编码的matlab实现1实验目 ...

  2. java实现.费诺编码_香农费诺编码的matlab实现.doc

    香农费诺编码的matlab实现.doc 信息论与编码实验香农费诺编码的matlab实现学院班级-姓名学号摘要 用预先规定的方法将文字.数字或其他对象编成数码,或将信息.数据转换成规定的电脉冲信号.编码 ...

  3. 香农码字matlab,香农--费诺编码的matlab实现

    香农--费诺编码的matlab实现 信息论与编码实验香农 --费诺编码的 matlab 实现学院:------班级:-----姓名:----学号:----摘要:用 预 先 规 定 的 方 法 将 文 ...

  4. matlab用双重循环实现费诺编码

    1.      费诺编码原理:(百度百科) https://baike.baidu.com/item/%E8%B4%B9%E8%AF%BA%E7%BC%96%E7%A0%81/6479275 2.   ...

  5. 实例详解Matlab费诺编码

    费诺编码(Fano Coding)是一种前缀编码,用于将符号序列压缩并传输.在费诺编码中,频率较高的符号被分配到短的编码而频率较低的符号则被分配到长的编码. 下面是一个用MATLAB实现费诺编码的例子 ...

  6. 用MATLAB实现费诺编码

    一.简述 <信息论与编码>是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充.其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能, ...

  7. MATLAB实现费诺编码的计算与分析

    一.实验目的 1.理解霍费诺编码的原理. 2.掌握费诺编码的方法和步骤. 3.熟悉费诺编码的效率. 4.本实验用Matlab语言编程实现费诺(Fano)编码. 二.实验环境 windows XP,MA ...

  8. 费诺编码 c++代码实现 信息论实验

    费诺编码 1.实验目的 (1)进一步熟悉费诺编码过程: (2)掌握Matlab 或C语言递归程序的设计和调试技术 2.实验要求 (1)输入:信源符号个数 ,每个信源符号的概率分布P从键盘输入 (2)输 ...

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

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

最新文章

  1. 社区v2022.3版上线:发帖、看直播、评论体验升级,并支持机构号申请
  2. 基于corosync+pacemaker实现主从高可用集群
  3. 【算法入门漫画】:什么是字符串匹配算法?
  4. JSTL 与 JSP 代码段 相互调用变量
  5. java中for循环的简化_Java中for语句的简化写法
  6. 大地win11 64位旗舰版系统v2021.08
  7. 形成性考核(计算机应用基础) 答案,2019年最新电大《计算机应用基础(Win7)》形成性考核册及答案.pdf...
  8. [c/c++] c 操作mysql数据库
  9. ESX Server硬件升级步骤
  10. 【计算几何】【极角序】【二分】bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形
  11. 算法笔记_101:蓝桥杯练习 算法提高 身份证号码升级(Java)
  12. Windows Mobile 进阶系列.WCF Mobile(Part 2)
  13. CAD工程制图基础命令(简洁版)
  14. 2020年度全球人工智能十大事件
  15. 有什么软件可以测试U盘性能,最新版本:U盘性能检查测试软件简介
  16. 二叉树的前序序列、中序序列、后序序列、层次序列
  17. dpdk Ipv4组包逻辑解析
  18. 购物网站流程图(收藏)
  19. 浏览器报ScriptResource.axd异常
  20. vscode 文件夹中查找_VSCode 多文件搜索和替换

热门文章

  1. STM32-APDS9960手势识别
  2. 调侃计算机专业的句子,调侃生活的幽默句子
  3. 计算机特色的小游戏,宅家必备小游戏-steam小型游戏推荐
  4. 思科交换机命令大全(二)
  5. K均值算法matlab实现
  6. ABP框架心得系列-1.本土化和ABP核心
  7. 如何选出一名优秀的项目经理?
  8. 搭建mount服务(NFS服务器、客户端配置)
  9. 地震桌面演练计算机模拟,地震应急处置演练平台环境编辑器及导演组客户端的设计与实现...
  10. Android STB 高效调试技巧