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

合集下载

哈夫曼二进制编码过程

哈夫曼二进制编码过程

哈夫曼二进制编码过程(原创实用版)目录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等格式中都采用了哈夫曼编码来对数据进行压缩。

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

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

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

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

信息论实验报告(实验四、哈夫曼编码)

信息论实验报告(实验四、哈夫曼编码)
2、在分配码字长度时,首先将出现概率最小的两个符号的概率相加合成一个概率;
3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止;
4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为零,概率小的赋为1;
5、从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
“1”,小的概率赋“0”。
(3)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
(4)计算码字的平均码长得出最后的编码效率。
五、实验数据记录
六、实验结论与心得
通过本次实验,加强了对matlab程序的学习,进一步提高了我的编程能力。
如有侵权请联系告知删除,感谢你们的配合!
学生实验报告
院别
电子工程学院
课程名称
信息论与编码
班级
实验名称
实验四、哈夫曼编码
姓名
实验时间
学号
指导教师
成绩
报 告 内 容
一、实验目的和任务
1、理解信源编码的意义;
2、熟悉MATLAB程序设计;
3、掌握哈夫曼编码的方法及计算机实现;
4、对给定信源进行香农编码,并计算编码效率;
二、实验原理介绍
1、把信源符号按概率大小顺序排列,并设法按逆次序分配码字的长度;
三、实验设备介绍
1、计算机
2、编程软件MATLAB6.5以上
四、实验内容和步骤
对如下信源进行哈夫曼编码,并计算编码效率。
(1)计算该信源的信源熵,并对信源概率进行排序
(2)首先将出现概率最小的两个符号的概率相加合成一个概率,把这个合成概率与其他的概率进行组合,得到一个新的概率组合,重复上述做法,直到只剩下两个概率为止。之后再反过来逐步向前进行编码,每一次有两个分支各赋予一个二进制码。对大的概率赋

信息论与编码课程大作业

信息论与编码课程大作业

信息论与编码课程大作业
一、信源与信源编码
1、若信源包含N 个符号,在什么情况下熵最大?(10分)
最大的熵值是多少?(10分)
2、简述信源编码的两个作用。

(10分)
3、已知离散无记忆信源中各符号的概率空间为
X = 符号u1 u2 u3 u4
概率:1/2 1/4 1/8 1/8
(1)求信源的熵(10分);
(2)对其进行哈夫曼编码(要求码方差较小),写出过程(10分);
(3)求出平均码长和编码效率(10分)。

4、举出学过的无失真与限失真编码方法,各1种。

(10分)
并选择一种,阐述其在实际中的应用(不少于200字)。

(10分)
5、编程题(20分)
二、信道与信道编码
1、 对称信道容量公式?(10分)
在信源如何分布时达到信道容量?(10分)
2、信道编码的基本原理是什么?(10分)
3、对一个(4,2)码,其生成矩阵为
(1)写出伴随式译码表(10分);
(2)接收序列R=1100,估算发码(10分);
(3)判断码的检错能力(10分)。

4、举出两种常用的纠错码,(10分)
并选择一种,阐述其在实际中的应用(不少于200字)。

(10分)
5、编程题(20分)
说明:(1)按学号排列前30名同学完成信源与信源编码方面的作业,其余同学
完成信道与信道编码方面的作业。

(2)第5题编程题另付题目与具体要求,可在20道编程题中任选一道;
自己编写课程相关的其他程序也可以。

(3)第4题和第5题,任意两个同学不能雷同,否则均不能通过。

10010111G ⎡⎤=⎢⎥⎣⎦。

《信息论与编码》第5章哈夫曼编码

《信息论与编码》第5章哈夫曼编码
这棵树便是所求的哈夫曼树
哈夫曼编码

例:
假设用于通信的电文仅由4个字母{ a,d,i,n } 构成,它们 在电文中出现的概率分别为{ 2,7,5,4},试构建相应的哈 夫曼树,并为这4个字母进行哈夫曼编码

