哈夫曼编码c实现

上传人:M****1 文档编号:470759500 上传时间:2024-01-23 格式:DOC 页数:19 大小:175KB
返回 下载 相关 举报
哈夫曼编码c实现_第1页
第1页 / 共19页
哈夫曼编码c实现_第2页
第2页 / 共19页
哈夫曼编码c实现_第3页
第3页 / 共19页
哈夫曼编码c实现_第4页
第4页 / 共19页
哈夫曼编码c实现_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《哈夫曼编码c实现》由会员分享,可在线阅读,更多相关《哈夫曼编码c实现(19页珍藏版)》请在金锄头文库上搜索。

1、 中南大学信息论编码实验报告 专业班级:电子信息1002指导老师:赵颖姓名:付永军学号:0909100707 目录一.实验目的3二、实验内容3三、实验原理41.1使用matlab 实现香农码编码。41.2、使用matlab 实现Huffman 编码.72.1、使用C+实现香农码编码101)香农编码原理102)编码步骤102.2、使用C+实现Huffman 编码14四实验结果17一.实验目的 1. 掌握香农码和 Huffman 编码原理和过程。2. 熟悉 matlab 软件的基本操作,练习使用matlab 实现香农码和Huffman编码。3. 熟悉 C/C+语言,练习使用C/C+实现香农码和Hu

2、ffman 编码。4. 应用 Huffman 编码实现文件的压缩和解压缩。二、实验内容1、使用matlab 实现香农码和Huffman 编码,并自己设计测试案例。2、使用CC+实现香农码和Huffman 编码,并自己设计测试案例。3、可以用任何开发工具和开发语言,尝试实现Huffman 编码应用在数据文件的压缩和解压缩中,并自己设计测试案例。三、实验原理1.1使用matlab 实现香农码编码。 编程方法:据课本上的介绍编码香农码的方法。首先,给定信源符号概率,要先判断信源符号概率是否满足概率分布,即各概率之和是否为1,如果不为1就没有继续进行编码的必要,虽然任可以正常编码,但编码失去了意义。其

3、次,对信源符号概率进行从小到大的排序,以便进行下一步。从第一步就知道信源符号的个数n,于是构造一个nx4的零矩阵D,以便储存接下来运算的结果。把排好序的信源符号概率以列的形式赋给D的第一列。再次,做编码的第二步,求信源符号概率的累加概率(方法见程序),用来编写码字。接着求各信源符号概率对应的自信息量,用于求解码长k。然后,我们对刚求的自信息量对无穷方向取最小正整数,得到的最小正整数就是该信源符号所对应编码的码长k,有了码长,接下来就可以求解码字。最后,对所求到的累加概率求其二进制,取其小数点后的数,所取位数由该信源符号对应的码长决定,所用的步骤结束,依次得到各信源符号的香农编码。程序展现:cl

4、c;clear;A=0.4,0.3,0.1,0.09,0.07,0.04;A=fliplr(sort(A);%降序排列m,n=size(A);for i=1:n B(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1)/2;for k=1:n-1 if abs(sum(B(1:k,1)-a)=abs(sum(B(1:k+1,1)-a) break; endendfor i=1:n%生成B第2列的元素 if i=k B(i,2)=0; else B(i,2)=1; endend%生成第一次编码的结果END=B(:,2);END=sym(END);%生成第3列及以

5、后几列的各元素j=3;while (j=0) p=1; while(p=n) x=B(p,j-1); for q=p:n if x=-1 break; else if B(q,j-1)=x y=1; continue; else y=0; break; end end end if y=1 q=q+1; end if q=p|q-p=1 B(p,j)=-1; else if q-p=2 B(p,j)=0; END(p)=char(END(p),0; B(q-1,j)=1; END(q-1)=char(END(q-1),1; else a=sum(B(p:q-1,1)/2; for k=p:q-

6、2 if abs(sum(B(p:k,1)-a)=abs(sum(B(p:k+1,1)-a); break; end end for i=p:q-1 if i在输入的概率矩阵p正确的前提条件下,对p进行排序,并用矩阵L记录p排序之前各元素的顺序,然后将排序后的概率数组p的前两项,即概率最小的两个数加和,得到新的一组概率序列,重复以上过程,最后得到一个记录概率加和过程的矩阵p以及每次排序之前概率顺序的矩阵a。2新生成一个n-1行n列,并且每个元素含有n个字符的空白矩阵,然后进行huffman编码: 将c矩阵的第n-1行的第一和第二个元素分别令为0和1(表示在编码时,根节点之下的概率较小的元素后补

7、0,概率较大的元素后补1,后面的编码都遵守这个原则) 然后对n-i-1的第一、二个元素进行编码,首先在矩阵a中第n-i行找到值为1所在的位置,然后在c矩阵中第n-i行中找到对应位置的编码(该编码即为第n-i-1行第一、二个元素的根节点),则矩阵c的第n-i行的第一、二个元素的n-1的字符为以上求得的编码值,根据之前的规则,第一个元素最后补0,第二个元素最后补1,则完成该行的第一二个元素的编码, 最后将该行的其他元素按照“矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值”的原则进行赋值,重复以上过程即可完成huffman编码。3计

8、算信源熵和平均码长,其比值即为编码密码效率。程序展现p=input(please input a number:) %提示输入界面n=length(p);for i=1:n if p(i)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进行从小至大的排

9、序,并且用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); %生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩阵用于进行huffman编码,并且在编码中与a矩阵有一定的对应关系end c(n-1,n)=0; %由于a矩阵的第n-1行的前两个元素为进

10、行huffman编码加和运算时所得的最c(n-1,2*n)=1; 后两个概率,因此其值为0或1,在编码时设第n-1行的第一个空白字符为0,第二个空白字符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-1的字符赋值为对应于a矩阵中第n-i+1行中值为1的位置在c矩阵中的编码值 c(n-i,n)=0 %根据之前的规则,在分支的第一个元素最后补0 c(n-i,n+1:2*n-1)=c(n-i,1:n-1) %矩阵c的第n-i的第二个元素的n-1的字符与第n-i行的第一个元素的前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,:)=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号