霍夫曼编码的matlab实现(信源编码实验)

合集下载

实验三 信源编码实验

实验三 信源编码实验

实验三信源编码实验一、实验目的:1、掌握哈夫曼编码的Matlab实现方法。

2、掌握VC++读取信源数据的方法。

3、运行编译好的霍夫曼编码、算术编码、游程编码编码程序,比较霍夫曼编码、算术编码、游程编码编码的编码效果二、实验内容与步骤1、Huffman编码实验1)编写计算信息熵的M文件参考程序:function h=entropy(p)%H=ENTROPY(P)返回概率矢% 量P的熵函数if length (find(p<0))~=0error('Not a prob.vector,negative component(s)')endif abs (sum(p)-1)>10e-10error ('Not a prob.vector,components do not add up to 1') endh=sum(-p.*log2(p));求信源X=[x1,x2,…,x9],其相应的概率为p=[0.2,0.15,0.13,0.12,0.1,0.09,0.08,0.07,0.06];利用编写的程序计算信息熵,并记录数值。

2)编写程序实现Huffman编码编写实现Huffman编码的M文件,编译后运行,验证程序的正确性并记录编码结果。

参考程序:function [h,l]=huffman(p);%HUFFMAN 哈夫曼编码生成器% [h,l]=huffman(p),返回哈夫曼编码矩阵H及码字长度if length (find (p<0))~=0,erro('Not a prob.vector,negative component(s)')endif abs(sum(p)-1)>10e-10,error('Not a prob.vector,components do not add up to 1') endn=length(p);q=p;m=zeros(n-1,n);for i=1:n-1[q,l]=sort(q);m(i,:)=[l(1:n-i+1),zeros(1,i-1)];q=[q(1)+q(2),q(3:n),1];endfor i=1:n-1c(i,:)=blanks(n*n);endc(n-1,n)='0';c(n-1,2*n)='1';for i=2:n-1c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(fi nd(m(n-i+1,:)==1)));c(n-i,n)='0';c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='1';for j=1:i-1c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1 )-1)+1:n*find(m(n-i+1,:)==j+1));endendfor i=1:nh(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n); ll(i)=length(find(abs(h(i,:))~=32));endl=sum(p.*ll);在命令行后输入》p=[0.1 0.3 0.05 0.09 0.21 0.25];》[H,l]=huffman(p)记录运行结果,并说明编码结果是否正确,计算编码效率。

霍夫曼编码的matlab实现(信源编码实验)资料

霍夫曼编码的matlab实现(信源编码实验)资料

霍夫曼编码的m a t l a b 实现(信源编码实验)重庆交通大学信息科学与工程学院综合性设计性实验报告专业班级:通信工程2012级1班学号: 631206040118姓名:王松实验所属课程:信息论与编码实验室(中心):软件与通信实验中心指导教师:黄大荣2015年4月霍夫曼编码的matlab实现一、实验目的和要求。

利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输的时间,降低传输成本。

本实验用Matlab语言编程实现霍夫曼(Huffman)编码。

二、实验原理。

霍夫曼(Huffman)编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。

算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。

这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。

这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。

从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。

离散无记忆信源:例如U u1u2u3u4u5P(U) = 0.4 0.2 0.2 0.1 0.1通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼编码。

三、实验步骤分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到霍夫曼编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵G中,位置索引存入矩阵Index中。

这样,由排序之后的概率矩阵G以及索引矩阵Index就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。

2、码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。

matlab 霍夫曼编码

matlab 霍夫曼编码

matlab 霍夫曼编码一、背景介绍二、霍夫曼编码原理三、matlab实现霍夫曼编码1. 建立霍夫曼树2. 构建编码表3. 压缩文件4. 解压文件四、应用举例一、背景介绍在信息传输和存储中,数据的压缩是一个重要的问题。

其中,霍夫曼编码是一种常用的无损压缩算法,通过对不同字符出现频率进行编码,可以将数据压缩到较小的空间中。

在matlab中,可以通过代码实现对数据的霍夫曼编码。

二、霍夫曼编码原理1. 需要进行压缩的数据由若干个字符组成。

2. 统计每个字符出现的频率,并根据频率构建霍夫曼树。

3. 根据霍夫曼树构建每个字符对应的编码表。

4. 将原始数据中每个字符按照对应的编码表进行编码,并将所有编码拼接为一个字符串。

5. 将字符串转换为二进制数列,并将其写入文件中。

解压时,需要读取二进制数列,并按照相应的编码表进行解码还原原始数据。

三、matlab实现霍夫曼编码1. 建立霍夫曼树在matlab中,可以通过以下代码实现霍夫曼树的构建:```matlabfunction [T, f] = huffmantree(p)n = length(p);f = p;T = zeros(n-1, 3);for i=1:n-1[f, j] = sort(f);T(i, 1:2) = j(1:2);T(i, 3) = f(1) + f(2);f(2) = T(i, 3);end```其中,p为每个字符出现的频率,n为字符数。

函数返回的T为霍夫曼树的结构矩阵,f为每个节点的权值。

2. 构建编码表在得到霍夫曼树之后,可以通过以下代码构建每个字符对应的编码表:```matlabfunction codebook(T)n = size(T, 1) + 1;codebook = cell(n, 2);for i=1:ncodebook{i, 1} = i;endfor i=1:n-1j = T(i, 1:2);for k=1:length(j)codebook{j(k), 2}=[codebook{j(k), 2},num2str(mod(k-1,2))]; if ~isempty(codebook{j(k), 2})codebook{j(k), 3}=[codebook{j(k), 3},i];elsecodebook{j(k), 3}=i;endendend```其中,codebook为编码表,第一列为字符编号,第二列为对应的编码。

编写matlab函数实现huffman编码的算法

编写matlab函数实现huffman编码的算法
1 i N , Ri 被称为量化间隔,且在每个区域内选择一个点作量化级数。这样落
在区域内的随机变量的所有值都被量化为第 i 个量化级数,用 X i 来表示,这就意 味着:
x Ri ( x) xi
显而易见,这类量化引入了失真,其均方误差为:
d i 1 ( x xi ) 2 f x( x)dx

