信息论与编码课程大作业二进制哈夫曼编码

合集下载

哈夫曼二进制编码过程

哈夫曼二进制编码过程

哈夫曼二进制编码过程(原创实用版)目录1.哈夫曼编码的定义和用途2.哈夫曼编码的过程3.哈夫曼编码的优点4.哈夫曼编码的应用实例正文哈夫曼编码是一种无损数据压缩编码方法,主要用于将原始数据转换为更小的二进制表示,从而实现数据压缩。

它是由美国计算机科学家David A.Huffman 在 1952 年提出的,因此也被称为哈夫曼编码。

哈夫曼编码被广泛应用于数据压缩、图像压缩、音频压缩等领域。

哈夫曼编码的过程主要包括两个步骤:第一步是构造哈夫曼树,第二步是利用哈夫曼树生成哈夫曼编码。

构造哈夫曼树的过程如下:1.将原始数据中的每个字符出现的频率作为权值,将所有权值放入一个哈希表中,并按照权值大小进行排序。

2.从权值最小的两个节点开始,将它们合并为一个新的节点,并将新节点的权值设为两个节点权值之和。

然后将新节点放回哈希表中,并重新排序。

3.重复第二步,直到哈希表中只剩下一个节点,这个节点就是哈夫曼树的根节点。

4.从根节点到每个叶子节点的路径代表一个字符的哈夫曼编码,其中左子节点的边表示 0,右子节点的边表示 1。

利用哈夫曼树生成哈夫曼编码的过程如下:1.从哈夫曼树的根节点开始,沿着一条路径到达某个叶子节点,将路径上的 0 和 1 按照顺序拼接起来,得到一个字符的哈夫曼编码。

2.对哈夫曼树中的每个叶子节点进行同样的操作,得到所有字符的哈夫曼编码。

哈夫曼编码的优点主要有以下几点:1.哈夫曼编码是无损压缩,即压缩后的数据可以完全还原原始数据。

2.哈夫曼编码的压缩效果较好,对于出现频率较高的字符,压缩后的编码较短;对于出现频率较低的字符,压缩后的编码较长。

3.哈夫曼编码的编码和解码过程都比较简单,易于实现和操作。

哈夫曼编码的应用实例包括:1.文本压缩:将文本数据转换为哈夫曼编码,可以大大减少存储空间和传输时间。

2.图像压缩:将图像中的每个像素的颜色值转换为哈夫曼编码,可以减少图像的数据量。

信息论与编码课程设计--统计信源熵与哈夫曼编码

信息论与编码课程设计--统计信源熵与哈夫曼编码

信息论与编码课程设计--统计信源熵与哈夫曼编码信息论与编码课程设计信息论与编码课程设计报告设计题目:统计信源熵与哈夫曼编码专业班级学号学生姓名指导教师教师评分2015年 3 月 25 日1信息论与编码课程设计目录一、设计任务与要求...................................................................... ...........................................3 二、设计思路...................................................................... .......................................................3 三、设计流程图...................................................................... (5)四、程序运行及结果...................................................................... ...........................................6 五、心得体会...................................................................... . (8)参考文献...................................................................... (9)附录:源程序...................................................................... .. (10)2信息论与编码课程设计一、设计任务与要求1.1设计目的信息论与编码是信息、通信、电子工程专业的基础,对理论研究和工程应用均有重要的作用。

信息论课程实验报告—哈夫曼编码

