信息论霍夫曼编码

合集下载

霍夫曼编码译码信息论实验C语言

霍夫曼编码译码信息论实验C语言
BuildTree(); //建树
HufmCode(DataBuf,FileLen); //编码
HufmDCode(CodeBuf,CodeLen); //译码
//printf("%d",FileLen/3);
///// 输出码本文件和压缩率
for (int j=0;j<*(CodeBook+i*(leafnode+1)+1);j++)
{
printf("%d",*(CodeBook+i*(leafnode+1)+2+j));
fprintf(fp2,"%d",*(CodeBook+i*(leafnode+1)+2+j));
}
else
{
p2 = p1;
w2 = w1; p1 来自 i; w1 = htree[i].weit;
}
break;
}
}
}
for (i=0;i<totalnode;i++)
void BuildTree();
void HufmCode(unsigned char *DataBuf,int FileLen);
void HufmDCode(unsigned char *CDataBuf,int CDataLen);
int main()
{
FILE *fp1,*fp2,*fp3,*fp4; //文件读取指针
}
puts("\n");
fprintf(fp2,"\n");

信息论与编码题库及答案

信息论与编码题库及答案

信息论与编码题库及答案信息论是一门关于信息传输和处理的学科,主要研究信息的传输、存储与处理,以及在信息传输过程中可能产生的各种噪声和干扰。

信息论在近年来得到了广泛的应用,尤其在计算机科学、通信工程、数据处理以及加密技术等领域中得到了广泛应用。

作为信息处理学科的一个分支,编码学是信息论中重要的研究领域之一,主要研究在信息传输的过程中如何将信息进行编码,并在保证高可靠性的同时减少信息传输的开销。

现代编码学研究所涉及到的内容非常广泛,包括错误检测、纠正编码、信息压缩以及密码学等领域。

为了帮助广大信息与通信工程学习者更好地掌握编码理论及其应用,以下总结了一些编码学的题库及答案,供大家参考。

一、错误检测编码1. 什么是奇偶校验码?答:奇偶校验码是一种简单的错误检测编码方式,它采用了消息的一位奇偶性作为编码方式。

具体而言,对于一组位数固定的二进制数,在其中加入一个附加位,使得这组数的位数为偶数。

然后将这些二进制数按照某种规则排列,例如相邻的两位组成一组,计算每组中1的个数。

如果某组中1的个数是偶数,则附加位赋值为0,否则为1。

这样,如果在传输的过程中数据出现了单一位的错误,则会被检测出来。

2. 什么是海明编码?答:海明编码是一种通过添加校验位来实现错误检测和纠正的编码方式。

在海明编码中,校验位的数目为2的k次幂个,其中k 表示数据位中最大1的位置数。

具体而言,将原始信息看作一组二进制数,再将这些数按照某种规则排列,然后按照一定的算法计算出每个校验位的值,并将这些值添加到原始信息中。

在传输的过程中,如果发现了错误的位,则可以通过一系列错误检测和纠正的操作来确定和修复出错的信息位。

二、信息压缩编码1. 什么是霍夫曼编码?答:霍夫曼编码是一种基于无损数据压缩的编码方式,它的特点是可以将原始信息中出现最频繁的字符用最短的二进制码来表示,同时将出现次数较少的字符用较长的二进制码来表示。

具体来说,霍夫曼编码首先对原始信息中的字符进行统计,确定每个字符出现的频率。

信息论霍夫曼、香农-费诺编码

信息论霍夫曼、香农-费诺编码

信息论霍夫曼、香农-费诺编码LT二、实验原理:1、香农-费诺编码首先,将信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号。

依次下去,直至每一个小组只剩下一个信源符号为止。

这样,信源符号所对应的码符号序列则为编得的码字。

译码原理,按照编码的二叉树从树根开始,按译码序列进行逐个的向其叶子结点走,直到找到相应的信源符号为止。

之后再把指示标记回调到树根,按照同样的方式进行下一序列的译码到序列结束。

如果整个译码序列能够完整的译出则返回成功,否则则返回译码失败。

2、霍夫曼编码霍夫曼编码属于码词长度可变的编码类,是霍夫曼在1952年提出的一种编码方法,即从下到上的编码方法。

同其他码词长度可变的编码一样,可区别的不同码词的生成是基于不同符号出现的不同概率。

生成霍夫曼编码算法基于一种称为“编码树”(coding tree)的技术。

算法步骤如下:(1)初始化,根据符号概率的大小按由大到小顺序对符号进行排序。

(2)把概率最小的两个符号组成一个新符号(节点),即新符号的概率等于这两个符号概率之和。

(3)重复第2步,直到形成一个符号为止(树),其概率最后等于1。