这称为 Kraft 不等式。
q
i 1
r li 1
(8)
由上式可知,给定 r 和 q,只要允许码字长度可以足够长,则码长总可以满 足 Kraft 不等式而得到即时码,Kraft 不等式指出了即时码的码长必须满足的条 件。后来 McMillan 证明对于唯一可译码得码长也必须满足此不等式。在码长的 选择上唯一可译码并不比即时码有更宽松的条件。对于唯一可译码,该不等式又 称为 McMillan 不等式。 唯一可译码存在的充要条件是:
展信源进行编码, 当 N 趋向于无穷时, 平均码长可以趋进该极限值。 还可以证明, 如果我们不确切知道信源的概率分布,我们用估计的概率分布去进行编码时,平 均码长会加长,但是如果估计的偏差不大的话,平均码长也不会增加太多。 2.4 无失真编码算法 2.4.1 无失真信源编码定理 设单符号、离散、无记忆信源的熵为 H(S),若用二进制码对其做变字长、非 续长编码,一定可以找到一种编码方式,其平均码长满足:

q
i 1
r li 1
(9)
其中 r 为码符号个数,为码字长度,q 为信源符号个数 无失真变长信源编码定理 离散无记忆信源 S 的 N 次扩展信源 S N ,其熵为 H (S N ) ,并且编码器的码元 符号集为 A : {a1 , a2 ,..., aq } 对信源 S N 进行编码,总可以找到一种编码方法,构成唯 一可译码,使信源 S 中每个符号 Si 所需要的平均码长满足

matlab 霍夫曼编码解析

matlab 霍夫曼编码解析

matlab 霍夫曼编码解析【知乎文章】1. 概述霍夫曼编码是一种广泛应用于数据压缩领域的编码算法,由大卫·霍夫曼于1952年提出。

该编码方法通过对出现频率较高的字符赋予较短的编码,提高了数据的压缩率。

在本文中,我将详细介绍霍夫曼编码的原理和实现过程,并探讨其在Matlab中的应用。

2. 霍夫曼编码原理2.1 符号频率统计在进行霍夫曼编码之前,首先需要统计待编码字符的出现频率。

这可以通过计算每个字符在信源中的出现次数来实现。

2.2 构建霍夫曼树在统计得到每个字符的频率后,接下来需要构建一棵霍夫曼树。

霍夫曼树是一种特殊的二叉树,它的每个叶子节点都对应一个字符,并且每个节点的权重等于其左右子树权重之和。

构建霍夫曼树的方法通常采用贪心算法,即每次选择权重最小的两个节点合并。

2.3 生成霍夫曼编码在得到霍夫曼树后,可以通过从根节点遍历到叶子节点的路径上的每一次分支决策,赋予相应的编码。

这样,每个字符就对应一个唯一的霍夫曼编码。

3. Matlab实现在Matlab中,可以通过以下步骤实现霍夫曼编码的解析:3.1 构建霍夫曼树利用Matlab中的数据结构——二叉树,可以方便地构建霍夫曼树。

根据字符频率的统计结果,创建叶子节点。

每次选择频率最小的两个节点合并为一个新节点,并将其作为新的叶子节点插入树中。

重复这个过程直到只剩下一个节点,即为根节点。

3.2 生成霍夫曼编码在构建好霍夫曼树后,可以通过从根节点遍历到叶子节点的路径上的每一次分支决策,生成霍夫曼编码。

这可以通过递归遍历二叉树实现,每次遍历左子树时添加'0',每次遍历右子树时添加'1'。

4. 观点和理解霍夫曼编码作为一种高效的数据压缩算法,在实际应用中有着广泛的应用。

通过赋予频率较高的字符较短的编码,可以在保证信息完整性的前提下大幅减小数据的存储空间。

Matlab作为一种功能强大的数据分析和处理工具,在霍夫曼编码的实现上也提供了便捷的方法。

信息论与编码课程作业_huffman编码的matlab_实现

信息论与编码课程作业_huffman编码的matlab_实现

信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化一:设计目的:1、学习离散信源平均信息量的计算方法。

2、理解和掌握huffman 编码的基本原理,实现对信源符号的huffman 编码3、熟悉 Matlab 编程; 二:设计原理和思路1.信源熵的计算:公式: 21()log a I a p = Matlab 实现:I=log2(1/p) 或I=-log2(p) 熵(平均自信息)的计算公式22111()log log qq i i i i i i H x p p p p ====-∑∑Matlab 实现:HX=sum(-x.*log2(x));或者h=h-x(i)*log2(x(i));2.霍夫曼编码原理;分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵p 中,位置索引存入矩阵m 中。

这样,由排序之后的概率矩阵 p 以及索引矩阵m 就可以恢复原概率矩阵P 了,从而保证了回溯过程能够进行下去。

2、码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。

从索引矩阵M 的末行开始回溯。

(1) 在p 的末行2元素位置填入0和1。

(2) 根据该行索引1位置指示,将索引1位置的编码(‘1’)填入上一行的第一、第二元素位置,并在它们之后分别添加‘0’和‘1’。

(3) 将索引不为‘1’的位置的编码值(‘0’)填入上一行的相应位置(第3 列)。

(4) 以m的倒数第二行开始向上,重复步骤(1) ~ (3),直到计算至m的首行为止。

