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

2023-11-09

一、实验目的

1、理解霍费诺编码的原理。
2、掌握费诺编码的方法和步骤。
3、熟悉费诺编码的效率。
4、本实验用Matlab语言编程实现费诺(Fano)编码。

二、实验环境

windows XP,MATLAB 7

三、实验原理

费诺编码算法如下:在信源符号集合中,首先将概率空间分为两个大致一样的概率集合,再将这两个概率集合进行重复分解,直到只剩下两个概率值为止。得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是费诺编码输出。

离散无记忆信源:
例如:

  U           u1    u2    u3   u4   u5
 P(U)    =    0.4  0.3  0.15 0.1  0.05    

在这里插入图片描述

通过上表的对信源等格划分分解过程,从而完成对信源的费诺编码。主要分为两步,首先是码树形成过程:对信源概率进行二次分解得到编码码树。然后是码树赋值过程:在码树上分配编码码字并最终得到费诺编码。

包括:
1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。然后按上述规则进行信源分解划分,再对二划分信源重新分解建立新的位置索引,直到分解到最后分支结束。

2、码树回溯过程:在码树上分配编码码字并最终得到费诺编码。从索引矩阵M 的首行开始前置得到编码输出。

四、实验内容

1、在给定离散无记忆信源

 S		 s1    s2    s3    s4  
 P	=	1/8  5/16  7/16   1/8

条件下,实现费诺编码,求最后得到的码字并算出编码效率。

2、请自己构造两个信源空间,每个空间数据不少于10个,根据费诺编码结果对比理解其相关索引指标,并进行编码效率结果对比分析验证。

五、实验过程

1、在给定离散无记忆信源条件下,实现费诺编码

费诺编码步骤为:
(1)将信源符号按其出现的概率由大到小依次排列;
(2)将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近于相同,并对各组分别赋予一个二进制码元“0”和“1”;
(3)将每一大组的信源符号进一步再分成两组,使划分后的两个组的概率之和近于相同,并又分别赋予一个二进制符号“0”和“1”;
(4)如此重复,直至每个组只剩下一个信源符号为止;
(5)信源符号所对应的码字即为费诺码。

费诺编码代码如下:

function[W,L,q]=fano(P)
%1)排序
n=length(P);
x=1:n;
% 2)将信源符号分组并得到对应的码宇
for i=1:n
    current_index=i;
    j=1;
    current_P=P;
    while 1
       [next_P,code_num,next_index]=compare(current_P,current_index);
        current_index=next_index;
        current_P=next_P;
        W(i,j)=code_num;
        j=j+1;
        if(length(current_P)==1)
            break;
        end
    end
    l(i)=length(find(abs(W(i,:))~=0));%得到各码宇的长度
end
L=sum(P.*l);%计算平均码字长度
H=sum(P.*(-log2(P)));%计算信源熵
q=H/L;  %计算编码效率
 
%打印输出结果
for i=1:n
    B{i}=x(i);
end
[m,n]=size(W);
TEMP=blanks(m);
W=[W,TEMP',TEMP',TEMP'];
[m,n]=size(W);
W=reshape(W',1,m*n);
 
fprintf('信源符号出现的概率为:\n');
disp(P);
fprintf('Fano编码所得码字W:\n');
disp(B),disp(W);
fprintf('Fano编码平均码字长度L:');
disp(L);
fprintf('信源的信息熵H:');
disp(H);
fprintf('Fano编码的编码效率q:');
disp(q);

其中还使用了一个比较函数,用于信源符号的分组:

function[next_P,code_num,next_index]=compare(current_P,current_index);
n=length(current_P);
add(1)=current_P(1);
%1)求概率的依次累加和
for i=2:n
    add(i)=0;
    add(i)=add(i-1)+current_P(i);
end
%2)求概率和最接近的两小组
s=add(n);
for i=1:n
    temp(i)=abs(s-2*add(i));
end
[c,k]=min(temp);
%3)对分组的信源赋ASCII值
if(current_index<=k)
    next_index=current_index;
    code_num=48;
    next_P=current_P(1:k);
else
    next_index=current_index-k;
    code_num=49;
    next_P=current_P((k+1):n);
end

在给定信源的主函数代码如下:

clc
clear
s=[1 2 3 4];
p=[1/8  5/16  7/16  1/8];%给定信源
fano(p);

给定信源的运行结果如下:
在这里插入图片描述

2、构造两个信源空间,求它们的费诺编码

在上例1中的费诺编码代码(即fano.m)基础上,修改主程序代码如下:

clc
clear
p1=[0.08 0.12 0.05 0.20 0.15 0.06 0.17 0.01 0.09 0.07];%信源空间1
fano(p1);
p2=[0.10 0.20 0.05 0.04 0.05 0.06 0.25 0.15 0.01 0.09];%信源空间2
fano(p2);

信源空间p1=[0.08 0.12 0.05 0.20 0.15 0.06 0.17 0.01 0.09 0.07]的运行结果如下:

在这里插入图片描述

信源空间p2=[0.10 0.20 0.05 0.04 0.05 0.06 0.25 0.15 0.01 0.09]的运行结果如下:

在这里插入图片描述

比较两组信源结果可知:一个信源空间中经常出现的信源符号(即信源概率高的符号)能对应码长较短的编码字,反之,信源概率出现较低的符号的编码字对应的码长就较长。

六、实验小结