(4)从编码树的根开始回溯到原始的符号,并将每一下分枝赋值为1,上分枝赋值为0。

三、实验环境matlab7.1四、实验内容1、对于给定的信源的概率分布,用香农-费诺编码实现图像压缩2、对于给定的信源的概率分布,用霍夫曼编码实现图像压缩五、实验过程1.香农-费诺编码编码1function c=shannon(p)%p=[0.2 0.15 0.15 0.1 0.1 0.1 0.1 0.1] %shannon(p)[p,index]=sort(p)p=fliplr(p)n=length(p)pa=0for i=2:npa(i)= pa(i-1)+p(i-1) endk=ceil(-log2(p))c=cell(1,n)for i=1:nc{i}=”tmp=pa(i)for j=1:k(i)tmp=tmp*2if tmp>=1tmp=tmp-1 c{i(j)='1'elsec{i}(j) = '0' endendendc = fliplr(c)c(index)=c编码2clc;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:nB(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1))/2;for k=1:n-1ifabs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1, 1))-a)break;endendfor i=1:n%生成B第2列的元素if i<=kB(i,2)=0;elseB(i,2)=1;endend%生成第一次编码的结果END=B(:,2)';END=sym(END);%生成第3列及以后几列的各元素j=3;while (j~=0)p=1;while(p<=n)x=B(p,j-1);for q=p:nif x==-1break;elseif B(q,j-1)==xy=1;continue;elsey=0;break;endendif y==1q=q+1;endif q==p|q-p==1B(p,j)=-1;elseif q-p==2B(p,j)=0;END(p)=[char(END(p)),'0'];B(q-1,j)=1;END(q-1)=[char(END(q-1)),'1']; elsea=sum(B(p:q-1,1))/2;for k=p:q-2abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1, 1))-a);break;endendfor i=p:q-1if i<=kB(i,j)=0;END(i)=[char(END(i)),'0'];elseB(i,j)=1;END(i)=[char(END(i)),'1'];endendendendendC=B(:,j);D=find(C==-1);[e,f]=size(D);if e==nj=0;elsej=j+1;endendBAENDfor i=1:n[u,v]=size(char(END(i))); L(i)=v;avlen=sum(L.*A)2. 霍夫曼编码function c=huffman(p)n=size(p,2)if n==1c=cell(1,1)c{1}=''returnend[p1,i1]=min(p)index=[(1:i1-1),(i1+1:n)] p=p(index)n=n-1[p2,i2]=min(p)index2=[(1:i2-1),(i2+1:n)] p=p(index2);i2=index(i2)index=index(index2)p(n)=p1+p2c=huffman(p)c{n+1}=strcat(c{n},'1')c{n}=strcat(c{n},'0') index=[index,i1,i2]c(index)=c。

Huffman霍夫曼编码

Huffman霍夫曼编码

霍夫曼编码的局限性


利用霍夫曼编码,每个符号的编码长度只能 为整数,所以如果源符号集的概率分布不是 2负n次方的形式,则无法达到熵极限。 输入符号数受限于可实现的码表尺寸 译码复杂 需要实现知道输入符号集的概率分布 没有错误保护功能
尾码为DIFF的B位
原码,若DIFF0 反码,若DIFF0

按此规则,当DIFF0时,尾码的最高位是“1”; 而当DIFF0时则为“0”。解码时则可借此来判断 DIFF的正负。 书中例4—9
自适应霍夫曼编码提出的目的和意义:
在静态霍夫曼编码中,要构造编码树必须提前统计 被编码对象中的符号出现概率,因此必须对输入符 号流进行两遍扫描,第一遍统计符号出现概率并构 造编码树,第二遍进行编码,这在很多实际应用的 场合中之不能接受的。其次,在存储和传送霍夫曼
i 1 i
n
单位:以2为底的对数时是比特/符号(bit/symbol); 以e为底的对数时是奈特/符号(nat/symbol); 以10为底的对数时是哈特/符号( hart/symbol) 其中 I(xi)=-logp(xi) 表示某个事件xi的信息量。

平均码长 编码效率
例:现有一个由5个不同符号组成的30个符号的字 符串:BABACACADADABBCBABEBEDDABEEEBB 计算 (1) 该字符串的霍夫曼码 (2) 该字符串的熵 (3) 该字符串的平均码长




霍夫曼(Huffman)编码是一种统计编码。 属于无损(lossless)压缩编码。 以霍夫曼树─即最优二叉树,带权路径长 度最小的二叉树,经常应用于数据压缩。 根据给定数据集中各元素所出现的频率来 压缩数据的一种统计压缩编码方法。这些 元素(如字母)出现的次数越多,其编码的 位数就越少。 广泛用在JPEG, MPEG, H.2X等各种信息编 码标准中。

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

