实现香农编码、费诺编码杨兴勃0808060121
- 格式:doc
- 大小:47.00 KB
- 文档页数:12
信息论与编码―大作业班级:电信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 编码一、实验目的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 课程设计目的1.1 对数字通信系统主要原理和技术进行研究,包括二进制相移键控(2psk)及解调技术、高斯噪声信道原理、以及信源编码中香农编码、信道编码中hamming码的基本原理等。
1.2 建立完整的基于2psk和(7,4)循环码的数字通信系统仿真模型,包括2psk调制解调及香农、hamming码的编译码;1.3 在信道中加入高斯噪声,观察系统的纠错能力,统计误码率,并进行分析。
1.4 锻炼我们查阅资料、方案比较、团结合作的能力。
学会简单电路的实验调试和整机指标测试方法,增强我们的动手能力。
2 课程设计正文这次课程设计的主要任务是运用MATLAB编程实现2PSK调制解调过程,并且输出其调制及解调过程中的波形,讨论其调制和解调效果。
了解高斯噪声信道原理、以及香农编译码、hamming编译码的原理。
2.1 性能指标2.1.1 用数字基带信号控制载波,把数字基带信号变换为数字带通信号的过程称为数字调制。
本实验详细介绍了PSK波形的产生和仿真过程。
我们可以系统的了解基本原理,以及得到数字调制波形的方法。
利用MATLAB仿真可更好的认识2PSK信号波形的调制过程。
图1 相应的信号波形的示例1 0 12.1.2 将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。
通过本次设计,了解香农—费诺编码的具体过程,通过编程实现编码,利用matlab 实现费诺编码。
2.1.3 当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错,简单的说,汉明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为汉明码。
2.2 matlab代码2.2.1 香农编码%*******************************%香农编码***********************************A=[0.4,0.3,0.1,0.09,0.04,0.07];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-1if abs(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;endendendif 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-2if abs(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'];endendendendp=q;endC=B(:,j);D=find(C==-1);[e,f]=size(D);if e==nj=0;elsej=j+1;endendBAEND2.2.2 香农译码%********************************%香农解码******************************** jg=[];for x=1:100if ccc(x,1)==0&ccc(x,2)==0&ccc(x,3)==0&ccc(x,4)==0 jg(x)=1;elseif ccc(x,1)==0&ccc(x,2)==0&ccc(x,3)==1&ccc(x,4)==0 jg(x)=2;elseif ccc(x,1)==1&ccc(x,2)==1&ccc(x,3)==0&ccc(x,4)==0 jg(x)=3;elseif ccc(x,1)==1&ccc(x,2)==1&ccc(x,3)==0&ccc(x,4)==1 jg(x)=4;elseif ccc(x,1)==1&ccc(x,2)==1&ccc(x,3)==1&ccc(x,4)==0 jg(x)=6;elseif ccc(x,1)==1&ccc(x,2)==1&ccc(x,3)==1&ccc(x,4)==1 jg(x)=5;end;end;jg2.2.3 Hamming编码%******************************汉明编码*********************************** hh=encode(e,7,4,'hamming/fmt');hh2.2.4 Hamming译码%********************************汉明解码********************************* ddd=reshape(bc,7,100);abc=ddd';ccc= decode(abc,7,4,'hamming/fmt')2.2.5 信源%*****************************信源***************************************** aa = randsrc(1,100,[symbols;p]);aae=zeros(100,4)for i = 1 : 1:100switch aa(i)case 1e(i,:)=[0,0,0,0]case 2e(i,:)=[0,0,1,0]case 3e(i,:)=[1,1,0,0]case 4e(i,:)=[1,1,0,1]case 6e(i,:)=[1,1,1,0]case 5e(i,:)=[1,1,1,1]end;end;2.2.6 2psk调制解调%*******************************2PSK调制解调******************************* code=[]for z=0:99for t=1:7code(7*z+t)=hh(z+1,t)endendcp=[];mod1=[];f=2*2*pi;t=0:2*pi/199:2*pi;for n=1:length(code);if code(n)==0;A=zeros(1,200);%每个值200个点elseif code(n)==1;A=ones(1,200);endcp=[cp A]; %s(t),码元宽度200c=cos(f*t);%载波信号mod1=[mod1 c];%与s(t)等长的载波信号,变为矩阵形式endfigure(1);subplot(4,2,1);plot(cp);grid on;axis([0 200*length(code) -2 2]);title('二进制信号序列');cm=[];mod=[];for n=1:length(code);if code(n)==0;B=ones(1,200);%每个值200个点c=cos(f*t); %载波信号elseif code(n)==1;B=ones(1,200);c=cos(f*t+pi); %载波信号endcm=[cm B]; %s(t),码元宽度200mod=[mod c]; %与s(t)等长的载波信号endtiaoz=cm.*mod;%e(t)调制figure(1);subplot(4,2,2);plot(tiaoz);grid on;axis([0 200*length(code) -2 2]);title('2PSK调制信号');figure(2);subplot(4,2,1);plot(abs(fft(cp)));axis([0 200*length(code) 0 400]);title('原始信号频谱');figure(2);subplot(4,2,2);plot(abs(fft(tiaoz)));axis([0 200*length(code) 0 400]);title('2PSK信号频谱');2.2.7 带有高斯白噪声的信道tz=awgn(tiaoz,10);%信号tiaoz中加入白噪声,信噪比为10figure(1);subplot(4,2,3);plot(tz);grid on;axis([0 200*length(code) -2 2]);title('通过高斯白噪声信道后的信号'); figure(2);subplot(4,2,3);plot(abs(fft(tz)));axis([0 200*length(code) 0 400]);title('加入白噪声的2PSK信号频谱');jiet=2*mod1.*tz;%同步解调figure(1);subplot(4,2,4);plot(jiet);grid on;axis([0 200*length(code) -2 2]);title('相乘后信号波形');figure(2);subplot(4,2,4);plot(abs(fft(jiet)));axis([0 200*length(code) 0 400]);title('相乘后信号频谱');2.2.8 低通滤波器fp=300;fs=700;rp=3;rs=20;fn=11025;ws=fs/(fn/2); wp=fp/(fn/2);%计算归一化角频率[n,wn]=buttord(wp,ws,rp,rs);%计算阶数和截止频率[b,a]=butter(n,wn);%计算H(z)figure(4);freqz(b,a,1000,11025);subplot(2,1,1);axis([0 4000 -100 3 ])title('LPF幅频相频图');jt=filter(b,a,jiet);figure(1);subplot(4,2,5);plot(jt);grid onaxis([0 200*length(code) -2 2]);title('经低通滤波器后信号波形')figure(2);subplot(4,2,5);plot(abs(fft(jt)));axis([0 200*length(code) 0 400]);title('经低通滤波器后信号频谱');2.2.9 抽样判决bc=[];for m=1:200*length(code);if jt(m)<0;jt(m)=1;elseif jt(m)>=0;jt(m)=0;endendfor bx=0:699bc(bx+1)=jt(bx*200+100)endbcfigure(1);subplot(4,2,6);plot(bc);grid onaxis([0 200*length(code) -2 2]);title('经抽样判决后信号s^(t)波形')figure(2);subplot(4,2,6);plot(abs(fft(bc)));axis([0 length(code) 0 50]);title('经抽样判决后信号频谱');2.2.10 误码率%**********************误码率************************************** [zcl,mc]=symerr(jg,aa)2.3 程序执行图3 总结一周的基于MATLAB的数字调制信号仿真分析课程设计让我获益颇深。
多媒体技术实验报告学院:城南学院姓名:学号:指导老师:尹波息符号按其出现的概率依次由大到小排列开来,并将排列好的信源符号按概率值分N大组,使N组的概率之与近似相同,并对各组赋予一个N进制码元0、1……N-1。
之后再针对每一大组内的信源符号做如上的处理,即再分为概率与相同的N组,赋予N进制码元。
如此重复,直至每组只剩下一个信源符号为止。
此时每个信源符号所对应的码字即为费诺码。
具体过程如下:[1] 将信源消息符号按其出现的概率大小依次排列:P1>=P2>=…>=Pn。
[2] 依次排列的信源符号按概率值分为两大组,使两个组的概率之与近似相同,并对各组赋予一个二进制码元“0”与“1”。
[3] 使划分后的两个组的概率之与近似相同,并对各组赋予一个二进制符号“0”与“1”。
[4] 如此重复,直至每个组只剩下一个信源符号为止。
[5] 信源符号所对应的码字即为费诺码。
例:有一幅40个像素组成的灰度图像,灰度共有5级,分别用符号A,B,C,D与E表示。
40个像素中出现灰度A的像素数有15个,出现灰度B的像素数有7个,出现灰度C的像素数有7个,其余情况见表。
费诺编码方法属于概率匹配编码,具有如下特点:1、概率大,则分解次数小;概率小则分解次数多。
这符合最佳码原则。
2、码字集合就是唯一的。
3、分解完了,码字出来了,码长也有了,即先有码字后有码长。
因此,费诺编码方法又称为子集分解法。
3、程序设计思路4、程序代码clc;clear;A=[0、19,0、18,0、17,0、16,0、13,0、10,0、06,0、01]; 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-1if abs(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;endendendif 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-2if abs(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'];endendendendp=q;endC=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;endavlen=sum(L、*A)H=-sum(A、*log2(A));disp(['ENtropy of the source:',num2str(H),'bits']);5、实验结果①实验运行结果(以[0、19,0、18,0、17,0、16,0、13,0、10,0、06,0、01]为例)②计算:信息熵就是多少?上述编码方法的平均码长就是多少?信息熵就是2、7829; 平均码长就是2、88;。
function varargout = sy(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @sy_OpeningFcn, ...'gui_OutputFcn', @sy_OutputFcn, ...'gui_LayoutFcn', [], ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); elsegui_mainfcn(gui_State, varargin{:});endfunction sy_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;guidata(hObject, handles);function varargout = sy_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;function edit1_Callback(hObject, eventdata, handles)function edit1_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction radiobutton2_Callback(hObject, eventdata, handles)set(handles.radiobutton3,'value',0);function radiobutton3_Callback(hObject, eventdata, handles)set(handles.radiobutton2,'value',0);function listbox3_Callback(hObject, eventdata, handles)function listbox3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit3_Callback(hObject, eventdata, handles)function edit3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit4_Callback(hObject, eventdata, handles)function edit4_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction listbox4_Callback(hObject, eventdata, handles)function listbox4_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit5_Callback(hObject, eventdata, handles)function edit5_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction pushbutton9_Callback(hObject, eventdata, handles) r1=get(handles.radiobutton2,'value');if r1==1s1=get(handles.edit1,'String')len=length(s1);t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b)for i=1:La=0;for j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendcount=count/len;p=countl=0;H=-p*(log2(p))';for i=1:L-1for j=i+1:Lif p(i)<=p(j)m=p(j);p(j)=p(i);p(i)=m;endendendfor i=1:La=-log2(p(i));w(i)=fix(a+1);l=l+p(i)*w(i);endn=H/l;P(1)=0;for i=2:LP(i)=0;for j=1:i-1P(i)=P(i)+p(j);endendfor i=1:Lfor j=1:w(i)W(i,j)=fix(P(i)*2);P(i)=P(i)*2-fix(P(i)*2);endout{i,:}=num2str(W(i,:));endset(handles.listbox6,'String',p); for i=1:L-1 %for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendset(handles.listbox5,'string',b'); set(handles.edit5,'String',H);set(handles.listbox4,'String',out); set(handles.edit3,'String',l);set(handles.edit4,'String',n);elses1=get(handles.edit1,'String')len=length(s1)t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b);for i=1:Lfor j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendfor i=1:L-1for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendcount=count/len;p=countfor i=1:L-1for j=i+1:Lif p(i)<p(j)m=p(j);p(j)=p(i);p(i)=m;endendendc=fano(p);c1=str2double(c')n=length(c);k=[];for i=1:nk=[k,length(c{i})];endH=-p*(log2(p))';mc=p*k'n=H/mcset(handles.edit5,'String',H);set(handles.listbox4,'String',c1);set(handles.edit3,'String',mc);set(handles.edit4,'String',n);set(handles.listbox5,'string',b');set(handles.listbox6,'string',p);endfunction listbox5_Callback(hObject, eventdata, handles) function listbox5_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction listbox6_Callback(hObject, eventdata, handles) function listbox6_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end。
《信息论课程设计》———实现香农编码、费诺编码信计0801班杨兴勃0808060121目录香农编码一、课题描述:对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
二、课程设计目的:(1)进一步熟悉香农编码算法;(2)掌握程序设计和调试技术中数值的进制转换、数值愈字符串之间的转换等技术。
三、课程设计要求:q、信源的概率分布P;(1)输入:信源符号个数(2)输出:每一个信源符号对应的香农编码码字。
四、算法分析:2.1、数据结构分别用数组p、q、k存放输入的概率,累加概率、码字长度;2.2、算法基本原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码:1)信源符号按概率从大到小排列;2)对信源符号求累加和,表达式: P i=P i-1+p(x i);3)求自信息量,确定码字长度。
自信息量I(x i)=-log(p(x i));码字长度取大于等于自信息量的最小整数;4)将累加和用二进制表示,并取小数点后码字的长度的码。
五、香农编码流程图:开始输入符号个数N和相应概率X[i]按概率由大到小排序按公式求码长求出对应位的概率累加和按乘2取余法则,将累加概率转换为二进制结合求得的对应码长,将二进制的累加概率取对应长度的作为相应码字输出信源、概率、累加概率、码长和码字结束六、程序设计代码:#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 sum=0.0;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) )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++)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];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];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;}}七、实验结果:八、总结:通过本次上机,我对香农编码有了进一步的了解,掌握了其具体过程的实现方法,也对新源编码这一概念有了更加深刻的理解,在编码的过程中,是我对C以及C++语言的基础知识掌握更加牢固,特别是巩固了对输出流格式控制的相关知识,总而言之,这次课程设计实践让我受益匪浅。
functi on vararg out = sy(vararg in)gui_Si nglet on = 1;gui_St ate = struct('gui_Na me', mfilen ame, ...'gui_Si nglet on', gui_Si nglet on, ...'gui_Op ening Fcn', @sy_Ope ningF cn, ...'gui_Ou tputF cn', @sy_Out putFc n, ...'gui_La youtF cn', [], ...'gui_Ca llbac k', []);if nargin && ischar(vararg in{1})gui_St ate.gui_Ca llbac k = str2fu nc(vararg in{1});endif nargou t[vararg out{1:nargou t}] = gui_ma infcn(gui_St ate, vararg in{:}); elsegui_ma infcn(gui_St ate, vararg in{:});endfuncti on sy_Ope ningF cn(hObjec t, eventd ata, handle s, vararg in) handle s.output = hObjec t;guidat a(hObjec t, handle s);functi on vararg out = sy_Out putFc n(hObjec t, eventd ata, handle s) vararg out{1} = handle s.output;functi on edit1_Callb ack(hObjec t, eventd ata, handle s)functi on edit1_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on radiob utton2_Cal lback(hObjec t, eventd ata, handle s)set(handle s.radiob utton3,'value',0);functi on radiob utton3_Cal lback(hObjec t, eventd ata, handle s)set(handle s.radiob utton2,'value',0);functi on listbo x3_Ca llbac k(hObjec t, eventd ata, handle s)functi on listbo x3_Cr eateF cn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on edit3_Callb ack(hObjec t, eventd ata, handle s)functi on edit3_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on edit4_Callb ack(hObjec t, eventd ata, handle s)functi on edit4_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on listbo x4_Ca llbac k(hObjec t, eventd ata, handle s)functi on listbo x4_Cr eateF cn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on edit5_Callb ack(hObjec t, eventd ata, handle s)functi on edit5_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on pushbu tton9_Call back(hObjec t, eventd ata, handle s) r1=get(handle s.radiob utton2,'value');if r1==1s1=get(handle s.edit1,'String')len=length(s1);t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b)for i=1:La=0;for j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendcount=count/len;p=countl=0;H=-p*(log2(p))';for i=1:L-1for j=i+1:Lif p(i)<=p(j)m=p(j);p(j)=p(i);p(i)=m;endendendfor i=1:La=-log2(p(i));w(i)=fix(a+1);l=l+p(i)*w(i);endn=H/l;P(1)=0;for i=2:LP(i)=0;for j=1:i-1P(i)=P(i)+p(j);endendfor i=1:Lfor j=1:w(i)W(i,j)=fix(P(i)*2);P(i)=P(i)*2-fix(P(i)*2);endout{i,:}=num2st r(W(i,:));endset(handle s.listbo x6,'String',p); for i=1:L-1 %for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendset(handle s.listbo x5,'string',b'); set(handle s.edit5,'String',H);set(handle s.listbo x4,'String',out); set(handle s.edit3,'String',l);set(handle s.edit4,'String',n);elses1=get(handle s.edit1,'String')len=length(s1)t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b);for i=1:Lfor j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendfor i=1:L-1for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendcount=count/len;p=countfor i=1:L-1for j=i+1:Lif p(i)<p(j)m=p(j);p(j)=p(i);p(i)=m;endendendc=fano(p);c1=str2do uble(c')n=length(c);k=[];for i=1:nk=[k,length(c{i})];endH=-p*(log2(p))';mc=p*k'n=H/mcset(handle s.edit5,'String',H);set(handle s.listbo x4,'String',c1);set(handle s.edit3,'String',mc);set(handle s.edit4,'String',n);set(handle s.listbo x5,'string',b');set(handle s.listbo x6,'string',p);endfuncti on listbo x5_Ca llbac k(hObjec t, eventd ata, handle s) functi on listbo x5_Cr eateF cn(hObjec t, eventd ata, handle s) if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on listbo x6_Ca llbac k(hObjec t, eventd ata, handle s) functi on listbo x6_Cr eateF cn(hObjec t, eventd ata, handle s) if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');end。
香农--费诺编码的matlab实现学院:------ 班级:-----姓名:----学号:----摘要:用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。
编码在电子计算机、电视、遥控和通讯等方面广泛使用。
其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用matlab实现费诺编码。
关键字:信息论,费诺编码,matlab正文:费诺编码也是一种常见的信源编码方法。
信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号.依次下去,直至每一个小组只剩下一个信源符号为止.这样,信源符号所对应的码符号序列则为编得的码字.香农--费诺编码的matlab实现编码如下:clc;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-1if abs(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;endendendif 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-2if abs(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'];endendendendp=q;endC=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;endavlen=sum(L.*A)实验总结:。