费诺编码也是一种常见的信源编码方法,它考虑了信源的统计特性,使概率大的信源符号能对应码长较短的码字,从而有效地提高了编码效率,因此,费诺码也是一种好的编码方法。

费诺编码较为适合于对分组概率相等或接近的信源编码,但不一定能使短码得到充分利用。当信源符号较多时,若有一些符号概率分布很接近,分两大组的组合方法就会有很多种,可能某种分大组的结果,会使后面小组的“概率和”相差较远,从而使平均码长增加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB实现费诺编码的计算与分析 的相关文章

随机推荐

  • okhttp3源码解析(3)-拦截器 II

    okhttp3源码解析 3 拦截器 II 前言 上篇博文从RealInterceptorChain开始 讲解了RetryAndFollowUpInterceptor和BridgeInterceptor两个拦截器 后面还有三个系统拦截器 其实
  • Flink执行流程

    1 flink关键字对比spark flink spark operator RDD operator chain stage data flow DAG one to one 窄依赖 redistribute 宽依赖 subtask ta
  • 如何使用 Parallels Desktop 虚拟机在 Mac 上安装 Windows 系统!

    一 下载安装 Parallels Desktop for Mac 如果您刚开始接触 Parallels Desktop for Mac 请点击下载最新版本 访问 如果已是 Parallels Desktop 用户 请继续执行后续步骤 二 自
  • STM32使用bool型变量

    环境Keil5 编译器 include
  • facebook 获取好友列表

    直接上函数 public void getfriends if Session getActiveSession null Session getActiveSession isOpened new Request Session getA
  • javamail发送邮件

    废话不多说 直接上代码 以下三段代码是我的全部代码 朋友们如果想用 直接复制即可 jar包因为我不知道怎么传到javaeye上 所以朋友们回去自己打吧 我的代码有三个类 第一个类 MailSenderInfo java package co
  • Win10 AMD显卡不兼容造成的开机黑屏问题解决

    1 将以下文本粘贴到文本文件中 保存为ULPS Disable reg Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SYSTEM ControlSet001 Control
  • 根据点云高度赋色(附open3d python代码)

    绘制点云图时用颜色来表征其高度 我们先计算了点云的高度范围 然后把每个点的颜色根据高度来进行映射 稍微修改代码 我们也可以让高度颜色渐变转换为 X 轴距离颜色渐变 稍微修改代码 我们也可以让高度颜色渐变转换为 X 轴距离颜色渐变 codin
  • Promise 实现原理

    文章目录 一 Promise 介绍 二 promise 源码实现 一 Promise 介绍 定义 Promise 是异步编程的一种解决方法 比传统的回调函数和事件更合理 它是由社区提出和实现经由 ES6 将其写进语言标准 并在原生提供了 P
  • Linux安装python3和pip3

    安装python3 yum y install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel readline devel tk devel gdbm dev
  • python serial打开M5串口重启问题

    使用比较常用的方法打开串口 import serial ser serial Serial COM3 115200 使用上述代码 第一次打开会导致m5重启 重启的原因可能跟烧录类似 在烧录程序完毕以后都会重启 解决方法 import ser
  • 问题/lib64/libc.so.6: version `GLIBC_2.18‘ not found

    1 首先下载GLIBC 2 18到本地 2 解压压缩包 3 cd进入到解压好的文件夹内 mkdir build 4 cd build 执行该命令 configure prefix usr disable profile enable add
  • python 绘制正弦余弦函数 matplotlib的基本使用

    matplotlib的基本使用 import matplotlib pyplot as mp import numpy as np x np linspace 0 2 np pi 1000 y sin np sin x y cos np c
  • [初学python]新类(new-style class)

    类 class 也是对象在python之中 万物皆对象 类也是对象 类的类 就被称为元类 即类是元类的实例 正如类的实例的行为取决于类 元类的实例 类 的行为也取决于元类 new style classes的由来new style clas
  • 华为OD机试真题Java_2022-2023-题目0189-最多等和不相交连续子序列

    最多等和不相交连续子序列 题目描述 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的和 数组中可能存在几组连续子序列 组内的连续子序列互不相交且有相同的和 求一组连续子序列 组内子序列的数目最多 输出这个数目 输
  • 笔记24-2(C语言进阶 程序环境和预处理)

    目录 注 预定义详解 预处理符号 举例 使用例 define define 定义标识符 define定义宏 括号很重要 define 替换规则 和 带副作用的宏参数 宏和函数的对比 命名约定 undef 命名行定义 条件编译 常见的条件编译
  • 宏定义 类模板 及类模板的全特化

    如下所示 定义一个宏函数 只要传入类型名 即可生成一个类模板 include
  • 图灵1月书讯:阅新书辞旧岁,览经典迎新年

    原文链接 本期小编为您特别推荐的是 说服人要懂心理学 著名行为心理学家 演讲大师最新力作 七大动力 丰富实例 教你做个说服高手 Susan M Weinschenk拥有行为心理学博士学位 在35年的职业生涯中 她一直致力于把心理学领域对人类
  • c语言把一个数组里面的部分值直接复制到另外一个数组

    头文件是 include
  • MATLAB实现费诺编码的计算与分析

    一 实验目的 1 理解霍费诺编码的原理 2 掌握费诺编码的方法和步骤 3 熟悉费诺编码的效率 4 本实验用Matlab语言编程实现费诺 Fano 编码 二 实验环境 windows XP MATLAB 7 三 实验原理 费诺编码算法如下 在