信息论课程实验报告—哈夫曼编码
else if(T[j].weight < T[*p2].weight)
*p2 = j;
}
}
void CreateHuffmanTree(HuffmanTree T)
{
int i,p1,p2;
InitHuffmanTree(T);
InputWeight(T);
for(i = n;i < m;i++)
4)依次继续下去,直至信源最后只剩下两个信源符号为止,将这最后两个信源符号分别用二元码符号“0”和“1”表示;
5)然后从最后—级缩减信源开始,进行回溯,就得到各信源符号所对应的码符号序列,即相应的码字。
四、实验目的:
(1)进一步熟悉Huffman编码过程;(2)掌握C语言递归程序的设计和调试技术。以巩固课堂所学编码理论的知识。
#include "stdio.h"
#include "stdlib.h"
#include <float.h>
#include <math.h>
#define n 8
#define m 2*n-1
typedef struct
{
float weight;
int lchild,rchild,parent;
}
}
void InputWeight(HuffmanTree T)
{
float temp[n] = {0.20,0.18,0.17,0.15,0.15,0.05,0.05,0.05};
for(int i = 0;i < n;i++)
T[i].weight = temp[i];
}

信息论与编码第五章习题参考答案

信息论与编码第五章习题参考答案

5.1某离散无记忆信源的概率空间为采用香农码和费诺码对该信源进行二进制变长编码,写出编码输出码字,并且求出平均码长和编码效率。

