实现香农编码、费诺编码杨兴勃0808060121
用matlab实现香农码和费诺码

信息论与编码―大作业班级:电信091班姓名:***学号:**********目录一、用matlab实现Shannon编码 (3)1、编码主程序 (3)2、含有的子函数binary (4)3、注意事项 (5)4、例题展示 (5)二、用matlab实现Feno编码 (7)1、编码主程序 (7)2、两个子m文件展示 (9)3、注意事项 (12)4、例题展示 (12)一、用matlab实现Shannon编码1、编码主程序n=input('输入单符号信源个数n=')p=zeros(1,n);for i=1:np(1,i)=input('输入单符号信源个数:');endif sum(p)<1||sum(p)>1error('不符合概率分布无效')endy=fliplr(sort(p));%大到小排序D=zeros(n,4);%生成n*4的零矩阵D(:,1)=y';%把y赋给零矩阵的第一列for i=2:nD(1,2)=0;%令第一行第二列的元素为0D(i,2)=D(i-1,1)+D(i-1,2);%求累加概率endfor i=1:nD(i,3)=-log2(D(i,1));%求第三列的元素D(i,4)=ceil(D(i,3));%求第四列的元素,对D(i,3)向无穷方向取最小正整数endDA=D(:,2)';%取出D中第二列元素B=D(:,4)';%取出D中第四列元素for j=1:nC=binary(A(j),B(j))%生成码字End2、含有的子函数binaryfunction [C]=binary(A,B)%对累加概率求二进制的函数C=zeros(1,B);%生成零矩阵用于存储生成的二进制数,对二进制的每一位进行操作temp=A;%temp赋初值for i=1:B%累加概率转化为二进制,循环求二进制的每一位,A控制生成二进制的位数temp=temp*2;if temp>1temp=temp-1;C(1,i)=1;elseC(1,i)=0;endend3、注意事项正式运行前应该把binary.m文件放到matlab的工作空间中去,以保证主函数能成功调用。
费诺编码

