huffman编译码

news2025/2/22 22:28:53

目录

1.算法描述

2.仿真效果预览

3.MATLAB部分代码预览

4.完整MATLAB程序


1.算法描述

        利用哈夫曼编码进行信息通信可以较大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。
       ​​​​​​哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

       设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。首先,将符号按照概率由大到小排队,如图1所示。编码时,从最小概率的两个符号开始,可选其中一个支路为0,另一支路为1。这里,我们选上支路为0,下支路为1。再将已编码的两支路的概率合并,并重新排队。多次重复使用上述方法直至合并概率归一时为止。从图1中(a)和(b)可以看出,两者虽平均码长相等,但同一符号可以有不同的码长,即编码方法并不唯一,其原因是两支路概率合并后重新排队时,可能出现几个支路概率相等,造成排队方法不唯一。一般,若将新合并后的支路排到等概率的最上支路,将有利于缩短码长方差,且编出的码更接近于等长码。这里图1中(a)的编码比(b)好。

        赫夫曼码的码字(各符号的代码)是异前置码字,即任一码字不会是另一码字的前面部分,这使各码字可以连在一起传送,中间不需另加隔离符号,只要传送时不出错,收端仍可分离各个码字,不致混淆。
       实际应用中,除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。按照CCITT标准,需要统计2×1728种游程(长度),这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。其中q称主码,r为基码。编码时,不小于64的游程长度由主码和基码组成。而当l为64的整数倍时,只用主码的代码,已不存在基码的代码。
       长游程的主码和基码均用赫夫曼规则进行编码,这称为修正赫夫曼码,其结果有表可查。该方法已广泛应用于文件传真机中。

2.仿真效果预览

matlab2022a仿真结果如下:

3.MATLAB部分代码预览

function [zipped,info] = norm2huff(vector)
 
 
 
% ensure to handle uint8 input vector
if ~isa(vector,'uint8'),
	error('input argument must be a uint8 vector')
end
 
% vector as a row
vector = vector(:)';
 
% frequency
f = frequency(vector);
 
% simbols presents in the vector are
simbols = find(f~=0); % first value is 1 not 0!!!
f = f(simbols);
 
% sort using the frequency
[f,sortindex] = sort(f);
simbols = simbols(sortindex);
 
% generate the codewords as the 52 bits of a double
len = length(simbols);
simbols_index = num2cell(1:len);
codeword_tmp = cell(len,1);
while length(f)>1,
	index1 = simbols_index{1};
	index2 = simbols_index{2};
	codeword_tmp(index1) = addnode(codeword_tmp(index1),uint8(0));
	codeword_tmp(index2) = addnode(codeword_tmp(index2),uint8(1));
	f = [sum(f(1:2)) f(3:end)];
	simbols_index = [{[index1 index2]} simbols_index(3:end)];
	% resort data in order to have the two nodes with lower frequency as first two
	[f,sortindex] = sort(f);
	simbols_index = simbols_index(sortindex);
end
 
% arrange cell array to have correspondance simbol <-> codeword
codeword = cell(256,1);
codeword(simbols) = codeword_tmp;
 
% calculate full string length
len = 0;
for index=1:length(vector),
	len = len+length(codeword{double(vector(index))+1});
end
	
% create the full 01 sequence
string = repmat(uint8(0),1,len);
pointer = 1;
for index=1:length(vector),
	code = codeword{double(vector(index))+1};
	len = length(code);
	string(pointer+(0:len-1)) = code;
	pointer = pointer+len;
end
 
% calculate if it is necessary to add padding zeros
len = length(string);
pad = 8-mod(len,8);
if pad>0,
	string = [string uint8(zeros(1,pad))];
end
 
% now save only usefull codewords
codeword = codeword(simbols);
codelen = zeros(size(codeword));
weights = 2.^(0:51);
maxcodelen = 0;
for index = 1:length(codeword),
	len = length(codeword{index});
	if len>maxcodelen,
		maxcodelen = len;
	end
	if len>0,
		code = sum(weights(codeword{index}==1));
		code = bitset(code,len+1);
		codeword{index} = code;
		codelen(index) = len;
	end
end
codeword = [codeword{:}];
 