三:设计代码:>> clear all;format longdisp(strcat('信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化',13));histgram=zeros(1,255);[c,map]=imread('C:\Documents and Settings\Administrator\桌面\infomation\lenna.bmp');x=rgb2gray(c);[a,b]=size(x);for i=1:afor j=1:bk=x(i,j);histgram(k)=histgram(k)+1;endendf=histgram/a/b;symbols=find(f~=0); %灰度值p=f(symbols); %概率L=length(p);pp=p;%霍夫曼编码m=zeros(L-1,L);for i=1:L-1[p,mark]=sort(p);m(L-i,1:L-i+1)=mark(1:L-i+1);p=[p(1)+p(2),p(3:L),1];endc=cell(L-1,L);c(1,1)={'0'};c(1,2)={'1'};for i=2:L-1;ind=find(m(i-1,:)==1);temp=char(c(i-1,ind));c(i,1)={[temp,'0']};c(i,2)={[temp,'1']};snc=find(m(i-1,:)~=1);for j=3:i+1;con=snc(j-2);c(i,j)=c(i-1,con);endendcodeL=[];averge_long=0;H1=0;disp(strcat('灰度值',32,32,32,'概率',32,32,32,32,32,32,32,32,32,'霍夫曼编码:'));for i=1:L;ind=find(m(L-1,:)==i);code=char(c(L-1,ind));codeLength(i)=length(code);averge_long=averge_long+pp(i)*codeLength(i);H1=H1+pp(i)*log2(1/pp(i));disp(strcat(32,num2str(symbols(i)),32,32,32,num2str(pp(i)),32,32, code));enddisp(strcat('信源熵=',num2str(H1),32,32,32,32,'平均码字长度=',num2str(averge_long),32,32,32,32,32,'压缩比=',num2str(8/averge_long)));四:设计运行结果:信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化灰度值概率霍夫曼编码:30 1.5259e-005 101000111100001031 1.5259e-005 101000111100001136 1.5259e-005 101000111100000037 1.5259e-005 101000111100000139 6.1035e-005 1010001111000140 7.6294e-005 1110010101001041 6.1035e-005 0111010111011042 6.1035e-005 0111010111011143 9.1553e-005 1110010101001144 0.00018311 111011101010145 0.00021362 00111101101146 0.00022888 01110101111047 0.00024414 01110101111148 0.00039673 0011110110049 0.00048828 1010001110050 0.00065613 1110010101151 0.00090027 011101011052 0.00086975 001111011153 0.0013123 111001011054 0.0013733 111011101155 0.0015411 00010101156 0.0018005 01110101057 0.0025177 11010001158 0.0036621 0111111059 0.0033722 0101111060 0.0046539 1100110161 0.0055847 1111010162 0.0061188 001001063 0.0080261 100111064 0.0075226 100001165 0.0083466 101010166 0.0088806 101111167 0.0092773 110011168 0.0095367 110101069 0.0086517 101101070 0.0084229 101011071 0.0075378 100010172 0.0071564 011011173 0.0061493 001001174 0.0056 1111011075 0.0053864 1110110076 0.0045319 1100011177 0.0043488 1011000178 0.0042114 1010111079 0.0039063 1000111180 0.0041199 1010100181 0.0035706 0110101182 0.0039368 1001011083 0.0037537 1000010084 0.003479 0110101085 0.0036011 0111000186 0.0033417 0101101087 0.0032501 0100110088 0.0034027 0110000189 0.0031128 0011010090 0.0031433 0011110091 0.0036774 0111111192 0.0041046 1010011094 0.0038452 1000111095 0.004364 1011100096 0.0037842 1000110097 0.0037079 1000001198 0.0033722 0101111199 0.0040741 10100001 100 0.0040741 10100010 101 0.0038147 10001101 102 0.0040588 10011111 103 0.0041046 10100111 104 0.004364 10111001 105 0.0048218 11010111 106 0.0052185 11100100 107 0.0049591 11011010 108 0.005188 11100001 109 0.0047455 11010110 110 0.0052032 11100011 111 0.0054474 11110100 112 0.0057526 11111011 113 0.0065308 0100111 114 0.0079346 1001100 115 0.010223 1101111116 0.0095825 1101100 117 0.0089417 1100000 118 0.0086975 1011011 119 0.0081787 1010010 120 0.007782 1001001121 0.0066376 0101011 122 0.0059357 11111111 123 0.0056458 11110111 124 0.0051575 11100000 125 0.0052948 11101001 126 0.005188 11100010 127 0.0059814 0000001 128 0.0058594 11111101 129 0.0065613 0101010 130 0.0062561 0011011 131 0.006897 0110100132 0.0072479 0111011 133 0.0073242 0111110 134 0.007309 0111101135 0.0075226 1000100 136 0.0077515 1001000138 0.008606 1011001139 0.0091095 1100100 140 0.012115 000010141 0.012115 000011142 0.012741 001110143 0.012329 001100144 0.010941 1111001145 0.010147 1101110146 0.0089417 1100001 147 0.0088043 1011101 148 0.0091095 1100101 149 0.010712 1110101150 0.011337 1111100151 0.010513 1110011152 0.012878 010000153 0.012268 001010154 0.013138 010100155 0.012238 001000156 0.012939 010001157 0.012115 000100158 0.012955 010010159 0.012207 000111160 0.011993 000001161 0.013916 011001162 0.012177 000110163 0.012299 001011164 0.0094604 1101001 165 0.0089874 1100010 166 0.0088501 1011110 167 0.0056915 11111010 168 0.0059357 0000000 169 0.0071716 0111001 170 0.0057678 11111100 171 0.0054016 11101111 172 0.0054169 11110001 173 0.0058746 11111110 174 0.0072937 0111100 175 0.0070953 0110110 176 0.006424 0011111177 0.0061035 0001011 178 0.0054016 11110000 179 0.0053864 11101101 180 0.0046692 11010000182 0.0036774 10000000183 0.0033875 01100000184 0.0033264 01011000185 0.0031281 00110101186 0.0035706 01110000187 0.0033264 01011001188 0.0033569 01011011189 0.0036011 01110100190 0.0040436 10011110191 0.0034485 01100010192 0.0036774 10000001193 0.0032654 01001101194 0.0034485 01100011195 0.003006 00010100196 0.0033722 01011100197 0.0036774 10000010198 0.0042419 10110000199 0.0045166 11000110200 0.0041046 10101000201 0.0052643 11101000202 0.0050354 11011011203 0.0045319 11001100204 0.0039825 10011010205 0.0040588 10100000206 0.0039673 10010111207 0.0037537 10000101208 0.0033722 01011101209 0.0026703 111011100210 0.0022125 110100010211 0.0018768 101000110212 0.0015259 000101010213 0.0013428 1110010111214 0.0012665 1110010100215 0.0007782 0011110100216 0.00079346 0011110101217 0.00061035 10100011111218 0.00054932 10100011101219 0.00065613 11101110100220 0.00035095 111011101011 221 0.00033569 111001010101 222 0.00030518 101000111101 223 0.00021362 011101011100 224 0.00016785 1110111010100225 0.00019836 001111011010226 0.00015259 1110010101000227 0.00010681 0111010111010228 6.1035e-005 10100011110010230 3.0518e-005 101000111100110231 1.5259e-005 10100011110011110232 1.5259e-005 10100011110011111233 1.5259e-005 1010001111001110信源熵=7.2193 平均码字长度=7.2492 压缩比=1.1036五:设计新得体会:通过这学期对信息论和编码的学习,以及这次的设计,使我了解了很多东西,也使以前所学的知识得以巩固!,通过这次的设计,进一步学习了离散信源平均信息量、平均码长和压缩比的计算方法。

(完整word版)huffman编码的matlab实现

(完整word版)huffman编码的matlab实现

Huffman编码的matlab实现一、信源编码介绍为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对所施行的变换。

具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。

既然信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在减少剩余度而对信源输出符号序列所施行的变换或处理,都可以在这种意义下归入信源编码的范畴,例如过滤、预测、域变换和数据压缩等。

当然,这些都是广义的信源编码。