费诺编码1 课题描述费诺编码,它编码后的费诺码要比香农码的平均码长小,消息传输速率达,编码效率高,但它属于概率匹配编码它不是最佳的编码方法。
本文通过采用递归的思想进行费诺编码,求得了每个字符的二进制码字。
并且对编码后的平均码长,以及编码的传输效率进行了求解。
符合费诺编码的要求,并且得到了预期的编码结果。
费诺编码在电子计算机、电视、遥控和通讯等方面广泛使用。
其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用C语言实现费诺编码。
关键字:信息论,费诺编码,C语言2 信源编码的相关介绍信源编码分为无失真信源编码和限失真信源编码。
一般称无失真信源编码为第一机械定理;限失真信源编码定理称为第三极限定理。
由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余,提高编码效率。
具体说,就是针对信源输出符号序列的统计特性,寻找一定的方法把信源输出符号序列变换为最短码字序列的方法。
信源编码的基本途径有两个:使编码中各个符号出现的概率尽可能地相等,即概率均匀化。
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。
其中无失真编码定理是可逆编码的基础。
可逆是指当信源符号转换成代码后,可从代码无失真地恢复信源符号。
当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载有的信息量。
编码定理不但证明了必定存在一种编码方法,可使代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,就是使概率与码长匹配。
无失真编码或可逆编码只适用于离散信源。
对于连续信源,编成代码后就无法无失真地恢复原来的连续值,因为后者的取值可有无限多个。
此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。
信源编码定理出现后,编码方法就趋于合理化。
凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合称为最佳变长码。
能获得最佳码的编码方法主要有:香农码(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。
信息论与编码实验报告-Shannon编码

实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日实验三 Shannon 编码一、实验目的1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程二、实验原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、信源符号按概率从大到小排列;12.......n p p p ≥≥≥2、确定满足下列不等式的整数码长i K 为()()1i i i lb p K lb p -≤<-+3、为了编成唯一可译码,计算第i 个消息的累加概率:4、将累加概率i P 变换成二进制数;5、取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。
三、实验内容1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。
3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。
四、实验环境Microsoft Windows 7 Matlab 6.5五、编码程序计算如下信源进行香农编码,并计算编码效率:⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡01.01.015.017.018.019.02.06543210a a a a a a a P X MATLAB 程序:(1) a=[0.2 0.18 0.19 0.15 0.17 0.1 0.01]; k=length(a);y=0; for i=1:k-111()i i k k P p a -==∑for n=i+1:kif (a(i)<a(n))t=a(i);a(i)=a(n);a(n)=t;endendends=zeros(k,1);b=zeros(k,1);for m=1:ks(m)=y;y=y+a(m);b(m)=ceil(-log2(a(m)));z=zeros(b(m),1);x=s(m);p=b2d10(x);for r=1:b(m)z(r)=p(r);enddisp('Êä³ö½á¹ûΪ£º')disp('³öʸÅÂÊ'),disp(a(m))disp('ÇóºÍ½á¹û'),disp(s(m))disp('±àÂëλÊý'),disp(b(m))disp('×îÖÕ±àÂë'),disp(z')end(2) function y=b2d10(x)for i=1:8temp=x.*2;if(temp<1)y(i)=0;x=temp;elsex=temp-1;y(i)=1;endend(3) p=[0.2 0.19 0.18 0.17 0.15 0.1 0.01]; sum=0;sum1=0;for i=1:7a(i)=-log2(p(i));K(i)=ceil(a(i));R(i)=p(i)*K(i);sum=sum+R(i);c(i)=a(i)*p(i);sum1=sum1+c(i);endK1=sum;H=sum1;Y=H/K1;disp('ƽ¾ùÐÅÏ¢Á¿'),disp(H)disp('ƽ¾ùÂ볤'),disp(K1)disp('±àÂëЧÂÊ'),disp(Y)六、实验结果输出结果为:出事概率0.2000,求和结果0,编码位数3,最终编码000出事概率0.1900,求和结果0.2000,编码位数3,最终编码001出事概率0.1800,求和结果0.3900,编码位数3,最终编码011出事概率0.1700,求和结果0.5700,编码位数3,最终编码100出事概率0.1500,求和结果0.7400,编码位数3,最终编码101出事概率0.1000,求和结果0.8900,编码位数4,最终编码1110出事概率0.0100,求和结果0.9900,编码位数7,最终编码1111110编码效率:平均信息量2.6087平均码长3.1400编码效率0.8308七、实验总结通过本次的实验,掌握了Shannon编码的实验原理以及编码过程。
实验四-香农编码

海南大学信息科学技术学院信息安全专业《信息论与编码》实验报告一、 实验目的:了解掌握香农编码二、 实验环境:CodeBlocks三、 实验要求编程,对某一离散无记忆信源实现香农编码,输出消息符号及其对应的码字。
设离散无记忆信源⎭⎬⎫⎩⎨⎧=⎪⎪⎭⎫ ⎝⎛01.010.015.017.018.019.020.0)(7654321a a a a a a a X p X ,∑==ni ia p 11)(。
二进制香农编码过程如下: 1、将信源发出的N 个消息符号按其概率的递减次序依次排列。
2、按下式计算第i 个消息的二进制代码组的码长,并取整。
3、为了编成唯一可译码,首先计算第i 个消息的累加概率4、将累加概率Pi (为小数)变成二进制数5、除去小数点,并根据码长li ,取小数点后li 位数作为第i 个消息的码字。
四、 实验过程:代码:#include<stdio.h>#include<math.h>void main(){int i,n, j,k;float sum=0;float p[100]={0}; //无记忆信源X 的概率分布float m;float Pa[100]={0}; //累加概率的数组int l[100];char c[100][100];printf("请输入信源X的个数:");scanf("%d",&n);printf("请输入p[X]的概率分布\n");for(i=0;i<n;i++)scanf("%f",&p[i]);for(i=0;i<=n;i++) //判断概率和为1sum=sum+p[i];while(sum!=1){printf("错误输入,请重输\n");printf("请输入x的个数\n");scanf("%d",&n);printf("\n");printf("请输入p[i]的概率分布\n");for(i=0;i<n;i++)scanf("%f",&p[i]);for(i=0;i<n;i++)sum=sum+p[i];}for(j=0;j<n-1;j++) //将概率按从大到小排序 for(i=0;i<n-1-j;i++)if(p[i]<p[i+1]){m=p[i];p[i]=p[i+1];p[i+1]=m;}printf("p[i]由大到小的顺序为\n:");for(i=0;i<n;i++)printf("%5.2f",p[i]);printf("\n");Pa[0]=0;for(j=1;j<n+1;j++) //计算累加概率{Pa[j]=Pa[j-1]+p[j-1];}printf("累加和Pi为:");for(j=0;j<n;j++)printf("%5.2f",Pa[j]);printf("\n");printf("码长:");for(i=0;i<n;i++) //计算码长{m=log(1/p[i])/log(2);if(m==(int)m)l[i]=(int)m;elsel[i]=(int)(m+1);}for(i=0;i<n;i++)printf(" %d ",l[i]);printf("\n");for(i=0;i<n;i++) //将累加概率转换成二进制数{for(k=0;k<l[i];k++){Pa[i]=Pa[i]*2;if(Pa[i]>=1){Pa[i]=Pa[i]-1;c[i][k]='1';}else{c[i][k]='0';}}}for(i=0;i<n;i++){for(k=0;k<l[i];k++)printf("%c",c[i][k]);printf("\n");}}五、实验结果:。
香农编码的原理

香农编码的原理
香农编码(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. 总结费诺编码是一种高效的可变长度编码方式,通过频率统计和构建费诺树,将出现频率较高的字符使用较短的编码,从而实现信息的高效压缩。
费诺编码在数据压缩和信息存储领域有着广泛应用。
希望本文对费诺编码的原理和应用有所帮助,欢迎阅读与讨论!。
信息论与编码课程设计
信息论与编码课程设计报告设计题目:统计信源熵、香农编码与费诺编码专业班级:XXXXXXXXXXXX姓名:XXXXXXXXXXXX学号:XXXXXXXXXXXX指导老师:XXXXXXXXXXXX成绩:时间:2015年3月31日目录一、设计任务与要求 (2)二、设计思路 (2)三、设计流程图 (5)四、程序及结果 (7)五、心得体会 (11)六、参考文献 (12)附录 (13)一、 设计任务与要求1. 统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。
2. 香农编码要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。
3. 费诺编码要求:任意输入消息概率,利用费诺编码方法进行编码,并计算信源熵和编码效率。
二、 设计思路1、统计信源熵:统计信源熵就是对一篇英文文章中的i 种字符(包括标点符号及空格,英文字母不区分大小写)统计其出现的次数count i (),然后计算其出现的概率()p i ,最后由信源熵计算公式:1()()log ()ni i n H x p x p x ==-∑算出信源熵()H x 。
所以整体步骤就是先统计出文章中总的字符数,然后统计每种字符的数目,直到算出所有种类的字符的个数,进而算出每种字符的概率,再由信源熵计算公式计算出信源熵。
在这里我选择用Matlab 来计算信源熵,因为Matlab 中系统自带了许多文件操作和字符串操作函数,其计算功能强大,所以计算信源熵很是简单。
2、香农编码信源编码模型:信源编码就是从信源符号到码符号的一种映射f ,它把信源输出的符号i a 变换成码元序列i x 。
1,2,...,,i i N f a i q x =→:1:{,...,}q S s a a ∈ 信源 12{,...,}li i i i i X x x x = 码元1{,...,}1,2,...,i q S a a i N ∈=1,2,...,N i q =1:{,...,}r X x x x ∈ 码符号N 次扩展信源无失真编码器凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合都可以称为最佳码。
中南大学信息论与编码编码部分实验报告
信息论与编码编码部分实验报告课程名称:信息论与编码实验名称:关于香农码费诺码Huffman码的实验学院:信息科学与工程学院班级:电子信息工程1201姓名:viga学号:指导老师:张祖平日期:2014年1月3日目录⊙实验目的及要求1.1 实验目的 (4)1.2 开发工具及环境 (4)1.3 需求分析与功能说明 (4)⊙实验设计过程2.1 用matlab实现香农码、费诺码和Huffman编码2.1.1 说明 (6)2.1.2 源代码 (7)2.1.3 运行结果(截图) (19)2.2 用C\C++ 实现香农码2.2.1 说明 (22)2.2.2 源代码 (23)2.2.3 运行结果(截图) (26)2.3 用C\C++ 实现Huffman码2.3.1 说明 (26)2.3.2 源代码 (29)2.3.3 运行结果(截图) (36)2.4 用C\C++ 实现费诺码2.4.1 说明 (37)2.4.2 源代码 (37)2.4.3运行结果结果(截图) (40)⊙课程设计总结 (42)⊙参考资料4.1 课程设计指导书 (43)实验目的及要求1.1 实验目的1.掌握香农码、费诺码和Huffman编码原理和过程。
2.熟悉matlab软件的基本操作,练习使用matlab实现香农码、费诺码和Huffman编码。
3.熟悉C/C++语言,练习使用C/C++实现香农码、费诺码和Huffman编码。
4.应用Huffman编码实现文件的压缩和解压缩。
1.2 开发工具及环境MATLAB 7.0、wps文字、红精灵抓图精灵2010Windows7 系统环境1.3 需求分析与功能说明1、使用matlab实现香农码、费诺码和Huffman编码,并自己设计测试案例。
2、使用C\C++实现香农码、费诺码和Huffman编码,并自己设计测试案例。
3、可以用任何开发工具和开发语言,尝试实现Huffman编码应用在数据文件的压缩和解压缩中,并自己设计测试案例。
香农编码的原理 -回复
香农编码的原理-回复香农编码,也被称为经典编码或香农-福斯特编码,是一种用于无失真数据压缩的编码方法,由克劳德·香农于1948年提出。
该编码方法可以将信息通过二进制数据流传输,以尽可能少的比特数来表示。
为了理解香农编码的原理,需要先了解信息理论的一些基本概念。
首先是信息的概率和信息量。
信息的概率指的是某个事件发生的概率;而信息量是一种度量,表示以二进制形式表示的信息所需要的比特数。
根据信息量的定义,信息量与事件发生的概率成反比。
在香农编码中,我们将每个字符映射到一个唯一的二进制序列,以尽可能少的比特数来表示。
这个序列由两部分组成:前缀码和编码字。
前缀码是一种特殊的编码形式,其中没有任何一个编码字是另一个编码字的前缀。
这样可以确保在解码时不会出现歧义。
那么,如何构建香农编码呢?下面是一步一步的过程:1. 统计字符的出现频率:首先,对待编码的字符进行统计,计算每个字符在信息中出现的频率。
频率越高的字符,其信息量越小,因为它们出现的概率高。
2. 构建概率分布表:将字符按照出现频率的顺序排列,并计算每个字符的出现概率。
概率分布表的目的是为了确定每个字符在编码中所占的比特数。
3. 构建编码树:通过概率分布表,构建一棵编码树。
在构建编码树时,将概率最小的两个字符进行合并,形成一个新的节点,该节点的概率为这两个字符的概率之和。
重复这个过程,直到所有的字符都合并成一个节点。
4. 分配编码字:在编码树的每个分支上分配编码字。
一般来说,向左分支分配0,向右分支分配1。
将编码树中每个叶子节点的编码字串联起来,就是每个字符的编码。
5. 编码和解码:使用构建好的编码对信息进行编码。
在解码时,通过比较编码串与编码表中的编码,逐个识别并解码字符。
香农编码的优点在于,可以根据不同字符的频率分配变长的编码,减小了信息的传输成本。
在统计学上,香农编码接近于理论上的信息上限,即信息熵。
同时,通过构建前缀码,可以确保在解码时不会出现二义性。
香农编码费诺编码
实验目的:通过该实验,掌握通过计算机实验可变长信源编码方法,进一步熟悉香农编码,费诺编码以及霍夫曼编码方法。
实验环境: Matlab7.1实验内容及过程:1.对于给定的信源的概率分布,用MA TLAB语言实现香农编码。
2. 对于给定的信源的概率分布,用MA TLAB语言实现霍夫曼编码。
3. 对于给定的信源的概率分布,用MATLAB语言实现游程编码。
以下为M文件:1.function 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 = 0 ;for 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 * 2 ;if tmp >= 1tmp = tmp - 1 ;c{i}(j) = '1' ;elsec{i}(j) = '0' ;endendendc = fliplr(c) ; c(index) = c ;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 + p2 ;c = huffman(p) ;c{n+1} = strcat(c{n} , '1') ;c{n} = strcat(c{n} , '0') ; index = [index , i1 , i2] ;c(index) = c ;3.% 以下程序是将原图像转换为二值图像image2=image1(:); %将原始图像写成一维的数据并设为image2 image2length=length(image2); % 计算image2的长度for i=1:1:image2length % for 循环,目的在于转换为二值图像if image2(i)>=127image2(i)=255;else image2(i)=0;endendimage3=reshape(image2,146,122); % 重建二维数组图像,并设为image3figure,imshow(image3);%(右图)% 以下程序为对原图像进行游程编码,压缩X=image3(:); %令X为新建的二值图像的一维数据组x=1:1:length(X); % 显示游程编码之前的图像数据figure,plot(x,X(x));j=1;image4(1)=1;for z=1:1:(length(X)-1) % 游程编码程序段if X(z)==X(z+1)image4(j)=image4(j)+1;elsedata(j)=X(z); % data(j)代表相应的像素数据j=j+1;image4(j)=1;endimage4length=length(image4); % 计算游程编码后的所占字节数,记为image4length y=1:1:image4length ; % 显示编码后数据信息figure,plot(y,image4(y));CR=image2length/image4length; % 比较压缩前于压缩后的大小% 下面程序是游程编码解压l=1;for m=1:image4lengthfor n=1:1:image4(m);rec_image(l)=data(m);l=l+1;endendu=1:1:length(rec_image); % 查看解压后的图像数据figure,plot(u,rec_image(u));rec2_image=reshape(rec_image,146,122); % 重建二维二维图像数组figure,imshow(rec2_image); % 显示解压恢复后的图像通过matlab可以看出,程序运行过程中各个变量的值:%右图CR=12.084,说明该游程编码,压缩率为12.084实验结果及分析:p = [0.2 0.15 0.15 0.1 0.1 0.1 0.1 0.1]c1 = shannon(p)c2 = huffman(p)结果:c1 = '000' '010' '001' '1110' '1100' '1011' '1001' '1000'c2 = '111' '101' '110' '000' '001' '010' '011' '100'实验心得:实验应用M文件编写可分别编写不同段的内容,在运行时只需调用函数即可,方便了运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if((b-a)>=1)//判断该组中符号个数是否大于2
{
double sum=0;
for(int i=a;i<=b;i++)
sum+=p[i];//计算该组概率累加和
double s1=0,*s=new double[10];
for(i=a;i<=b;i++)
{
s1+=p[i];s[i]=fabs(2*s1-sum)/sum;
code(k,pa,str,n);
cout<<setw(10)<<"p(ai)"<<setw(10)<<"Pa(aj)"<<setw(10)<<"Ki"<<setw(10)
<<"码字"<<endl;
for(i=0;i<n;i++)
{
cout<<setw(10)<<p[i]<<setw(10)<<pa[i]<<setw(10)<<k[i]<<setw(10)<<str[i] <<endl;
cout<<"信源符号的概率依次为:";
for(int i=0;i<n;i++)
{
cin>>p[i];
}
bubble(p,n);
double *pa=new double[n];
leijia(p,pa,n);
int *k=new int[n];
length(p,k,n);
string *str=new string[n];
for(int i=0;i<n;i++)
{
pa[i]=sum;
sum+=p[i];
}
}
void length(double *p,int *k,int n)//码字的长度
{
for(int i=0;i<n;i++)
{
for(int j=0;j<20;j++)
{
if(j<1-log(p[i])/log(2) && j>=-log(p[i])/log(2) )
2.《C/C++语言程序设计》龚尚福主编,中国矿业大学出版社
费诺编码
一、问题描述
对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。
二、实习目的
掌握通过计算机实现费诺编码。
三、算法分析
3.1、数据结构
本程序采用一个结构体的数据类型来存储费诺编码的相关信息,具体的数据结构如下:
typedef struct
四
2.1、数据结构
分别用数组p、q、k存放输入的概率,累加概率、码字长度;
2.2、算法基本原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码:
1)信源符号按概率从大到小排列;
2)对信源符号求累加和,表达式: Pi=Pi-1+p(xi);
3)求自信息量,确定码字长度。自信息量I(xi)=-log(p(xi));码字长度取大于等于自信息量的最小整数;
{
double s=pa[i];
for(int j=0;j<k[i];j++)
{
s=2*s;
if(s>=1)
{
str[i]+="1";
s=s-1;
}
else str[i]+="0";
}
}
}
void main()
{
int n;
cout<<"信源符号个数n=";
cin>>n;
double *p=new double[n];
《信息论课程设计》
———实现香农编码、费诺编码
信计0801班
杨兴勃
01
香农编码
一、课题描述:
二、课程设计目的:
三、课程设计要求:
四、算法分析:
五、香农编码流程图:
六、程序设计代码:
七、实验结果:
八、总结:
九、参考文献:
费诺编码
一、问题描述:
二、实习目的:
三、算法分析:
四、费诺编码流程图:
五、费诺编码源程序代码:
{
char data;
float P;
}Fano[MAX+1];//需要编码的结构体
3.2、算法基本原理
1)将概率按从大到小的顺序排列;
2)按编码进制数将概率分组,使每组概率和尽可能接近或相等;
3)给每组分配一位码元;
4)将每一分组再按同样原则划分,重复2)和3),直到概率不再可分为止。
四、费诺编码流程图:
k[i]=j;
}
double I=-log(p[i])/log(2);
int temp=int(I);
if(I-temp==0) k[i]=temp;
else k[i]=temp+1;
}
}
void code(int *k,double *pa,string *str,int n)//求编码
{
for(int i=0;i<n;i++)
六、费诺编码测试结果截图:
七、总结:
八、参考文献:
香农编码
一、课题描述:
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
二
(1)进一步熟悉香农编码算法;
(2)掌握程序设计和调试技术中数值的进制转换、数值愈字符串之间的转换等技术。
三
(1)输入:信源符号个数 、信源的概率分布 ;
(2)输出:每一个信源符号对应的香农编码码字。
五、费诺编码源程序代码:
#include<iostream>
#include<math.h>
#include<string>
#include<iomanip>
using namespace std;
//全局变量定义
int n;
string *sign;
double *p;
string *code;
void fano(int a,int b)//费诺编码函数
4)将累加和用二进制表示,并取小数点后码字的长度的码。
五、香农编码流程图:
六
#include<iostream>
#include<math.h>
#include<string>
#include<iomanip>
using namespace std;
void bubble(double *p,int n)//排序
{
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(p[i]<p[j])
{
double temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
}
void leijia(double *p,double *pa,int n)//累加概率
{
double ቤተ መጻሕፍቲ ባይዱum=0.0;
}
}
七、实验结果:
八、总结:
通过本次上机,我对香农编码有了进一步的了解,掌握了其具体过程的实现方法,也对新源编码这一概念有了更加深刻的理解,在编码的过程中,是我对C以及C++语言的基础知识掌握更加牢固,特别是巩固了对输出流格式控制的相关知识,总而言之,这次课程设计实践让我受益匪浅。
九、参考文献:
1.《信息论与编码》(第二版)曹雪虹张宗橙编著,清华大学出版社