% calculate zipped vector
cols = length(string)/8;
string = reshape(string,8,cols);
weights = 2.^(0:7);
zipped = uint8(weights*double(string));
 
% store data into a sparse matrix
huffcodes = sparse(1,1); % init sparse matrix
for index = 1:numel(codeword),
	huffcodes(codeword(index),1) = simbols(index);
end
 
% create info structure
info.pad = pad;
info.huffcodes = huffcodes;
info.ratio = cols./length(vector);
info.length = length(vector);
info.maxcodelen = maxcodelen;
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function codeword_new = addnode(codeword_old,item)
codeword_new = cell(size(codeword_old));
for index = 1:length(codeword_old),
	codeword_new{index} = [item codeword_old{index}];
end
A_039

4.完整MATLAB程序

matlab源码说明_我爱C编程的博客-CSDN博客

V

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python期末复习题:文件

Python期末复习题&#xff1a;文件 文章目录Python期末复习题&#xff1a;文件一、二手房数据统计二、学生成绩统计一、二手房数据统计 附件文件house.csv 中存储一些二手房数据&#xff0c;中文编码为GBK&#xff0c;对文件中的数据进行统计分析。 文件中数据格式如下所示&…

理解Attention机制的query key value

背景 在Attention机制引入前&#xff0c;自然语言处理里的深度学习模型有以下缺点&#xff1a; 长序列的推理存在信息损失/梯度消失&#xff1a;输入序列越长&#xff0c;模型越难保存初始输入信息。运算量大并且不能并行&#xff1a;RNN的每一步推理都是基于上一个步的结果。…

Python小游戏自己动手编写,你能写出几个(分享版)

今天分享一个有趣的Python游戏库freegames&#xff0c;它里面包含经典小游戏&#xff0c;像贪吃蛇、吃豆人、等等。可以通过1行代码重温这些童年小游戏&#xff0c;后面还会分享源码&#xff0c;可以自己学习游戏编写&#xff0c;相信你会超有成就感&#xff01; Paint 涂鸦 在…

Springboot Websocket一般封装方法

此方法不是唯一&#xff0c;只是自己对于Springboot中关于Websocket处理思路比较清晰的一种&#xff0c;在此记录下来。总共不过就四个文件而已。 一、创建Springboot项目&#xff0c;添加不可或缺的pom <dependency><groupId>org.springframework.boot</grou…

内存模块 --- 基础扫盲

SDRAM synchronous dynamic random-access memory 同步动态随机存储器 同步&#xff1a;需要同步时钟支持工作&#xff0c;内部命令的发送与数据的传输都是以这个时钟为基准 动态&#xff1a;内部的存储阵列需要不断地刷新来保证数据不丢失 随机&#xff1a;可以自由地在指定地…

MyBatis进阶版

本文有点难 目录 1.一些区分 1.1参数占位符#{}和${} 1.1.1SQL注入 1.1.2like查询 1.2resultType和resultMap 2.映射查询 2.1一对一表映射 2.2一对多表映射 3.动态SQL 3.1标签 3.2标签 3.3标签 3.4标签 3.5标签 1.一些区分 1.1参数占位符#{}和${} ①什么是#{}&a…

【CSS】表布局,浮动布局

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录表布局表层表标题(caption)border-collapse边框隐藏表大小table-layout(表宽度)vertical-align例…

你安全吗?丨虎云系统“后门”

作者&#xff1a;黑蛋 在电视剧《你安全吗&#xff1f;》中&#xff0c;马平川这个人物已经慢慢浮出水面&#xff0c;算是此部电视剧幕后的最大反派&#xff0c;他明面上是虎迫集团的技术总监&#xff0c;是虎云系统的负责人&#xff0c;开发者。背后却在泰曼达有着诈骗基地&a…

2022年11月21日13:32:00——T5——JS对象与Date日期函数

1、JavaScrip对象的使用&#xff1a; /** * 1、对象的声明赋值使用的是{}花括号&#xff0c;大括号 * 2、对象中的值以key:value的格式进行赋值&#xff0c;多个值中间使用【,】区分 * 3、获取对象中的值的方法需要通过[]并给与key名的方式获取&…

电脑怎么设置开机密码?简单几步给你的电脑“上锁”