一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:①使序列中的各个符号尽可能地互相独立;②使序列中各个符号的出现概率尽可能地相等。

前者称为解除相关性,后者称为概率均匀化。

信源编码的一般问题可以表述如下:信源编码若某信源的输出为长度等于M的符号序列集合式中符号A为信源符号表,它包含着K个不同的符号,A={ɑk|k=1,…,K},这个信源至多可以输出K M个不同的符号序列。

记‖U‖=KM。

所谓对这个信源的输出信源编码进行编码,就是用一个新的符号表B的符号序列集合V来表示信源输出的符号序列集合U。

若V的各个序列的长度等于 N,即式中新的符号表B共含L个符号,B={b l|l=1,…,L}。

它总共可以编出L N个不同的码字。

类似地,记‖V‖=LN。

为了使信源的每个输出符号序列都能分配到一个独特的码字与之对应,至少应满足关系‖V‖=L N≥‖U‖=KM或者N/M≥log K/log L下面的几个编码定理,提供了解决这个矛盾的方法。

它们既能改善信息载荷效率,又能保证码字唯一可译。

离散无记忆信源的定长编码定理对于任意给定的ε>0,只要满足条件N/M≥(H(U)+ε)/log L那么,当M足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。

霍夫曼编码的MATLAB实现(完整版).pdf

霍夫曼编码的MATLAB实现(完整版).pdf