信息论课程实验报告—哈夫曼编码
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];
}

信息论 实验六 Huffman编码

信息论 实验六 Huffman编码

实验六 Huffman 编码一、实验目的:掌握Huffman 编码的方法二、实验内容:对信源123456,,,,,()0.250.250.020.150.10.05a a a a a a X P X ⎧⎫⎛⎫=⎨⎬ ⎪⎝⎭⎩⎭进行二进制Huffman 编码。

并计算其平均码长,编码效率。

三、实验步骤(1)将概率按从小到大的顺序排列(2)给两个概率最小的信源符号1()P a 和2()P a 各分配一个码位“0”和“1”,将这两个信源符号合并成一个新符号,并用这两个最小的概率之和最为新符号的概率,结果得到一个只包含(n-1)个信源符号的新信源,称为信源的第一次缩减信源,用S1表示。

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

(4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩的两个符号的概率之和为1。

然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。

四、实验数据及结果分析(1)将信源符号按概率从小到大的顺序排列。

P=(0.25 0.25 0.2 0.15 0.1 0.05);(2)输出每个灰度级的编码00010000001111001(3)计算其平均码长和编码效率平均码长L=2.4500编码效率xiaolv=0.9891(4)运行截图如下所示:图一运行及结果五、代码附录n=input('N=');%输入信源符号的个数L=0; H=0;for i=1:nP(i)=input('P=');%输入信源符号概率分布s=s+P(i);endif s~=1error('不符合概率分布');endP=sort(P);p=P;mark=zeros(n-1,n); %mark为n-1行,n列矩阵,用来记录每行概率排列次序for i=1:n-1[P,num]=sort(P); %对输入元素排序并记录mark(i,:)=[num(1:n-i+1),zeros(1,i-1)];P=[P(1)+P(2),P(3:n),1];endfor i=1:n-1table(i,:)=blanks(n*n); %blanks 创建空格串endtable(n-1,n)='1';table(n-1,2*n)='0'for i=2:n-1table(n-i,1:n-1)=table(n-i+1,n*(find(mark(n-i+1,:)==1))-(n-2):n*(find(mark(n-i+1,:)==1))); %按mark的记录依次赋值table(n-i,n)='1';table(n-i,n+1:2*n-1)=table(n-i,1:n-1);table(n-i,2*n)='0';for j=1:i-1table(n-i,(j+1)*n+1:(j+2)*n)=table(n-i+1,n*(find(mark(n-i+1,:)==j+1)-1)+1:n*find(mark(n-i+1,:)==j+1));%mark的记录依次赋值endend%得到编码后的码字for i=1:nW(i,1:n)=table(1,n*(find(mark(1,:)==i)-1)+1:find(mark(1,:)==i)*n);l(i)=length(find(abs(W(i,:))~=32));%32表示空字符,要找不是空字符的个数,即为每个数编码的个数L=L+p(i)*l(i); %计算平均码长H=H-p(i)*log2(p(i));%计算信源熵endxiaolv=H/L; %计算编码效率disp('输出每个概率的编码');disp(W);disp('输出平均码长L:');disp(L);disp('输出编码效率xiaolv:');disp(xiaolv);六,实验总结:通过该实验,掌握了Huffman编码。

霍夫曼编码

霍夫曼编码

霍夫曼编码080212418高延邦摘要:霍夫曼编码是一种常用的无损编码,他基于不同符号的概率分布,在信息源中出现概率越大的符号,相应的码越短;出现概率越小的符号,其码越长,从而达到用尽可能少的码符号表示源数据。

本文首先介绍了信息论中的信息量,信息量是信息多少的量度。

然后介绍了霍夫曼编码的应用,原理,具体步骤和特点。

本文主要特色是结合实例十分详细地介绍了霍夫曼编码的原理,霍夫曼编码的方法,霍夫曼树的生成过程,霍夫曼编码的产生,霍夫曼表的构建,霍夫曼编码的结果以及怎么用计算机实现霍夫曼编码。

关键字:霍夫曼编码霍夫曼树最优二叉树无损压缩霍夫曼编码源代码引言霍夫曼编码(Huffman Coding)是一种编码方式,是可变字长编码(VLC)的一种。

Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码。

一、霍夫曼编码理论基础什么是信息量?信息量是信息多少的量度。

1928年R.V.L.霍特莱首先提出信息定量化的初步设想,他将消息数的对数定义为信息量。

若信源有m种消息,且每个消息是以相等可能产生的,则该信源的信息量可表示为I=-log(m)。

一个事件集合x1,x2,……x n,处于一个基本概率空间,其相应概率为p1,p2,……p n,且p1,p2,……p n 之和为1,每一个事件的信息量为I(x k)=-log n(p k),如定义在空间中的每一事件的概率不相等的平均不肯定程度或平均信息量叫做H,则H=E{I(x k)}=∑p k I(x k)=- ∑p k log a(p k)。

对于图像来说,n=2m个灰度级xi,则p(xi)为各灰度级出现的概率,熵即表示平均信息量为多少比特,换句话说,熵是编码所需比特数的下限,即编码所需的最少比特。

编码一定要用不比熵少的比特数编码才能完全保持原图像的信息,这是图像压缩的下限。

当a=2是,H的单位是比特。

二、霍夫曼编码简介霍夫曼编码是1952年为文本文件而建立,是一种统计编码。

霍夫曼定理的概念

霍夫曼定理的概念

霍夫曼定理的概念霍夫曼定理(Huffman's Theorem)是信息论中的一个重要定理,它描述了一种无损编码的最佳解决方案。

由数据压缩先驱大卫·霍夫曼(David Huffman)于1952年提出。

霍夫曼定理是信息论和编码理论中的基石之一,被广泛应用于数据压缩、通信、加密以及多媒体处理等领域。

下面我将详细介绍霍夫曼定理的概念及其应用。

首先,我们需要了解无损编码的概念。

无损编码是指通过编码将原始数据压缩并存储为更小的数据,而在解压缩时能够完全还原原始数据,不会有任何信息的丢失。

相比于有损编码,无损编码更适用于那些要求数据完整性和准确性的应用场景。

霍夫曼定理的主要内容是,对于任意给定的信源符号集合,可以通过构建霍夫曼树来实现最佳无损编码。

简单来说,霍夫曼树是一种用于构建最佳编码的二叉树结构。

在构建霍夫曼树时,每个信源符号根据其出现频率被分配一个权重,权重越高表示该符号出现的概率越大。

首先,将所有的信源符号视为独立的树节点,根据权重大小依次将节点组成森林。

接着,从森林中选取两个权重最小的节点合并为一个新节点,该新节点的权重为两个节点权重之和。

重复上述操作,直到所有节点都合并为一个根节点,形成一棵霍夫曼树。

在霍夫曼树中,从根节点到每个叶节点的路径上的编码即为信源符号的编码。

为了确保编码是最佳的,即编码的平均码长最短,我们需要满足霍夫曼树中靠近根节点的符号具有较短的编码,而靠近叶节点的符号具有较长的编码。

为了便于解码,通过编码的前缀码性质来区分不同的信源符号。

前缀码是指任意一个信源符号的编码都不是另一个信源符号编码的前缀。

这样,在解码时仅需从编码的头部开始逐一匹配即可精确还原原始数据。

霍夫曼定理的优势在于能够为每个信源符号分配一个最优的可变长度编码,且这个编码方案是唯一的。

即使在不同的实例中,根据霍夫曼算法构造的霍夫曼树形状可能不同,但对应的编码是相同的。

霍夫曼定理的应用非常广泛。

首先,它在数据压缩中发挥了重要的作用。

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

信息论与编码实验报告
课程名称:信息论与编码
实验名称:霍夫曼编码
班级:
学号:
姓名:
实验目的
1、熟练掌握Huffman编码的原理及过程,并熟练运用;
2、熟练运用MATLAB应用软件,并实现Huffman编码过程。

一、实验设备
装有MATLAB应用软件的PC计算机。

二、实验原理及过程
原理:
1、将信源符号按概率从大到小的排列,令P (X1)>=P(X2)>=P(X3)......P(Xn)
2、给两个概率最小的信源符号P(Xn-1)和P(Xn)各分配一个码位“0”和“1”,将这两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结果得到一个只包含(n-1)个信源符号的新信源。

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

3、将缩减信源S1的符号仍按概率从大到小顺序排列,重复步骤2,得到只含(n-2)个符号的缩减信源S2.
4、重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号的概率之和必为1。

然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。

过程:
用MATLAB编写代码实现Huffman编码其程序为:
%哈夫曼编码的MA TLAB实现(基于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:n
B(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:t
B(i,j)=T(i);
end
K=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-2
if i>1 & B(i,j)==B(i-1,j)
d=d+1;
else
d=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));
end
y=B(n,j+1);
END(t-1)=[char(END1(y)),'0'];
END(t)=[char(END1(y)),'1'];
t=t+1;
END1=END;
end
A%排序后的原概率序列
END%编码结果
for i=1:n
[a,b]=size(char(END(i)));
L(i)=b;
end
avlen=sum(L.*A)%平均码长
H1=log2(A);
H=-A*(H1')%熵
P=H/avlen%编码效率
四、实验现象。

相关文档
最新文档