费诺编码

合集下载

信息论编码实验报告 费诺编码附源代码

信息论编码实验报告 费诺编码附源代码

中南大学信息论与编码实验报告选题:费诺编码学生姓名:学号:专业班级:通信工程指导老师:学院:信息科学与工程学院时间: 2015目录一、实验目的二、实验原理2.1 费诺编码思想2.2 费诺编码流程图三、实验内容四、实验要求五、代码调试结果六、心得体会七、程序源代码一实验目的1. 掌握费诺编码的原理和过程。

2. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。

二、实验原理2.1 费诺编码思想设有离散无记忆信源∑==⎥⎦⎤⎢⎣⎡ni i n n x p x p x p x p x x x 121211)(,)(.....)()(.....1.按信源符号的概率从大到小的顺序排队 不妨设)(......)()(21n x p x p x p ≥≥≥2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。

3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。

4.如此重复,直至每个组只剩下一个信源符号为止。

5.信源符号所对应的码字即为费诺码。

例:有一单符号离散无记忆信源⎭⎬⎫⎩⎨⎧=⎥⎦⎤⎢⎣⎡04.008.016.018.022.032.0)(654321x x x x x x X P X对该信源编二进制费诺码)i /(35.2)(gn s bit X H = m L KR 2log =%92.97)(==R x H η∑===61)/(4.2)(i i i k x p K 符号比特2.2 费诺编码流程图三、实验内容使用C\C++实现费诺编码,并自己设计测试案例。

四、实验要求1.提前预习实验,认真阅读实验原理以及相应的参考书。

2.认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。

3.认真撰写实验报告,内容可以自己编排,可以考虑包括以下一些方面:原理概述、程序设计与算法描述、源程序及注释(程序太长可以只选取重要部分)、运行输出结果实例、调试和运行程序过程中产生的问题及采取的措施、对实验的讨论分析、总结。

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

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

信息论霍夫曼、香农-费诺编码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。

费诺编码课程设计

费诺编码课程设计

费诺编码课程设计一、课程目标知识目标:1. 理解费诺编码的基本原理和数学背景;2. 掌握费诺编码的算法步骤,能够运用编码方法进行简单信息编码;3. 了解费诺编码在实际通信系统中的应用及其优势。

技能目标:1. 能够运用费诺编码对文字、图像等不同类型的信息进行编码;2. 培养学生的逻辑思维能力和问题解决能力,通过团队合作完成费诺编码的实际操作;3. 提高学生的信息处理能力,学会在信息传输过程中优化编码,提高通信效率。

情感态度价值观目标:1. 培养学生对信息科学的兴趣,激发他们探索通信领域奥秘的热情;2. 引导学生认识信息编码在国家安全、科技进步和社会发展中的重要作用,增强他们的责任感和使命感;3. 培养学生的团队协作精神,使他们学会在合作中解决问题,共同成长。

课程性质:本课程为信息技术与通信原理相结合的实践课程,旨在帮助学生掌握费诺编码的理论知识,培养实际操作能力。

学生特点:六年级学生具备一定的数学基础和逻辑思维能力,对新鲜事物充满好奇心,善于合作与交流。

教学要求:结合学生特点,注重理论与实践相结合,通过任务驱动、分组合作等教学策略,提高学生的学习兴趣和实际操作能力。

在教学过程中,关注学生的个体差异,引导他们主动探究、积极思考,培养解决问题的能力。

将课程目标分解为具体的学习成果,以便在教学设计和评估中达到预期效果。

二、教学内容1. 费诺编码原理:- 线性代数基础知识:向量空间、线性变换;- 编码理论基本概念:编码、解码、错误纠正;- 费诺编码基本原理:费诺不等式、最小距离、编码效率。

2. 费诺编码算法:- 编码算法步骤:生成矩阵、编码过程;- 解码算法步骤:伴随矩阵、纠错能力;- 实例分析:具体案例展示费诺编码的编码与解码过程。

3. 费诺编码应用:- 数字通信系统中的应用:提高通信效率、降低误码率;- 现实生活中的应用案例:光纤通信、卫星通信等;- 编码优化:针对不同场景选择合适的编码方案。

4. 实践操作:- 软件工具使用:介绍相关软件工具,如Matlab等;- 编码与解码实践:分组进行费诺编码的实际操作,包括编码、解码及性能分析;- 团队协作:分组完成任务,培养学生的合作精神和沟通能力。

费诺编码的C语言实现

费诺编码的C语言实现

摘要:用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。

编码在电子计算机、电视、遥控和通讯等方面广泛使用。

其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用C语言实现费诺编码。

关键字:信息论,费诺编码,C语言正文:费诺编码也是一种常见的信源编码方法。

信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同.费诺编码的C语言实现设有一个离散信源,概率分布P(x)保存在in.dat文件中,实现对文件的读取,并根据P(x)给出对应的费诺编码,将结果保存在另一文件out.dat中。

程序代码:#include<stdio.h>#include<math.h>#include<stdlib.h>#define N 8struct event {int n;double x;int code[N];int low;};FILE *fp1,*fp2;struct event A[N+1];void inputcode(struct event *a,int b)/*input code*/{a->code[a->low]=b;(a->low)++;}void outcode(struct event a)/*output code*/{int i;for(i=0;i<a.low;i++)fprintf(fp2,"%d",a.code[i]);}double getsum(int h,int t,struct event a[])/*get sum*/{int i=h;double sum=0.0;for(i=h;i<=t;i++){sum=sum+a[i].x;}return sum;}int getbreakpoint(struct event a[],int h,int t)/*all right*/ {int n,t1;double f[N+1],temp=0.0;for(n=h;n<t;n++){f[n]=fabs(getsum(h,n,a)-getsum(n+1,t,a));}temp=f[h];t1=h;for(n=h;n<t;n++){if(f[n]<temp){temp=f[n];t1=n;}}return t1;}void group(int h,int t,struct event a[]){int i,breakpoint,zero=0,one=1;if(t==h+1){inputcode(&a[h],zero);inputcode(&a[t],one);}elseif(t==h);else{breakpoint=getbreakpoint(a,h,t);for(i=h;i<=breakpoint;i++){inputcode(&a[i],zero);for(i=breakpoint+1;i<=t;i++){inputcode(&a[i],one);}group(h,breakpoint,a);group(breakpoint+1,t,a);}}void sort(struct event a[]){int i,j;struct event t;for(i=1;i<N;i++)for(j=1;j<N-i+1;j++)if(a[j].x<a[j+1].x){t=a[j];a[j]=a[j+1];a[j+1]=t;}}void main(){int i;int h=1,t=N;float temp;/*input data*/if((fp1=fopen("in.dat","rb"))==NULL){printf("不能打开文件!\n");exit(1);}if((fp2=fopen("out.dat","a"))==NULL){printf("不能打开文件!\n");exit(1);}for(i=1;i<=N;i++){fscanf(fp1,"%f",&temp);A[i].x=temp;}/*initialize*/for(i=1;i<=N;i++){A[i].n=i;A[i].low=0;}group(h,t,A);/*Out put result*/for(i=1;i<=N;i++){fprintf(fp2,"%.4f:",A[i].x);outcode(A[i]);fprintf(fp2,"\n");}fclose(fp1);fclose(fp2);printf("费诺编码成功!\n"); }文件in.dat内容:0.250.250.1250.1250.06250.06250.06250.0625总结:。

费诺编码

费诺编码

费诺编码1 课题描述费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率达,编码效率高,但它属于概率匹配编码它不是最佳的编码方法。

本文通过采用递归的思想进行费诺编码,求得了每个字符的二进制码字。

并且对编码后的平均码长,以及编码的传输效率进行了求解。

符合费诺编码的要求,并且得到了预期的编码结果。

费诺编码在电子计算机、电视、遥控和通讯等方面广泛使用。

其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用C语言实现费诺编码。

关键字:信息论,费诺编码,C语言2 信源编码的相关介绍信源编码分为无失真信源编码和限失真信源编码。

一般称无失真信源编码为第一机械定理;限失真信源编码定理称为第三极限定理。

由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。

具体说,就是针对信源输出符号序列的统计特性,寻找一定的方法把信源输出符号序列变换为最短码字序列的方法。

信源编码的基本途径有两个:使编码中各个符号出现的概率尽可能地相等,即概率均匀化。

信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。

其中无失真编码定理是可逆编码的基础。

可逆是指当信源符号转换成代码后,可从代码无失真地恢复信源符号。

当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载有的信息量。

编码定理不但证明了必定存在一种编码方法,可使代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,就是使概率与码长匹配。

无失真编码或可逆编码只适用于离散信源。

对于连续信源,编成代码后就无法无失真地恢复原来的连续值,因为后者的取值可有无限多个。

此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。

信源编码定理出现后,编码方法就趋于合理化。

凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。

能获得最佳码的编码方法主要有:香农码(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。

费诺编码原理(一)

费诺编码原理(一)

费诺编码原理(一)费诺编码简介1. 什么是费诺编码费诺编码,又称哈夫曼编码(Huffman Coding),是一种变长编码方式,用于有效地压缩数据。

它是由David A. Huffman在1952年提出的,被广泛应用于数据压缩、无损压缩和信息论等领域。

2. 为什么需要费诺编码在传输和存储数据时,我们通常需要压缩数据,以减少占用的空间和提高传输效率。

费诺编码通过将常用字符用较短的编码表示,而将不常用字符用较长的编码表示,从而使得整个数据的平均编码长度最小化,达到高效压缩的效果。

3. 费诺编码的原理为了理解费诺编码的原理,需要了解以下几个重要概念:字符的频率在对数据进行编码之前,首先要统计字符在数据中出现的频率。

频率较高的字符会被赋予较短的编码,频率较低的字符会被赋予较长的编码。

构建哈夫曼树根据字符的频率,我们可以构建一棵哈夫曼树。

哈夫曼树是一种特殊的二叉树,其中每个叶子节点对应一个字符,叶子节点的权值为该字符的频率。

分配编码从根节点出发,沿着左子树分支走为0,沿着右子树分支走为1,通过这样的方式,可以给每个字符分配唯一的编码。

压缩数据根据字符的编码,将原始数据中的字符逐个替换为对应的编码,从而实现数据的压缩。

4. 费诺编码的优势费诺编码的优势在于可以根据数据的统计特征来动态地构建编码表,使得经常出现的字符用较短的编码表示,极大地提高了压缩的效果。

此外,由于费诺编码是前缀编码,因此可以避免编码冲突。

5. 费诺编码的应用费诺编码被广泛应用于数据压缩领域,其中最著名的应用之一就是在ZIP压缩算法中的使用。

此外,费诺编码还常用于文件压缩、图像压缩等领域。

结论费诺编码是一种高效的数据压缩算法,通过根据字符频率构建哈夫曼树,并根据树的结构分配编码,实现了数据的高效压缩。

费诺编码的优势在于压缩效果好、没有编码冲突等特点,因此被广泛应用于各种数据压缩场景中。

香农编码的原理

香农编码的原理
香农编码(Shannon Coding),又称为香农-费诺编码(Shannon-Fano Coding),是由信息论的奠基人之一克劳德·香农(Claude Shannon)于1948年提出的一种熵编码方法。

香农编码的目标是用尽可能短的二进制编码表示出现概率不同的符号,从而减小信息传输的平均长度。

香农编码的基本原理如下:
* 符号的概率分布:
* 对于给定的符号集合,首先需要知道每个符号出现的概率。

* 概率排序:
* 将符号按照概率从高到低排序。

* 分割符号集:
* 将符号集按照概率中位数分为两组,保证一组的概率之和接近另一组。

* 分配二进制编码:
* 对于左侧一组的符号,添加一个二进制前缀(如0),对右侧一组的符号添加另一个二进制前缀(如1)。

* 递归处理:
* 对于分割后的每个子集,重复上述过程,直到每个符号都被分配唯一的二进制编码。

* 生成编码表:
* 根据上述过程生成完整的编码表,包含每个符号和对应的二进制编码。

香农编码的特点是,出现概率较高的符号获得较短的编码,而出现概率较低的符号获得较长的编码。

这样设计的编码方案可以有效减
小平均编码长度,提高信息传输的效率。

需要注意的是,香农编码的主要缺点在于生成的编码长度可能不是整数,可能存在解码的歧义性。

为了解决这个问题,后来发展出了霍夫曼编码等更为广泛使用的熵编码方法。

费诺编码原理

费诺编码原理费诺编码费诺编码(Huffman Coding)是一种常用的可变长度编码方式,旨在实现对信息的高效压缩。

本文将从浅入深,逐步解释费诺编码的原理和应用。

1. 简介费诺编码由美国数学家大卫·费诺(David A. Huffman)于1952年提出,它基于信息中出现的字符频率进行编码。

通过将出现频率较高的字符使用较短的编码,而出现频率较低的字符使用较长的编码,费诺编码实现了压缩效果。

2. 编码原理费诺编码的实现过程如下:•统计待编码文本中每个字符的出现频率。

•根据字符频率构建费诺树(Huffman Tree),频率越高的字符位于树的顶部,频率越低的字符位于树的底部。

•为每个字符赋予编码,频率更高的字符使用较短的编码,频率更低的字符使用较长的编码。

•将编码应用于待编码文本,将其转换为费诺编码形式。

3. 示例说明以下是一个简单的示例,用于说明费诺编码的工作原理。

考虑待编码文本中的字符及其出现频率如下:字符频率A 5B 1C 2D 3按照费诺编码的原则,我们可以构建出如下的费诺树:Root/ \11 7/ \4 3/ \ / \A 1 C D|B根据费诺树,我们为每个字符分配编码:字符频率编码A 5 0B 1 110C 2 10D 3 111将待编码文本“AABACDCD” 转换为费诺编码形式:AABACDCD =>可以看到,使用费诺编码后,原文本被高效地压缩。

4. 应用场景费诺编码在很多领域都有广泛应用,尤其在数据压缩和信息存储中起到重要作用。

例如,压缩文件、图像、音频和视频文件时,常常使用费诺编码。

由于费诺编码可根据数据的特征自适应地调整编码长度,因此能够实现较高的压缩比。

5. 总结费诺编码是一种高效的可变长度编码方式,通过频率统计和构建费诺树,将出现频率较高的字符使用较短的编码,从而实现信息的高效压缩。

费诺编码在数据压缩和信息存储领域有着广泛应用。

希望本文对费诺编码的原理和应用有所帮助,欢迎阅读与讨论!。

基于时间最优的费诺编码算法研究与设计

基于时间最优的费诺编码算法研究与设计随着人类社会的不断进步,以及互联网技术的不断发展,人们获取信息的渠道也越来越多样化,而传统的媒体如报纸、杂志等等则显得有些力不从心了。

为了应对这一问题,费诺编码理论被提出来并且受到了广泛的重视,其中基于时间最优的费诺编码算法更是作为当前比较流行的研究方向,为很多领域带来了全新的变革。

但目前在该算法的研究过程中仍存在着很多问题需要解决。

费诺编码算法是经典的编码方法,是一种极其古老的通信技术,是利用噪声实现数据压缩的算法。

它的基本思想是将原始数据转换为某种码型,然后再根据特定的规则加入噪声信息,使原来的数据产生衰减或者失真。

在该算法中,噪声的性质和相应的代价是由数据的长度、频率和比特率决定的,而最终则是通过对所选择的码型进行变换,并以某种误差限制值作为判别依据,将衰减系数与允许值之间的大小关系找到,即得到所期望的信息内容。

因此,我们可以通过调整代价与允许之间的匹配程度来达到压缩的目的。

其中编码方案的选择和效果都直接影响了压缩比。

因此,本文主要针对当前费诺编码算法的设计进行深入的分析和探讨。

首先,分析了当前费诺编码算法中存在的一些缺陷,并提出了可能的解决方案;其次,根据当前算法中存在的缺陷,引入了“预测”这一概念,以其为基础建立了一个“预测器”,并从各个角度进行了详细的分析,最终提出了一个较为完善的解决方案,为算法的实现奠定了良好的基础;最后,根据当前的算法特点,给出了几种主要的改进措施,如采用硬件加速、在算法的实现过程中引入动态时钟、在压缩函数中引入综合后预测、引入多级预测等等,以期能够提升所选择算法的算法效率,并使算法的应用更加灵活,提高算法的准确性和可操控性。

因此,该文对进一步完善当前的费诺编码算法具有重要意义和参考价值,给后续的算法的设计和实现提供了重要的理论和技术指导。

3。

4。

5。

随着人类社会的不断进步,以及互联网技术的不断发展,人们获取信息的渠道也越来越多样化,而传统的媒体如报纸、杂志等等则显得有些力不从心了。

信息论与编码--费诺编码与哈弗曼编码比较

信源编码的比较——哈弗曼编码与费诺编码姓名:班级:学号:一、实验目的:1、实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。

2、课程实验主要为设计性实验,要求掌握Matlab使用方法。

3、通过信源编译码,理解信源编码的主要目的,掌握信源编码的方法和手段,掌握费诺编码和霍夫曼编码方法二、实验设备:装有matlab的计算机三、实验原理:信源编码主要可分为无失真信源编码和限失真信源编码。

无失真信源编码主要适用于离散信源或数字信号,如文本、表格及工程图纸等信源,它们要求进行无失真地数据压缩,要求完全能够无失真地可逆恢复。

香农码、费诺码、哈夫曼码都考虑了信源的统计特性,使经常出现的信源符号对应较短的码字,使信源的平均码长缩短,从而实现了对信源的压缩。

费诺码比较适合于对分组概率相等或接近的信源编码。

哈夫曼码对信源的统计特性没有特殊要求,编码效率比较高,对编码设备的要求也比较简单,因此综合性能优于香农码和费诺码。

(1)费诺码属于概率匹配编码,编码过程如下:1、将信源发出的N个消息符号按其概率的递减次序依次排列。

2、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制码就分成m组)。

3、将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1”4、如此重复,直至每组值只剩下一个信源符号为止5、信源符号所对应的码符号序列即为费诺码(2)霍夫曼编码过程:1、将信源发出的N个消息符号按其概率的递减次序依次排列。

2、取概率最小的两个符号分别配以0和1两个码元,并将这两个符号的概率相加作为一个新概率,与未分配码元的符号重新按概率排队3、对重排后的两个概率最小符号重复步骤24、不断重复上述过程,直到最后两个符号配以0和1为止5、重最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。

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

1 课题描述本文通过采用递归的思想进行费诺编码,求得了每个字符的二进制码字。

并且对编码后的平均码长,以及编码的传输效率进行了求解。

符合费诺编码的要求,得到了预期的编码结果。

2 信源编码的相关介绍信源编码分为无失真信源编码和限失真信源编码。

一般称无失真信源编码为第一机械定理;限失真信源编码定理称为第三极限定理。

由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。

具体说,就是针对信源输出符号序列的统计特性,寻找一定的方法把信源输出符号序列变换为最短码字序列的方法。

信源编码的基本途径有两个:使编码中各个符号出现的概率尽可能地相等,即概率均匀化。

信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。

其中无失真编码定理是可逆编码的基础。

可逆是指当信源符号转换成代码后,可从代码无失真地恢复信源符号。

当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载有的信息量。

编码定理不但证明了必定存在一种编码方法,可使代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,就是使概率与码长匹配。

无失真编码或可逆编码只适用于离散信源。

对于连续信源,编成代码后就无法无失真地恢复原来的连续值,因为后者的取值可有无限多个。

此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。

信源编码定理出现后,编码方法就趋于合理化。

凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。

能获得最佳码的编码方法主要有:香农码(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。

3.费诺编码3.1费诺编码算法(1)将信源消息符号按其出现的概率大小依次排列:n p p p ≥≥≥ 21。

(2)将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。

(3)将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。

(4)如此重复,直至每个组只剩下一个信源符号为止。

(5)信源符号所对应的码字即为费诺码。

3.2费诺编码特点费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率达,编码效率高,但它属于概率匹配编码它不是最佳的编码方法。

4.费诺编码C语言实现4.1程序设计/*FenoEncoding*/#include<stdio.h>#include<malloc.h>#include<math.h>#include <algorithm>using namespace std;#define MaxStrLength 50 /*输入字符串的最大长度*/#define MaxNode 24 /*设定最大不重复符号个数*/#define MaxBit 5 /*设定最大编码长度*/typedef struct{char Character; /*字符*/float data; /*字符的概率值*/int bit[MaxBit]; /*编码后的码字*/int length; /*码字长度*/}CodeType;CodeType FanoNode[MaxNode]; /*定义结构体数组*/int Group(CodeType FanoNode[],int low,int high){ /*一次分组(一分为二)并编码*/float MinSum=FanoNode[low].data,MaxSum=FanoNode[high].data;FanoNode[low].bit[FanoNode[low].length++]=1;FanoNode[high].bit[FanoNode[high].length++]=0;while(low+1<high){if(MinSum>MaxSum){MaxSum+=FanoNode[--high].data;FanoNode[high].bit[FanoNode[high].length++]=0; /*编码加0*/}else{MinSum+=FanoNode[++low].data;FanoNode[low].bit[FanoNode[low].length++]=1; /*编码加1*/ }}return low; /*返回分组的第一部分的上界*/}void FanoEncoding(CodeType FanoNode[],int s,int t){/*递归进行费诺编码*/if(s<t){int pivotloc=Group(FanoNode,s,t);if(s<t-1){FanoEncoding(FanoNode,s,pivotloc);FanoEncoding(FanoNode,pivotloc+1,t);}}}void Disp(CodeType FanoNode[],int m,char str[],int SLength){ /*输出函数*/float K=0,R=0,H=0;printf("MessageSymbol Character Probability CodeLength Code\n");for(int i=0;i<m;i++){printf("FanoNode[%d] %c %.2f",i,FanoNode[i].Cha racter,FanoNode[i].data);printf(" %d ",FanoNode[i].length);for(int j=0;j<FanoNode[i].length;j++)printf("%d",FanoNode[i].bit[j]);printf("\n");K+=FanoNode[i].data*FanoNode[i].length; /*求平均码长*/H+=-FanoNode[i].data*log(FanoNode[i].data); /*求H(X)的大小*/}printf("The code of the string is\n"); /*输出整个字符串的编码*/for(i=0;i<SLength;i++)for(int k=0;k<m;k++)if(FanoNode[k].Character==str[i]){for(int j=0;j<FanoNode[k].length;j++)printf("%d",FanoNode[k].bit[j]);break;}R=H/K; /*求信息传输速率*/printf("\nThe average length of code is %.3f\n",K);printf("The rate of transport is %.3f\n",R);}int IsnotIn(char a,char t[],int n,int count[]){ /*检查字符a是否在数组t[]中*/for(int k=0;k<n;k++)if(a==t[k]){count[k]++;return 0;}return 1;}void ExChangeFloat(float p[],int i,int j){ /*交换两个数值*/ float temp1;temp1=p[i];p[i]=p[j];p[j]=temp1;}void ExChangeChar(char t[],int i,int j){ /*交换两个字符*/ char temp2;temp2=t[i];t[i]=t[j];t[j]=temp2;}void main(){ /*主函数*/float p[MaxStrLength];/*p[]每个字符的概率*/char str[MaxStrLength],t[MaxStrLength];/*str[]输入的字符串,t[]不重复的字符串*/int count[MaxStrLength]={0},m=1; /*count[]每个字符的个数,m为不重复的字符的个数*/printf("----------------------------FanoEncoding-----------------------\n");printf("Please enter a string:");scanf("%s",str);for(int SLength=0;str[SLength]!='\0';SLength++) ;/*计算数组中实际存储字符串的长度*/printf("The total length of the string is %d\n",SLength);t[0]=str[0];count[0]++;for(int i=1;i<SLength;i++){ /*去除重复的字符,并计算个数*/ if(IsnotIn(str[i],t,m,count)){t[m]=str[i];count[m++]++;}}printf("The length of not repeating string is %d\n",m);for(int j=0;j<m;j++){p[j]=float(count[j])/float(SLength);printf("The number of character %c appear is %d,Probability is %f\n",t[j],count[j],p[j]);}for(i=1;i<m;i++) /*冒泡排序*/for(j=0;j<m-i;j++)if(p[j]>p[j+1]){ExChangeFloat(p,j,j+1);ExChangeChar(t,j,j+1);}for(i=0;i<m;i++){ /*将值赋给结构体数组 */FanoNode[i].data=p[i];FanoNode[i].length=0;FanoNode[i].Character=t[i];}FanoEncoding(FanoNode,0,m-1);Disp(FanoNode,m,str,SLength);}4.2运行结果总结通过本次课程设计,我进一步的对最佳变长编码(特别是费诺编码)有了一个深刻的认识,对于信息论的认识也进入了一个新的台阶。

相关文档
最新文档