%哈夫曼编码的 MATLAB 实现(基于 0、1 编码):clc;clear;A=[0.3,0.2,0.1,0.2,0.2];A=fliplr(sort(A));%T=A;信源消息的概率序列按降序排列[m,n]=size(A);B=zeros(n,n-1);% 空的编码表(矩阵)for i=1:nB(i,1)=T(i);%end生成编码表的第一列r=B(i,1)+B(i-1,1);%最后两个元素相加T(n-1)=r;T(n)=0;T=fliplr(sort(T));t=n-1;for j=2:n-1%生成编码表的其他各列for i=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);%%该列的位置从第二列开始,每列的最后一个元素记录特征元素在r=(B(t-1,j)+B(t,j));%T(t-1)=r;最后两个元素相加T(t)=0;T=fliplr(sort(T));t=t-1;end B;%输出编码表END1=sym('[0,1]');%给最后一列的元素编码END=END1;t=3;d=1;for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码for i=1:t-2if i>1 & B(i,j)==B(i-1,j)d=d+1;elsed=1;end B(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;endA% 排序后的原概率序列END% 编码结果for i=1:n[a,b]=size(char(END(i)));L(i)=b;endavlen=sum(L.*A)% 平均码长H1=log2(A);H=-A*(H1')% 熵P=H/avlen%编码效率2。

实验 Huffman编码(含matlab代码)

实验 Huffman编码(含matlab代码)

实验二Huffman编码一实验目的1 通过本实验实现信源编码——Huffman编码2 编写M文件实现,掌握Huffman编码方法二实验要求1 了解matlab中M文件的编辑、调试过程2 编写程序实现Huffman编码算法三实验步骤1 输入Huffman编码程序2 运行程序,按照提示输入相应信息,并记录输入信息,及运行结果。

注:观察结果方法:data(1).Code显示a1的编码,同理显示data(2).Code,a2的编码结果。

3 思考:该程序编出的Huffman码是否是最小码方差的码?为什么?四报告要求五附Huffman编码程序clearN=input('请输入信源符号的个数:') ;for i=1:N%data(1).name=input('请输入各信源符号的名称:');data(i).p=input('请输入各信源符号发生的概率:');endfor i=1:Npp(i)=data(i).p;data(i).imap=i; %各符号在编码过程中的指针data(i).Code=''; %各符号的编码结果endfor j = 1:N % N——信源符号的个数for i = 1:N - jif (pp(i) > pp(i + 1))fT = pp(i);pp(i) = pp(i + 1);pp(i + 1) = fT;for k = 1:Nif data(k).imap == idata(k).imap = i + 1;elseif data(k).imap == i + 1data(k).imap = i;endendendendendp=pp;%%%%%%%%%%%%%%%%%%%%% %// 计算哈夫曼编码表%// 开始编码for i=1:N-1for k = 1:Nif data(k).imap== idata(k).Code = strcat('1',data(k).Code);elseif (data(k).imap== i + 1)data(k).Code = strcat('0',data(k).Code);endendp(i + 1) = p(i + 1)+p(i);for k = 1:Nif (data(k).imap == i)data(k).imap = i + 1;endendfor j = i + 1:N-1if p(j) >p(j + 1)fT =p(j);p(j) = p(j + 1);p(j + 1) = fT;for k = 1:Nif (data(k).imap == j)data(k).imap = j + 1;elseif (data(k).imap == j + 1)data(k).imap = j;endendendendend。

霍夫曼编码matlab

霍夫曼编码matlab

霍夫曼编码matlab在Matlab中实现霍夫曼编码可以通过以下步骤完成:1. 构建霍夫曼树,首先,你需要根据输入的数据统计每个符号出现的频率。

然后,使用这些频率构建霍夫曼树。

你可以使用Matlab中的数据结构来表示霍夫曼树,比如使用结构体或者类来表示节点。

2. 生成霍夫曼编码,一旦构建了霍夫曼树,你可以通过遍历树的方式生成每个符号对应的霍夫曼编码。

这可以通过递归或者迭代的方式实现。

3. 对数据进行编码和解码,使用生成的霍夫曼编码对输入的数据进行编码,然后再对编码后的数据进行解码。

这可以帮助你验证霍夫曼编码的正确性。

以下是一个简单的示例代码,用于在Matlab中实现霍夫曼编码: matlab.% 假设有一个包含符号频率的向量 freq 和对应符号的向量symbols.% 构建霍夫曼树。

huffTree = hufftree(freq);% 生成霍夫曼编码。

huffCodes = huffenco(symbols, huffTree);% 对数据进行编码。

data = [1 0 1 1 0 1 1 1]; % 你的输入数据。

encodedData = huffenco(data, huffCodes);% 对数据进行解码。

decodedData = huffmandeco(encodedData, huffTree);需要注意的是,以上代码仅为简单示例,实际应用中可能需要根据具体情况进行调整和完善。

同时,对于大规模数据的处理,也需要考虑到内存和性能方面的优化。

希望这个简单的示例能够帮助你在Matlab中实现霍夫曼编码。

信息论实验用matlab实现哈夫曼码编译码

信息论实验用matlab实现哈夫曼码编译码

信息论与编码基础课程实验报告实验名称:Huffman码编译码实验姓名:学号:组别:专业:指导教师:班队:完成时间:成绩:Huffman码编译码实验一.实验目的和要求熟悉matlab软件编程环境及工具箱,掌握Huffman码编译码方法的基本步骤,利用matlab实现Huffman码的编译码。

二.试验内容和原理内容:利用matlab编程实现文本的二进制Huffman码的编译码。

任务:构造Huffman树。

原理:在各字符出现概率不均匀的情况下,根据这些概率构造一棵用于编码的Huffman树。

它用最短的二进制位表示出现概率最高的字符,而用较长的为表示出现概率低的字符,从而使平均码长缩短,并且保持编码的唯一可译性。

三.操作方法和实验步骤对一随机英文文本文件进行Huffman编译码仿真,给出各个字母的概率,码字,平均信息量,平均码长,编码效率以及编码序列输出。

(一)编码序列获取使用fopen函数读取.txt文本文件中的数据存储为字符串,使用length获取其长度,使用unique获取字符个数。

(二)获取编码概率矩阵使用strfind函数获取字符个数并计算各个符号的概率,根据哈夫曼编码原理依次获得各步骤中得到的概率,赋值给概率矩阵,使用find查找合并概率在的下标并存储到该列的最后一位,如有两个以上优先存储较大的那个下标。

(三)获取编码矩阵依据哈夫曼编码原理,根据获取的概率矩阵倒序编码。

最后一列直接编码0和1,取出最后一行中记录合并概率下标的数,由于该合并概率在上一列中肯定在最后两行,故优先编码,在字符串尾部加0和1;剩余编码直接平移,使用if 条件控制由于合并概率位置不同带来的平移方法不同。

(四)计算平均码长、自信息等使用公式计算平均码长、自信息、编码效率平均码长自信息编码效率(五)依据编码表编码由于是单符号信源,故使用strrep 字符替换函数直接替换(六)反向译码哈夫曼码是前向译码,遍历编码表,使用strncmpi 比较传输信息前x 个字符,如返回值为真直接译码,传输信息截取已经译码的部分,码字添加到译码信息中。

赫夫曼编码matlab实现

赫夫曼编码matlab实现

赫夫曼编码matlab实现赫夫曼编码(Huffman coding)是一种常用的数据压缩算法,通过将出现频率较高的字符用较短的编码表示,从而达到减少存储空间和传输数据量的目的。

本文将针对赫夫曼编码的实现进行详细介绍,并使用MATLAB语言进行具体实现。

文章将按照以下步骤逐一解释赫夫曼编码的实现过程,并给出MATLAB代码的编写。

1. 理解赫夫曼编码赫夫曼编码是一种前缀编码,即每个字符的编码都不是其他字符编码的前缀。

这种编码方式使得解码时不需要回溯,从而提高了效率。

赫夫曼编码的实现主要涉及两个步骤:构建哈夫曼树和生成编码表。

2. 构建哈夫曼树构建哈夫曼树是赫夫曼编码的第一步。

根据所需压缩的数据,统计每个字符出现的频率,并将频率作为节点权值构建一颗权值最小的二叉树。

构建哈夫曼树的步骤如下:a. 对于每个字符,统计其出现的频率。

b. 创建一个节点集合,将每个频率作为节点的权值,将所有字符节点加入集合。

c. 从节点集合中选取两个权值最小的节点合并,在新节点的左右子树上分别标记0和1。

d. 将新节点加入节点集合,重复上述步骤,直至节点集合中只剩下一个节点,此节点即为哈夫曼树的根节点。

3. 生成编码表生成编码表是赫夫曼编码的第二步。

在构建好哈夫曼树后,通过遍历哈夫曼树上的每个叶子节点,从根节点到叶子节点的路径上的左右分支分别表示0和1的编码,将每个字符对应的编码存储在编码表中。

4. 实现赫夫曼编码的MATLAB代码使用MATLAB语言可以方便地实现赫夫曼编码算法。

以下是一个简单的赫夫曼编码的MATLAB代码示例:function [codes, tree] = huffman_encode(text)freq = histcounts(text);chars = unique(text);nodes = cell(length(chars), 1);for i = 1:length(chars)nodes{i} = struct('Symbol', chars(i), 'Frequency', freq(i), 'Code', '');endwhile length(nodes) > 1[value, idx] = sort(cellfun(@(x) x.Frequency, nodes));node1 = nodes{idx(1)};node2 = nodes{idx(2)};newNode = struct('Symbol', '', 'Frequency', node1.Frequency + node2.Frequency, 'Code', '');newNode.Left = node1;newNode.Right = node2;nodes(idx(2)) = [];nodes(idx(1)) = [];nodes{end + 1} = newNode;endtree = nodes{1};assign_codes(tree, '');for i = 1:length(chars)idx = find(cellfun(@(x) strcmp(x.Symbol, chars(i)), nodes));codes{i, 1} = chars(i);codes{i, 2} = nodes{idx}.Code;endendfunction assign_codes(node, code)if ~isempty(node.Left)assign_codes(node.Left, strcat(code, '0'));endif ~isempty(node.Right)assign_codes(node.Right, strcat(code, '1'));endif isempty(node.Left) && isempty(node.Right) node.Code = code;endend5. 示例测试可以使用一段文本进行测试,例如:text = 'this is an example for huffman encoding'; codes = huffman_encode(text);disp(codes);运行结果将输出每个字符的编码,如:' ' '1101''a' '111''c' '1001''d' '01001''e' '11''f' '0101''g' '00100''h' '000''i' '101''l' '00111''m' '01100''n' '1000''o' '00110''p' '00101''r' '01000''s' '10001''t' '0101''x' '01101'通过以上步骤,我们可以成功地实现赫夫曼编码的MATLAB实现。

基于MATLAB的霍夫曼程序设计

基于MATLAB的霍夫曼程序设计

本科课程设计基于MATLAB的霍夫曼编码设计院(系)名称专业名称学生姓名学号指导教师完成时间2016.12.31基于MATLAB 的霍夫曼编码设计霍夫曼编码是一种无损的统计编码方法,利用信息符号概率分布特性改变字长进行编码。

霍夫曼编码适用于多元独立信源,对于多元独立信源来说它是最佳码。

1 基本原理霍夫曼编码是一种利用信息符号概率分布特征的变字长的编码方法,即对于出现概率大的信息符号编以短字长的码,对于出现概率小的信息符号编以长字长的码。

如果码字长度严格按照所对应符号出现概率大小逆序排列,则编码结果的平均码字长度一定小于任何其他排列形式。

霍夫曼编码则是严格按照信源符号出现的概率大小来构造码字,因此这种编码方式形成的平均码字长度最短。

霍夫曼编码系统主要分为压缩对象输入、概率统计、构造Huffman 树、生成Huffman树、压缩编码环节组成,如图所示霍夫曼解码系统构成。

编程依据霍夫曼的编程步骤进行,实现对数据的压缩及其压缩参数的计算。

2霍夫曼编码的步骤:2.1将信源符号按出现概率从大到小排成一列,然后把最末两个符号的概率相加, 合成一个概率。

2.2 把这个符号的概率与其余符号的概率按从大到小排列,然后再把最末两个符号的概率加起来,合成一个概率。

2.3 重复上述做法,直到最后剩下两个概率为止。

2.4 从最后一步剩下的两个概率开始逐步反向进行编码。

没步只需对两个分支各赋予压缩图像输出图像输入一个二进制码,如对概率大的赋予码0,对概率小的赋予码1。

3 实例分析设输入信源L1,L2,L3,L4的概率分别为:0.5,0.19,0.19,0.12编码结果为:L1=0,L2=11,L3=100,L4=10,根据所给参数求得信息源熵为:平均码字长度为:编码效率为:%3.9881.178.1)(===R X H η78.1)12.0log 12.019.0log 19.019.0log 19.05.0log 5.0(log )(2222412=+++-=-=∑=k k k p P X H ∑==⨯+⨯+⨯+⨯==4181.1312.0319.0219.015.0k k k P B R冗余度为:017.0983.011=-=-=ηy压缩比为:4 程序%霍夫曼编码 李晓东130524050close all;clear all;clc; %关闭所有图形窗口,清楚工作空间所有变量,清除命令行 A=[0.5,0.19,0.19,0.12]; %信源消息的概率序列 A=fliplr(sort(A)); %按降序排列 T=A;[m,n]=size(A);B=zeros(n,n-1); %空的编码表(矩阵) for i=1:nB(i,1)=T(i); %生成编码表的第一列 endr=B(i,1)+B(i-1,1); %最后两个元素相加 T(n-1)=r; T(n)=0;T=fliplr(sort(T)); t=n-1;for j=2:n-1 %生成编码表的其他各列 for i=1:t B(i,j)=T(i); endK=find(T==r);B(n,j)=K(end); %从第二列开始,每列的最后一个元素记录特征元素在盖烈的位置 r=(B(t-1,j)+B(t,j)); %最后两个元素相加 T(t-1)=r; T(t)=0;T=fliplr(sort(T)); t=t-1; endB; %输出编码表END1=sym('[0,1]'); %给最后一列的元素编码 END=END1; t=3; d=1;for j=n-2:-1:1 for i=1:t-2if i>1&B(i,j)==B(i-1,j)11.181.12===R d rd=d+1;elsed=1;endB(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;enddisp('排序后的原概率序列P:');disp(A) %排序后的原概率序列disp('编码结果END')disp(END); %编码结果for i=1:n[a,b]=size(char(END(i)));L(i)=b;enddisp('平均码子长度')avlen=sum(L.*A);disp(avlen); %平均码长H1=log2(A);disp('信息熵')H=-A*(H1');disp(H) %熵disp('编码效率')A=H/avlen;disp(A) %编码效率5 运行结果排序后的原概率序列P:0.5000 0.1900 0.1900 0.1200编码结果END[ 0, 11, 100, 101]平均码子长度1.8100信息熵1.7775编码效率0.9821 6 程序截图。

霍夫曼编码(含源程序)

霍夫曼编码(含源程序)

多媒体技术基础实验报告——霍夫曼编码学院:电子工程与光电技术学院专业:电子信息工程姓名:学号:任课老师:康其桔实验时间:一、实验内容及要求1、使用Matlab 编程实现霍夫曼编码2、通过键盘输入字符串3、在屏幕上显示编码结果二、实验原理霍夫曼编码是霍夫曼在1952年提出和描述的“从下到上”的熵编码方法。

根据给定数据集中各元素所出现的频率来压缩数据的一种统计压缩编码方法。

这些元素(如字母)出现的次数越多,其编码的位数就越少。

其基本步骤为: (1) 将压缩的各字符的出现概率按减少(或增加)的顺序进行排列。

(2) 将两个最小的概率进行组合相加得到一个新概率将这一新概率与其它概率一起继续执行1 和2 的操作直至最后概率为1.0。

(3) 对每对组合中的概率较大者指定为1,较小者指定为0。

(4) 画出由每个信源符号概率到1.0处的路径记下路径的1和0。

(5) 对每个信源符号由从右到左写出1/0序列,对概率较高的标1,对概率较低的标0(或对概率较高的标0,对概率较低的标1),就得到了对应的Huffman 码。

下面举个例子来说明霍夫曼编码的具体过程。

设需要编码的信息为:BACDEBACDEBACDEBADEBAEBABABABB,统计各个字符出现的次数分别为B(10次)、A(8次)、C(3次)、D(4次)、E(5次)。

各个字符出现的概率为B(10/30)、A(8/30)、E(5/30)、D(4/30)、C(3/30)。

霍夫曼编码的过程如下: B(10/30)A(8/30)E(5/30) D(4/30) C(3/30) 霍夫曼编码后平均码长为2(10/308/305/30)3(4/303/30) 2.23b ⨯+++⨯+≈ 。

而信源熵 2.19H b =。

由此,我们可以看出,霍夫曼编码结果已经很接近理想信源熵。

三、设计方案设计的流程图如下:7/30 12/3018/30 30/30 B:11 A:10 E:00 D:011 C:010 1 010 0 1 1 0四、各模块设计(一)读入字符串并去除空格在Matalb中使用语句inputstring=input('请输入需要编码的字符:','s'),输入的字符串存入char型数组inputstring中。

matlab信源二进制赫夫曼编码

matlab信源二进制赫夫曼编码

信源二进制赫夫曼编码是一种常见的数据压缩算法,它可以有效地降低数据传输和存储的成本。

在本文中,我将深入探讨matlab中的信源二进制赫夫曼编码的原理、实现和应用,并共享我的个人观点和理解。

让我们来了解一下信源编码的基本概念。

信源编码是一种将离散或连续信号转换为离散符号的过程,其目的是尽量减少信号的冗余度,以便更高效地传输和存储。

在数字通信和数据存储领域,信源编码起着至关重要的作用。

而二进制赫夫曼编码是一种常见的无损数据压缩算法,其核心思想是通过对出现频率较高的符号赋予较短的编码,而对出现频率较低的符号赋予较长的编码,从而实现数据的压缩。

在matlab中,我们可以利用赫夫曼树和编码表来实现信源二进制赫夫曼编码。

接下来,我将详细介绍matlab中的信源二进制赫夫曼编码的实现过程。

在matlab中,我们可以使用`huffmandict`函数来创建赫夫曼编码字典,该函数需要输入符号和它们对应的概率作为参数。

我们可以使用`huffmanenco`函数来对输入的符号序列进行赫夫曼编码,得到压缩后的二进制码字。

我们可以使用`huffmandeco`函数来对压缩后的二进制码字进行解码,得到原始的符号序列。

通过这些函数的组合,我们可以在matlab中轻松实现信源二进制赫夫曼编码。

具体的实现细节和示例代码我将在下文中进行详细讲解。

信源二进制赫夫曼编码的应用非常广泛,特别是在无线通信、图像压缩和音频处理等领域。

通过使用赫夫曼编码,我们可以大大减小数据传输和存储的成本,提高系统的效率和可靠性。

赫夫曼编码也是信息论中的重要概念,它为我们理解信息压缩和编码提供了重要的思路和方法。

从个人观点来看,信源二进制赫夫曼编码作为一种经典的数据压缩算法,具有重要的理论意义和实际应用价值。

在matlab中,我们可以利用现成的函数库来实现赫夫曼编码,同时也可以根据具体的应用场景进行定制化的优化。

通过不断深入研究和实践,我们可以进一步发掘赫夫曼编码的潜力,为数据压缩和信息传输领域带来更多的创新和突破。

Huffman编码(哈夫曼编码)的Matlab实现

Huffman编码(哈夫曼编码)的Matlab实现

clear 【1 】all fprintf('Reading data...')data=imread('cameraman.tif');data=uint8(data);%读入数据,并将数据限制为uint8 fprintf('Done!\n')%编码紧缩fprintf('compressing data...');[zipped,info]=norm2huff(data);fprintf('Done!\n')%解紧缩fprintf('compressing data...');unzipped=huff2norm(zipped,info);fprintf('Done!\n')%测试是否无掉真isOK=isequal(data(:),unzipped(:))%显示紧缩后果whos datazippedunzippedfunction [zipped,info]=norm2huff(vector)if~isa(vector,'uint8'),error('input argument must be a uint8 vector') endvector=vector(:)';%将输入向量转换为行向量f=frequency(vector);%盘算个元素消失的概率simbols=find(f~=0);f=f(simbols);%将元素按消失的概率分列[f,sortindex]=sot(f);simbols=simbols(sortindex);%产生码字 generate the codeword as the 52 bits of a doublelen=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 datainordertohavetwonodeswithlowerfrequencyasfirst to[f,sortindex]=sort(f);simbols_index=simbols_index(sortindex);end%对应响应的元素与码字codeword=cell(256:1);codeword(simbols)=codeword_tmp;%盘算总的字符串长度len=0;for index=1:length(vector),len=len+length(codeword{double(vector(index))+1}); end%产生01序列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%假如须要,加零len=length(string);pad=8-mod(len,8);if pad>0,string=[string uint8(zeros(1,pad))];end%保管现实有效的码字codeword=codeword(simbols);codelen=zeros(size(codeword));weights=2.^(0:23);maxcodelen=0;for index 1:length(codeword),len=length(codeword{index});if len>maxcodelen,maxcodelen=len;endif len>0,code=sum(weights(codeword{index}==1)); code=bitset(code,len+1);codeword{index}=code;codelen(index)=len;endendcodeword=[codeword{:}]%盘算紧缩后的向量cols=length(string)/8;string=reshape(string,8,cols);weights=2.^(0:7);zipped=uint8(weights*double(string));%存储一个稀少矩阵huffcodes=sparse(1,1);% init sparse matrixfor index=1:numel(codeword),huffcodes(codeword(index),1)=simbols(index); end%产生信息构造体info.pad=pad;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}];endfunction vector=huff2norm(zipped,info)%HUFF2NORM Huffman 解码器%HUFF2NORM(X,INFO)依据信息体构造 info 返回向量 zipped 的解码成果%%矩阵参数以X(:)情势输入if~isa(zipped,'uint8'),error('input argument must be a uint8 vector')end%产生01序列len=length(zipped);string=repmat(uint8(0),1,len.*8);bitindex=1:8;for index+1:len,string(bitindex+8.*(index-1))=uint8(bitget(zipped(index),bitindex)); end%调剂字符串string=logical(string(:)');% remove 0 paddinglen=length(string);%解码weights=2.^(0:51);vector=repmat(uint8(0),1,info,length);vectorindex=1;codeindex=1;code=0;for index=1:len,code=bitset(code,codeindex,string(index));]codeindex=codeindex+1;byte=decode(bitset(code,codeindex),info);if byte>0,%vector(vectorindex)=byte-1;codeindex=1;code=0;vectorindex=vectorindex+1;endendfunction byte=decode(code,info)byte=info.huffcodes(code);function f=frequency(vector)%FREQUENCY 盘算元素消失概率if~isa(vector,'uint8'),error('input argument must be a uint8 vector') endf=repmat(0,1,256);%扫描向量len=length(vector);for index=0:256,%f(index+1)=sum(vector==uint8(index)); end%归一化f=f./len;。

huffman编码的matlab实现

huffman编码的matlab实现

%生成一个n-1行n列的数组
概率数组q进行从小至大的排序,并且用l数组返回一个数组,该数组表示概率数组q 排序前的顺序编号
%由数组l构建一个矩阵,该矩阵表明概率合并时的顺序,用于后面的编码
%将排序后的概率数组q的前两项,即概率最小的两个数加和,得到新的一组概率序列
end for i=1:n-1
%生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩阵用于进行huffman编码,并且在编 码中与a矩阵有一定的对应关系
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:)==j+1)-1)+1:n*find(a(ni+1,:)==j+1)) %矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一
个元素的位置在c矩阵中的编码值
end end for i=1:n
霍夫曼编码方法的具体过程是:首先把信源的各个输出符 号序列按概率递降的顺序排列起来,求其中概率最小的两个序 列的概率之和,并把这个概率之和看作是一个符号序列的概 率,再与其他序依概率递降顺序排列(参与求概率之和的这 两个序列不再出现在新的排列之中),然后,对参与概率求和 的两个符号序列分别赋予二进制数字0和1。继续这样的操作, 直到剩下一个以1为概率的符号序列。最后,按照与编码过程 相反的顺序读出各个符号序列所对应的二进制数字组,就可分 别得到各该符号序列的码字。
%完成huffman码字的分配
ind(a(1,:)==i)*n) %用h表示最后的huffman编码,矩阵h的第i行的元素对应于矩阵c的第一行的第i个元素
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