解:计算相应的自信息量1)()(11=-=a lbp a I 比特 2)()(22=-=a lbp a I 比特 3)()(313=-=a lbp a I 比特 4)()(44=-=a lbp a I 比特 5)()(55=-=a lbp a I 比特 6)()(66=-=a lbp a I 比特 7)()(77=-=a lbp a I 比特 7)()(77=-=a lbp a I 比特根据香农码编码方法确定码长1)()(+<≤i i i a I l a I平均码长984375.164/6317128/17128/1664/1532/1416/138/124/112/1L 1=+=⨯+⨯+⨯+⨯+⨯+⨯+⨯+⨯=由于每个符号的码长等于自信息量,所以编码效率为1。

费罗马编码过程5.2某离散无记忆信源的概率空间为使用费罗码对该信源的扩展信源进行二进制变长编码,(1) 扩展信源长度,写出编码码字,计算平均码长和编码效率。

(2) 扩展信源长度,写出编码码字,计算平均码长和编码效率。

(3) 扩展信源长度,写出编码码字,计算平均码长和编码效率,并且与(1)的结果进行比较。

解:信息熵811.025.025.075.075.0)(=--=lb lb X H 比特/符号 (1)平均码长11=L 比特/符号编码效率为%1.81X)(H 11==L η(2)平均码长为84375.0)3161316321631169(212=⨯+⨯+⨯+⨯=L 比特/符号 编码效率%9684375.0811.0X)(H 22===L η(3)当N=4时,序列码长309.3725617256362563352569442569242562732562732256814=⨯+⨯+⨯⨯+⨯⨯+⨯⨯+⨯+⨯⨯+⨯=L平均码长827.04309.34==L %1.98827.0811.0X)(H 43===L η可见,随着信源扩展长度的增加,平均码长逐渐逼近熵,编码效率也逐渐提高。

信息论与编码大作业

信息论与编码大作业
信息论的创始人是美国数学家香农(1916-)。1948年,他发表了一篇论文"通讯的数学理论"。他认为,"通信的基本问题就是精确地或近似地在一点复现另一点选择的信号",通信就是将信息由发信者传给受信者。他提出了通信系统的随机模型,把许多复杂的通信机构简化为由信源、编码、信道、噪声、译码及信宿组成的一个信息系统。申农这一通信模型,不仅适用于技术系统,而且可以推广到生命和社会系统,具有普遍意义。

当前信息论发展日新月异,目前,世界正在谈论三种前沿科学,即生命科学、材料科学和信息科学。信息论是信息科学的理论基础,现在的人们虽然不通晓信息论,但是,在日常生活中的谈话、书信、报纸、书籍、电影、电话、电报、电视、电子计算机……都是信息传输和处理的方式。随着信息革命和信息科学的发展,信息技术(指通信、计算机和控制)的研究和使用,信息论研究范畴远远超出了通信及类似的学科,从一般认为“信息论即通信理论”的认识延伸到像生物学、生理学、人类学、物理学、化学、电子学、语言学、经济学和管理学等学科。人类社会正在走向一个以充分发挥人的创造力和创新精神,以智能、知识为核心的高度发展的信息社会。
左分支表示字符'0',右分支表示字符'1',则可以根结点到叶结点的路径上分支字符组成的串作为该叶结点的字符编码。因此可得到字符A、B、C、D的二进制前缀编码分别:0、10、110、111。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长为∑WiLi。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,∑WiLi恰好为二叉树上带权路径长度。因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵霍夫曼树,此构造过程称为霍夫曼编码。

进制哈夫曼编码

进制哈夫曼编码
哈夫曼码是最佳码。
下午12时51分
11
5.4 哈夫曼(Huffman)编码
m进制哈夫曼编码
二进制哈夫曼的编码方法可以很容易推广到m进 制的情况。只是编码过程中构成缩减信源时,每 次都是将m个概率最小的符号合并,并分别用 0,1,…,m-1码符号表示。
为使平均码长最短,必须使最后一步缩减信源有 m个信源符号。如果第一步给概率最小的符号分 配码元时,所取的符号数就不一定是m个。
3
5.4 哈夫曼(Huffman)编码(例1续)
0.20 0.20 0.26 0.35 0.39 0.610 1.0 0.19 0.19 0.20 0.26 0.35 0 0.391 0.18 0.18 0.19 0.20 0 0.26 1 0.17 0.17 0.180 0.19 1 0.15 0.15 0 0.171 0.100 0.11 1 0.01 1
码字。 后来新加的概率为零的符号,虽也赋予码字,实际上这是冗余码字,
并未用上,但这样编成的码,仍是最佳的,也就是平均码长最短,如 果等概率符号排队时注意到顺序,则码长的方差也是最小的。
下午12时51分
14
m进制哈夫曼编码-例1
设单符号离散无记忆信源如下,对信源编三进制 哈夫曼码。
X p(xi
第一种方法码树图
下午12时51分
第二种方法码树图
9
5.4 哈夫曼(Huffman)编码(例2续)
7
两 种 方 法 的 平 均 码 长 相等 :K p(xi )Ki 2.2码 元/符 号 i 1
两 种 编 码 方 法 的 编 码 效率 相 等 : H ( X ) 96.5%
K
码字长度的方差:
对信源进行缩减时,两个概率最小的符号合并后的概率与其它信源符 号的概率相同时,这两者在缩减信源中进行概率排序,其位置放置次 序是可以任意的,故会得到不同的哈夫曼码。此时将影响码字的长度, 一般将合并的概率放在上面,这样可获得较小的码方差。

信息论与编码课程作业_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五:设计新得体会:通过这学期对信息论和编码的学习,以及这次的设计,使我了解了很多东西,也使以前所学的知识得以巩固!,通过这次的设计,进一步学习了离散信源平均信息量、平均码长和压缩比的计算方法。

哈夫曼编码方式对字母进行不定长的二进制编码

哈夫曼编码方式对字母进行不定长的二进制编码

哈夫曼编码方式对字母进行不定长的二进制编码哈夫曼编码是一种常用于数据传输和数据压缩的编码方式。

它可以对不同的符号(比如字母或者其他字符)进行不定长的二进制编码,从而实现高效的数据压缩。

在这篇文章中,我将会对哈夫曼编码进行深入的探讨,从原理到应用,让你更全面地了解这一编码方式的重要性和价值。

在介绍哈夫曼编码前,我们先来了解一下传统的固定长度编码和变长编码。

固定长度编码是将每个符号都用固定长度的二进制序列表示,比如ASCII码就是一种固定长度编码方式。

这种编码方式的缺点是不适合对出现频率不同的符号进行编码,会浪费大量的存储空间。

而变长编码则可以根据符号的出现频率来灵活地进行编码,从而实现更高效的数据压缩。

哈夫曼编码就是一种典型的变长编码方式,它是由大卫·哈夫曼在1952年提出的。

在哈夫曼编码中,根据符号出现的频率不同,使用不同长度的二进制序列表示。

出现频率高的符号对应较短的二进制序列,而出现频率低的符号对应较长的二进制序列。

这样一来,可以实现对数据进行高效压缩,减少存储空间的占用。

哈夫曼编码的原理非常巧妙,通过构建哈夫曼树来实现对符号的编码。

在构建哈夫曼树的过程中,首先将所有的符号按照出现频率进行排序,然后将出现频率最低的两个符号合并为一个新的符号,其出现频率为两者之和。

不断重复这个过程,直到所有的符号都被合并在一棵树中。

哈夫曼树的叶子节点就对应着每个符号及其对应的二进制编码。

通过哈夫曼编码,我们可以实现对数据的高效压缩。

这种编码方式在通信和存储领域有着广泛的应用,比如在JPEG、MP3等格式中都采用了哈夫曼编码来对数据进行压缩。

这不仅可以节省存储空间,还可以提高数据传输的效率,是一种非常重要和实用的编码方式。

从个人的角度来看,我认为哈夫曼编码是一种非常巧妙和高效的编码方式。

它充分利用了符号出现频率的特点,实现了对数据的高效压缩,为数据传输和存储提供了重要的技术支持。

哈夫曼编码的应用领域非常广泛,可以说几乎涵盖了所有需要数据压缩的领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息论与编码课程大作业
题目:二进制哈夫曼编码
学生姓名:
学号:**********
专业班级: 2010级电子信息班
2013年5月18日
二进制哈夫曼编码
1、二进制哈夫曼编码的原理及步骤
1、1信源编码的计算
设有N 个码元组成的离散、无记忆符号集,其中每个符号由一个二进制码字表示,信源符号个数n 、信源的概率分布P={p(s i )},i=1,…..,n 。

且各符号xi 的以li 个码元编码,在变长字编码时每个符号的平均码长为∑==n
i li xi p L 1)( ;
信源熵为:)(log )()(1
xi p xi p X H n
i ∑=-= ;
唯一可译码的充要条件:11
≤∑=-n
i Ki m ;
其中m 为码符号个数,n 为信源符号个数,Ki 为各码字长度。

构造哈夫曼数示例如下图所示。

1、 (1)将信源符号依出现概率递减顺序排序。

(2)给两个概率最小的信源符号各分配一个码位“0”和“1”,将两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结
果得到一个只包含(n-1)个信源符号的新信源。

称为信源的第一次缩减信源,用s1 表示。

(3)将缩减信源 s1 的符号仍按概率从大到小顺序排列,重复步骤(2),得到只含(n-2)个符号的缩减信源s2。

(4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号的概率之和必为 1,然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。

1、3 二元哈夫曼编码流程图如下图所示。

2、二元哈夫曼编码程序
p=input('please input a number:') %提示输入界面
n=length(p);
for i=1:n
if p(i)<0
fprintf('\n The probabilities in huffman can not less than 0!\n');
p=input('please input a number:') %如果输入的概率数组中有小于 0 的值,
end
end
if abs(sum(p)-1)>0
fprintf('\n The sum of the probabilities in huffman can more than 1!\n');
p=input('please input a number:') %如果输入的概率数组总和大于 1,则重
end
q=p;
a=zeros(n-1,n); %生成一个 n-1 行 n 列的数组
for i=1:n-1
[q,l]=sort(q); %对概率数组q进行从小至大的排序,并且用l数组返回一个q排序前的顺序编号a(i,:)=[l(1:n-i+1),zeros(1,i-1)]; %由数组 l 构建一个矩阵,该矩阵表明概率合并
q=[q(1)+q(2),q(3:n),1]; %将排序后的概率数组 q 的前两项,即概率最小的两
end
for i=1:n-1
c(i,1:n*n)=blanks(n*n);
end
c(n-1,n)='0'; %由于a矩阵的第n-1行的前两个元素为进行huffman编码加和运算时所得的最
c(n-1,2*n)='1';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(a(n-i+1,:)==1))-(n-2):n*(find(a(n-i+1,:)==1)));
c(n-i,n)='0'; %根据之前的规则,在分支的第一个元素最后补 0
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='1'; %根据之前的规则,在分支的第一个元素最后补 1
for j=1:i-1
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(n-i+1,:)==j+ 1));
end
end%完成 huffman 码字的分配
for i=1:n
h(i,1:n)=c(1,n*(find(a(1,:)==i)-1)+1:find(a(1,:)==i)*n);
ll(i)=length(find(abs(h(i,:))~=32)); %计算每一个 huffman 编码的长度
end
disp('二元霍夫曼编码平均码长')
l=sum(p.*ll) %计算平均码长
%fprintf('\n huffman code:\n');
h
disp('信源熵')
hh=sum(p.*(-log2(p))) %计算信源熵
%fprintf('\n the huffman effciency:\n');
disp('编码效率')
t=hh/l %计算编码效率
3、运行结果及分析
当输入数据[0.01,0.02,0.03,0.04,0.10,0.15,0.20,0.25,0.20]时3、1运行结果:
please input a number:[0.01,0.02,0.03,0.04,0.10,0.15,0.20,0.25,0.20]
p =
Columns 1 through 5
0.0100 0.0200 0.0300 0.0400 0.1000
Columns 6 through 9
0.1500 0.2000 0.2500 0.2000
二元霍夫曼编码平均码长
l =
2.7400
h =
1110100
1110101
111011
11100
1111
110
00
10
01
信源熵
hh =
2.6883
编码效率
t =
0.9811
3、2分析:
1、在哈弗曼编码的过程中,对缩减信源符号按概率有大到小的顺序重新排列,应使合并后的新符号尽可能排在靠前的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。