构建哈夫曼树 进行哈夫曼编码
按左分支为0、右分支为1的规则对哈夫曼树的左右分支 进行标记 将从根结点到叶子结点的路径上所有分支标记组成一个 代码序列
字母a的编码为110 字母n的编码为111
1
4 n
因此,在电文中出现频率 高的字母的编码相对短, 而出现频率低的字母的编 码相对长
111 字符编码表HC=((d,0),(i,10),(a,110),(n,111))
哈夫曼编码过程演示
编码 A1 A2 A3 0.23 0.21 0.18
1
0 1 0 1 0.10 0


进行哈夫曼编码 形成代码报文CC 输出
字符频度表W

哈 夫 曼 编 码 系 统 功 能 流 程
形成字符频度表
W
构建哈夫曼树
HT W
进行哈夫曼编码
HC
OC
形成代码报文
CC
原码报文中出现的不同符号个数和频率
代码报文CC
输出CC和W 返回开头
到哈夫曼译码系统
哈夫曼译码系统

来自哈夫曼编码系统 输入W、 CC

这个序列就是该叶子结点对应的字符的编码
哈夫曼编码
4个字母{ a,d,i,n } 在电文中出现的概率分别为{ 2,7,5,4}
字母d的编码为0
18 0
可见:
1
11 0 5
字母i的编码为10
7 d 0 i 10

哈夫曼编码信息论大作业汇总

哈夫曼编码信息论大作业汇总

哈夫曼编码1.前言:H affman算法是个简单而高效的贪心算法,主要用来创建最优二叉树.可以在通讯时,对于出现频率较高的字符,用较少的比特数便可以进行通讯.从而节省通讯线路的资源消耗。

该算法在各类数据结构, 算法,组合数学,离散数学,图论等主题的书籍中都有所涉及。

故本文不再赘述,本文致力于用Haffman算法实现压缩与解压缩,采用的语言为C语言,编译环境VC++6.0.下面给出[1]中实现的Haffman树的结构及创建算法,有两点说明:a) 这里的Haffman树采用的是基于数组的带左右儿子结点及父结点下标作为存储结点的二叉树形式,这种空间上的消耗带来了算法实现上的便捷。

b) 由于对于最后生成的Haffman树,其所有叶子结点均为从一个内部树扩充出去的,所以,当外部叶子结点数为m个时,内部结点数为m-1.整个Haffman树的需要的结点数为2m-1. 2压缩过程的实现:压缩过程的流程是清晰而简单的:1创建Haffman树à2打开需压缩文件à3将需压缩文件中的每个ascii码对应的haffman编码按bit单位输出à4文件压缩结束。

其中,步骤1和步骤3是压缩过程的关键。

a) 步骤1:这里所要做工作是得到Haffman数中各叶子结点字符出现的频率并进行创建. 统计字符出现的频率可以有很多方法:如每次创建前扫描被创建的文件,“实时”的生成各字符的出现频率;或者是创建前即做好统计.本文采用后一种的方案,统计了十篇不同的文章中字符出现的频率。

当前,也可以根据被压缩文件的特性有针对性的进行统计,如要压缩C语言的源文件,则可事先对多篇C语言源文件中出现的字符进行统计,这样,会创建出高度相对较“矮”的Haffman树,从而提高压缩效果。

创建Haffman树的算法前文已有陈述,这里就不再重复了。

b) 步骤3: 将需压缩文件中的每个ascii码对应的haffman编码按bit单位输出.这是本压缩程序中最关键的部分:这里涉及“转换”和“输出”两个关键步骤:“转换”部分大可不必去通过遍历Haffman树来找到每个字符对应的哈夫曼编码,可以将每个Haffman码值及其对应的ascii码存放于如下所示的结构体中:2.算术编码(1)算术编码是把一个信源表示为实轴上0和1之间的一个区间,信源集合中的每一个元素都用来缩短这个区间。

信息论实验信源的二元Huffman编码