重庆交通大学信息科学与工程学院综合性设计性实验报告
专业班级:通信工程2012级1班
学号:************
*名:**
实验所属课程:信息论与编码
实验室(中心):软件与通信实验中心
****:***
2015年4月
霍夫曼编码的matlab实现
一、实验目的和要求。

利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输的时间,降低传输成本。

本实验用Matlab语言编程实现霍夫曼(Huffman)编码。

二、实验原理。

霍夫曼(Huffman)编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。

算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。

这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。

这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。

从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。

离散无记忆信源:
例如
U u
1u
2
u
3
u
4
u
5
P(U) = 0.4 0.2 0.2 0.1 0.1
通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼编码。

三、实验步骤
分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到霍夫曼编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵G中,位置索引存入矩阵Index中。

这样,由排序之后的概率矩阵G以及索引矩阵Index就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。

2、码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。

从索引矩阵M 的末行开始回溯。

(1) 在Index的末行2元素位置填入0和1。

(2) 根据该行索引1 位置指示,将索引1 位置的编码(‘1’)填入上一行的第一、第二元素位置,并在它们之后分别添加‘0’和‘1’。

(3) 将索引不为‘1’的位置的编码值(‘0’)填入上一行的相应位置(第
3 列)。

(4) 以Index的倒数第二行开始向上,重复步骤(1) ~(3),直到计算至Index 的首行为止。