2、哈弗曼编码效率相当高,对编码器的要求也简单得多。

3、哈弗曼它保证了信源概率大的符号对应于短码,概率小的符号对应于长码,每次缩减信源的最后两个码字总是最后一位码元不同,前面的各位码元都相同,每次缩减信源的最长两个码字有相同的码长。

4、哈弗曼的编法并不一定是唯一的。

4、体会
此次设计用matlab编程实现哈夫曼对信源无失真编码。

由于课本知识点的不太理解,一点都不知道编码的过程,后来通过阅读<<信息论与编码>>课本、网上查阅资料,最后才对本次设计有了一定的理解,详细理解了哈夫曼的具体编码过程。

经过理解,发现这种编码其实挺简单的,最重要的是怎样用程序把他实现,这对我们的编程能力也是一次考验。

设计要求中要求计算信源熵,这又考察了现代通信原理的知识。

所以这次设计所设计的知识面广,有利于我们对相关知识进一步加深、巩固。

更加深刻的感觉到哈夫曼编码能够大大提高通信的效率通过这次设计,让我明白,在平时的学习中,对于每一个知识点都不能一知半解,否则在具体的实际运用中就会现“原形”。

比如这次哈夫曼编码,如果我们只读一下它的编码过程的步骤,不实际举一个例子来验证,我们就很有可能在很多地方犯错。

所以需要我们在阅读课本的时候还要仔细思考课本有关编码的示例,这对于我们掌握课本知识尤其重要的。

这次设计编程的思路,编辑,调试等让我明白编程时一定要保持清醒的头脑,有严谨的思维才能将实验要求实现得完整;调试过程会发现很多问题,这时不能烦躁,要耐心的去发现问题,不断掌握matlab 软件的各种调试方法。

此次的实践又是对我的一次警醒,要有认真的态度,才有
可能做好每一件事的!最后非常感谢一直给我教导的老师和帮助同学们,他们的支持和鼓励让我在遇到挫折时能够战胜它,也让我成功了完成了这次课程设计。

今后我要更加努力的学习专业知识,提高自我的能力!。

相关文档
最新文档