信息论实验信源的二元Huffman编码
概率:0.18编码:111
概率:0.17编码:110
概率:0.01编码:1000
概率:0.15编码:101
概率:0.2编码:01
概率:0.19编码:00
概率:0.1编码:1001
平均码长为:2.72
编码效率为:0.959075
六.实验总结及心得体会
Huffman编码方法是《数据结构》课程中的一个重要内容,当时是用二叉树来实现的。在《信息论与编码》中,Huffman树的概念虽然提的很少,但整体思想仍然是相同的,因此编程过程还比较顺利。
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(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-1
q=p;%信源的概率赋给q,以便后面排序、合并用
m=zeros(n-1,n);%定义m为零数组,记录排列顺序(小概率求和后再重新排列,这就存在排序的问题)
for i=1:n-1
[q,k]=sort(q);%k是排列后的顺序,sort(q)是对q进行升序
m(i,:)=[k(1:n-i+1),zeros(1,i-1)];%概率小的相加之后重新排序,排列顺序记录在m矩阵中
if (length(find(p<0))~=0)
error('数组中概率有负的');%p概率为负拒绝编码
end
if (abs(sum(p)-1)>10e-10)

信息论与编码第五章答案

信息论与编码第五章答案

信息论与编码第五章答案本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March设信源1234567()0.20.190.180.170.150.10.01X a a a a a a a p X ⎡⎤⎧⎫=⎨⎬⎢⎥⎣⎦⎩⎭(1) 求信源熵H(X); (2) 编二进制香农码;(3) 计算平均码长和编码效率. 解: (1)721222222()()log ()0.2log 0.20.19log 0.190.18log 0.180.17log 0.170.15log 0.150.1log 0.10.01log 0.012.609/i i i H X p a p a bit symbol==-=-⨯-⨯-⨯-⨯-⨯-⨯-⨯=∑71()0.230.1930.1830.1730.1530.140.0173.141()()/ 2.609 3.14183.1%i i i K k p x H X H X K Rη===⨯+⨯+⨯+⨯+⨯+⨯+⨯====÷=∑对习题的信源编二进制费诺码,计算编码效率.对信源编二进制和三进制哈夫曼码,计算各自的平均码长和编码效率.解:x i p(x i)编码码字k i s61s50s41s30s21x10102 x21112 x300003 x410013 x500103 s11x6001104 x7101114x i p(x i)编码码字k i s31s20s11x1221 x20002 x31012 x42022 x50102 x61112x72122设信源(1) 求信源熵H(X);(2) 编二进制香农码和二进制费诺码;(3) 计算二进制香农码和二进制费诺码的平均码长和编码效率;(4) 编三进制费诺码;(5) 计算三进制费诺码的平均码长和编码效率;解:(1)(2)x i p(x i)p a(x i)k i码字x1010x2210x33110x441110x5511110x66111110x771111110x871111111xi p(x i)编码码字k i x1001 x210102 x3101103x41011104 x510111105x6101111106x71011111107x8111111117 (3)香农编码效率:费诺编码效率:(4)x i p(x i)编码码字k i x1001 x2111x320202x41212x5202203x612213x72022204x8122214设无记忆二进制信源先把信源序列编成数字0,1,2,……,8,再替换成二进制变长码字,如下表所示.(1) 验证码字的可分离性;(2) 求对应于一个数字的信源序列的平均长度;(3) 求对应于一个码字的信源序列的平均长度;(4) 计算,并计算编码效率;(5) 若用4位信源符号合起来编成二进制哈夫曼码,求它的平均码长,序列数字二元码字10100001110010013101000013101100001411000000015110100000016111000000001711110000000080一个来编写二进制哈夫曼码,求新符号的平均码字长度和编码效率.对题的信源进行游程编码.若“0”游程长度的截至值为16,“1”游程长度的截至值为8,求编码效率.选择帧长N = 64(1) 对00000000000000000000000000000000000000遍L-D码;(2) 对000000000010遍L-D码再译码;(3) 对000000000000000000000000000000000000000000000000000000000000000 0遍L-D码;(4) 对0遍L-D码;(5) 对上述结果进行讨论.。

信息论编码课程设计(用哈夫曼编码实现一个完整的压缩与解压程序)

信息论编码课程设计(用哈夫曼编码实现一个完整的压缩与解压程序)

课程设计任务书2011—2012学年第二学期专业:信息与计算科学学号:姓名:课程设计名称:信息论与编码课程设计设计题目:用哈夫曼编码实现一个完整的压缩与解压程序完成期限:自年月日至年月日共天一.设计目的1、深刻理解信源编码的基本思想与目的;2、理解哈夫曼编码方法的基本过程与特点;3、详细地理解文件的压缩与解压过程;4、提高综合运用所学理论知识独立分析和解决问题的能力;5、使用C语言进行编程。

二.设计内容假设已知一个文件内部所有的字符,编写适当函数,对其进行哈夫曼编码的编译,同时将其运用位操作进行压缩与解压,并且由其文件内字符长度的压缩和气原本长度进行计算,从而得出压缩率的大小。

三.设计要求1、编写的函数要有通用性;2、压缩的文件可以为任意文件,自由选择,并且解压其压缩后的文件显示其是否与原文件内容一致。

四.设计条件计算机、VC6.0编译环境五.参考资料李亦农、李梅《信息论基础教程》指导教师(签字):教研室主任(签字):批准日期:年月日哈夫曼编码(Huffman Coding)是一种编码方式,也是可变字长编码(VLC)的一种。

这种方法完全依据字符出现的概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作哈夫曼编码。

对于M进制哈弗曼编码,为了提高编码效率,就要使长码的符号数量尽量少、概率尽量小,所以应使合并的信源符号位于缩减信源序列尽可能高的位置上,以减少再次合并的次数,充分利用短码。

本文将采用利用二进制哈夫曼编码来进行文件的压缩与解压。

在二进制哈夫曼编码中,得出码字、平均码长和编码效率,构造哈夫曼树,沿着根节点到叶节点从左到右依次为0、1,并且码字的频率由大到小排序。

在本文中采用Visual C++6.0进行编程,此程序中具有输入字符集大小和权值大小,构造哈夫曼树,并对原本的文件进行编码等功能。

关键词:哈弗曼编码;信源;哈夫曼树;Visual C++6.0;1课题描述 (1)2设计原理 (1)3 设计过程 (2)3.1软件介绍 (2)3.1.1 Visual C++ 6.0简介 (2)3.1.2主要部分 (2)3.2设计内容 (2)4编码程序分析及其结果 (3)总结 (7)参考文献 (7)1课题描述在这个信息量爆炸的时代,凡是能载荷一定信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。

哈夫曼编码

哈夫曼编码

南京工程学院通信工程学院《信息论与编码》大作业课程名称信息论与编码学生班级电子信息121学生姓名顾健实验成绩评定指导教师签字年月日基于C++语言的哈夫曼(Haffman)编码哈夫曼(Haffman)编码是一种常用的压缩编码方法,是哈夫曼于1952年为压缩文本文件建立的。

它的基本原理是按照概率大小顺序排列信源符号,并设法按逆顺序分配码字字长,使编码的码字为可辨识的。

哈夫曼码是最佳码。

二进制哈夫曼码的编码步骤如下:(1) 将q 个信源符号按概率分布)(i s p 的大小,以递减次序排列起来,设q p p p p ≥•••≥≥≥321(2) 用0和1码符号分别代表概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个符号,从而得到只包含q-1个符号的新信源,称为S 信源的缩减信源1S 。

(3) 把缩减信源1S 的符号仍按概率大小以递减次序排列,再将最后两个概率最小的符号合并成一个符号,并分别用0和1码符号表示,这样又形成了q-2个符号的缩减信源2S 。

(4) 依此继续下去,直至最后只剩两个符号为止。

将这最后两个信源符号分别用0和1码符号表示。

然后从最后一级缩减信源开始,向前返回,就得出各信源符号所对应的码符号序列,即对应的码字。

下面举一个具体的Huffman 编码的例子(如图1所示):信源符号 概率 信源缩减过程 编码 码长1S 0.4 00 22S 0.2 10 2 3S 0.2 11 2 4S 010 3 5S 011 3 图1 Huffman 编码示例它的平均码长为)/(2.2305.0315.022.022.024.0)(51信源符号码符号=⨯+⨯+⨯+⨯+⨯=∑==i i i l s p L 信息熵为)/(08.2)log()(-)(51信源符号比特=∑==i i i s s p S H 编码效率为%5.94%1002.208.2)(=⨯==L S H η 哈夫曼编码方法得到的码并非是唯一的。

信息论大作业2课件

信息论大作业2课件

一、实验目的1、通过实验进一步理解霍夫曼编码、算术编码和LZ编码原理和方法2、熟悉matlab编程和GUI界面的设计二、实验原理1、赫夫曼(Huffman )编码是1952年提出的,是一种比较经典的信息无损熵编码,该编码依据变长最佳编码定理,应用Huffman 算法而产生。

Huffman 编码是一种基于统计的无损编码。

设信源X 的信源空间为:⎩⎨⎧∙)()()()(:)(::][32121N N x P x P x P x P X P x x x X P X 其中,1)(1=∑=Ni i x P ,现用二进制对信源X 中的每一个符号i x (i=1,2,…N)进行编码。

根据变长最佳编码定理,Huffman 编码步骤如下:(1)将信源符号xi 按其出现的概率,由大到小顺序排列。

(2)将两个最小的概率的信源符号进行组合相加,并重复这一步骤,始终将较大的概率分支放在上部,直到只剩下一个信源符号且概率达到1.0为止;(3)对每对组合的上边一个指定为1,下边一个指定为0(或相反:对上边一个指定为0,下边一个指定为1);(4)画出由每个信源符号到概率1.0处的路径,记下沿路径的1和0;(5)对于每个信源符号都写出1、0序列,则从右到左就得到非等长的Huffman 码。

Huffman 编码的特点是:(1)Huffman 编码构造程序是明确的,但编出的码不是唯一的,其原因之一是两个概率分配码字“0”和“1”是任意选择的(大概率为“0”,小概率为“1”,或者反之)。

第二原因是在排序过程中两个概率相等,谁前谁后也是随机的。

这样编出的码字就不是唯一的。

(2)Huffman 编码结果,码字不等长,平均码字最短,效率最高,但码字长短不一,实时硬件实现很复杂(特别是译码),而且在抗误码能力方面也比较差。

(3)Huffman 编码的信源概率是2的负幂时,效率达100%,但是对等概率分布的信源,产生定长码,效率最低,因此编码效率与信源符号概率分布相关,故Huffman 编码依赖于信源统计特性,编码前必须有信源这方面的先验知识,这往往限制了哈夫曼编码的应用。

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

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

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

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

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

1、2 二元霍夫曼编码规则(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:nif p(i)<0fprintf('\n The probabilities in huffman can not less than 0!\n');p=input('please input a number:') %如果输入的概率数组中有小于 0 的值,endendif abs(sum(p)-1)>0fprintf('\n The sum of the probabilities in huffman can more than 1!\n');p=input('please input a number:') %如果输入的概率数组总和大于 1,则重endq=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 的前两项,即概率最小的两endfor i=1:n-1c(i,1:n*n)=blanks(n*n);endc(n-1,n)='0'; %由于a矩阵的第n-1行的前两个元素为进行huffman编码加和运算时所得的最c(n-1,2*n)='1';for i=2:n-1c(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'; %根据之前的规则,在分支的第一个元素最后补 0c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='1'; %根据之前的规则,在分支的第一个元素最后补 1for j=1:i-1c(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));endend%完成 huffman 码字的分配for i=1:nh(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 编码的长度enddisp('二元霍夫曼编码平均码长')l=sum(p.*ll) %计算平均码长%fprintf('\n huffman code:\n');hdisp('信源熵')hh=sum(p.*(-log2(p))) %计算信源熵%fprintf('\n the huffman effciency:\n');disp('编码效率')t=hh/l %计算编码效率3、运行结果及分析当输入数据[,,,,,,,,]时3、1运行结果:please input a number:[,,,,,,,,] p =Columns 1 through 5Columns 6 through 9二元霍夫曼编码平均码长l =h =11101001110101111011111001111110001001信源熵hh =编码效率t =3、2分析:1、在哈弗曼编码的过程中,对缩减信源符号按概率有大到小的顺序重新排列,应使合并后的新符号尽可能排在靠前的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。

  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 软件的各种调试方法。

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

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

相关文档
最新文档