四、程序代码:
%取得信源概率矩阵,并进行合法性判断
clear;
P=input('请输入信源概率向量P=');
N=length(P);
for component=1:1:N
if(P(component)<0)
error('信源概率不能小于0');
end
end
if((sum(P)-1)>0.0001)
error('信源概率之和必须为1');
end
%建立各概率符号的位置索引矩阵Index,利于编码后从树根进行回溯,从而得出对应的编码
Q=P
Index=zeros(N-1,N); %初始化Index
for i=1:N-1
[Q,L]=sort(Q);
Index(i,:)=[L(1:N-i+1),zeros(1,i-1)];
G(i,:)=Q;
Q=[Q(1)+Q(2),Q(3:N),1]; %将Q中概率最小的两个元素合并,元素不足的地方补1
end
%根据以上建立的Index矩阵,进行回溯,获取信源编码
for i=1:N-1
Char(i,:)=blanks(N*N);%初始化一个由空格符组成的字符矩阵N*N,用于存放编码
end
%从码树的树根向树叶回溯,即从G矩阵的最后一行按与Index中的索引位置的对应关系向其第一行进行编码
Char(N-1,N)='0';%G中的N-1行即最后一行第一个元素赋为0,存到Char中N-1行的N列位置
Char(N-1,2*N)='1';%G中的N-1行即最后一行第二个元素赋为1,存到Char中N-1行的2*N列位置
%以下从G的倒数第二行开始向前编码
for i=2:N-1
Char(N-i,1:N-1)=Char(N-i+1,N*(find(Index(N-i+1,:)==1))
-(N-2):N*(find(Index(N-i+1,:)==1)));
%将Index后一行中索引为1的编码码字填入到当前行的第一个编码位置
Char(N-i,N)='0'; %然后在当前行的第一个编码位置末尾填入'0'
Char(N-i,N+1:2*N-1)=Char(N-i,1:N-1); %将G后一行中索引为1的编码码字填入到当前行的第二个编码位置
Char(N-i,2*N)='1'; %然后在当前行的第二个编码位置末尾填入'1'
for j=1:i-1
%内循环作用:将Index后一行中索引不为1处的编码按照左右顺序填入当前行的第3个位置开始的地方,最后计算到Index的首行为止
Char(N-i,(j+1)*N+1:(j+2)*N)=Char(N-i+1,N*(find(Index(N-i+1,:)==j+1)-1 )+1:N*find(Index(N-i+1,:)==j+1));
end
end
%Char中第一行的编码结果就是所需的Huffman 编码输出,通过Index中第一行索引将编码对应到相应概率的信源符号上。