在我们日常生活中&#xff0c;最常见的就是开机密码了&#xff0c;而电脑作为我们使用频率最高也是最复杂的设备&#xff0c;其安全性也是非常重要的&#xff0c;那么电脑怎么设置开机密码&#xff1f;那么今天我们就来说一说开机密码的设置方法&#xff01;为了更安全&#xf…

Essay写作字数怎么正确进行删减?

对于留学生来说&#xff0c;Essay写作伴随着整个留学生活。正因为留学生大量的Essay作业&#xff0c;不少留学生为了规定的Essay字数而发愁&#xff0c;毕竟既不能写得太少&#xff0c;又不能写得太多&#xff0c;所以很纠结。那么如何根据老师规定的字数进行删减呢&#xff1f…

Talk | 微软亚洲研究院宋恺涛南大余博涛:面向文本/音乐序列任务的Transformer注意力机制设计

本期为TechBeat人工智能社区第456期线上Talk&#xff01; 北京时间11月22日(周二)20:00&#xff0c;微软亚洲研究院研究员——宋恺涛与南京大学硕士研究生——余博涛的Talk将准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题是: “面向文本/音乐序列任务的Tra…

String类_Java(一)

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE领域博主 专栏&#xff1a;JavaSE &#x1f33c;作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步&#xff01; 文章目录 目录 文章目录 前言 一、构造字符串 二、Sring对象的比较 2.1 比较是否引用同一对象 2.2 比较…

跨平台编译工具--CMake上手教程

文章目录一、引入二、基本关键字1.PROJECT2.SET3.MESSAGE4.ADD_EXECUTABLE5.ADD_SUBDIRECTORY(1)使用(2)CMakeLists执行顺序(3)输出文件的位置6.INSTALL(1)安装文件(2)安装非目标文件可执行文件(3)安装目录(4)安装指令7.ADD_LIBRARY8.SET_TARGET_PROPERTIES三、语法的基本规则四…

知识引擎藏经阁天花板——高性能Java架构核心原理手册

开场 本书是按照程序设计与架构的顺序编写的&#xff0c;共13章。 第1章介绍学习高性能Java应了解的核心知识&#xff0c;为前置内容。 第2章和第3章讲解在编写代码之前&#xff0c;如何高效地为My SQL填充亿级数据&#xff0c;并对My SQL进行基准测试&#xff0c;以便在之后…

Linux-awk和printf

printf printf ‘输出类型输出格式’ 输内容 输出类型&#xff1a; %ns 输出字符串&#xff0c;n是数字指代输出几个字符 %ni 输出整数&#xff0c;n是数字&#xff0c;指代输出几个数字 %m.nf 输出浮点数&#xff0c;m和n是数字&#xff0c;指代输出总位数和小数位数&#xf…

YOLO V1学习总结

图片大小&#xff1a;448 * 448 —> 7 * 7 *&#xff08;5 * B C&#xff09; 5&#xff1a;每个框的x,y,w,h,confidence; B2&#xff1a;在7*7的feature上&#xff0c;每个cell会生成2个预测框&#xff1b; C&#xff1a;类别数。 损失函数 坐标中心误差和位置宽高的误差…

卷积神经网络基本概念

卷积神经网络基本概念1. 感受野2. 卷积核3. 特征图【feature map】4. 通道【channel】5. 填充【padding】6. 步长【stride】7. 池化【pooling】8. dropout数字1处&#xff1a;一个圈表示一个神经元数字2处&#xff1a;一个圈表示一个神经元&#xff0c;圈的大小表示感受野的大小…

基于matlab的最小支配集CDS仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 支配集的定义如下&#xff1a;给定无向图G &#xff08;V , E&#xff09;,其中V是点集&#xff0c; E是边集&#xff0c; 称V的一个子集S称为支配集当且仅当对于V-S中任何一个点v, 都有…

一、FFmpeg 的初尝试《FFmpeg 音视频开发基础入门到实战》

学习目标 了解 FFmpeg学习 FFmpeg 工具的下载及环境配置了解 FFmpeg 工具的使用方式了解 FFmpeg play 的使用方法了解 FFmpeg paly 的音量设置、窗口设置、音量设置等设置方法 一、了解 FFmpeg FFmpeg 是一个音视频处理的工具&#xff0c;通过 FFmpeg 可以对视频进行旋转、缩…