for i=1:N
Result(i,1:N)=Char(1,N*(find(Index(1,:)==i)-1)+1:find(Index(1,:)==i)* N);
end
%打印编码结果
String='信源概率及其对应的Huffman编码如下';
disp(String);disp(P);disp(Result);
五、对比分析,通过给给定不同的信源,对结果进行分析对比验证,并得出相应分分析报告。

以[0.1,0.2,0.3,0.2,0.1,0.1]为例:
运行程序,结果如下
以[0.3 0.3 0.2 0.1 0.1]为例:
运行程序,结果如下
分析:由上图可知程序已完成了Huffman编码的功能,但是霍夫曼编码是不唯一的.因为:信源符号合并中遇到最小概率相同的情况时可任意选择来做合并;在码树分配编码码字的时候1和0的位置可以是任意的。

六:提交实验报告。

1、在该实验的过程中,利用一个矩阵记录每次排序前概率的所在位置,是该实验的关键,在编码的过程中利用该矩阵就能比较容易进行huffman编码。

2、通过这个实验,对huffman编码的具体实现原理了解的更加深刻,在实验的过程中也遇到了一些问题,通过查找资料和相关书籍得到了解决,通过此次试验,了解了Huffman编码的特点,能够运用Huffman编码的基本原理及编码算法的来设计与实现程序。

收获颇多,为以后更进一步学习奠定了基础,总的来说,在完成该实验的过程中,学到了比较多的知识,包括使对一些matlab语句的掌握的更加熟练,完成一个算法必须要有一个整体的把握等等。

3、通过本次课程设计,我对二叉树和huffman编码树有了更深的了解,在做课程设计的过程中我掌握了二元huffman编码树的构造方法,哈夫曼编码是一种变长的编码方案。

它由最优二叉树既哈夫曼树得到编码,码元内容为到根结点的路径中与父结点的左右子树的标识。

所以哈夫曼在编码在数字通信中有着重要的意义。

可以根据信源符号的使用概率的高低来确定码元的长度。

既实现了信源的无失真地编码,又使得编码的效率最高。

相关文档
最新文档