欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    香农编码基于C++语言的实现(共12页).doc

    • 资源ID:13985560       资源大小:169KB        全文页数:12页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    香农编码基于C++语言的实现(共12页).doc

    精选优质文档-倾情为你奉上香农编码基于C+语言的实现 摘要:1948年,美国工程师香农在贝尔实验室杂志上发表了长文通讯的数学原理,他用概率测度和数理统计的方法系统地讨论了通信的基本问题,得出了几个重要而带有普遍意义的结论,并由此奠定了现代信息论的基础。香农编码将信源编码后所得的二进制代码。编码是指为了达到某种目的而对信号进行的一种变换。根据编码的目的不同,编码理论有三个分支:信源编码。对信源输出的信号进行变换,包括连续信号的离散化,即将模拟信号通过采样和量化变成数字信号,以及对数据进行压缩,提高数字信号传输的有效性而进行的编码。信道编码。对信源编码器输出的信号进行再变换,包括区分通路、适应信道条件和提高通信可靠性而进行的编码。保密编码。对信道编码器输出的信号进行再变换,即为了使信息在传输过程中不易被人窃取而进行的编码。本文介绍香农编码的编码过程和C+语言代码实现。Abstract: in 1948, American Engineer Shannon in the Baer lab magazine published the article "the mathematical theory of communication", his method of probability and mathematical statistics systematically discussed the basic problems of the communication, obtained several important and universal conclusions, and thus laid the foundation of modern information theory. The Shannon code into the binary code obtained after source coding. Coding refers to a transformation in order to achieve a certain purpose and the signal. According to the code for different purposes, the code theory has three branches: source code. The signal source to transform the output, including the continuous signal discretization, the analog signal into digital signal through the sampling and quantization, and compressing the data, to improve the validity of the digital signal transmission and coding. The channel coding. The source coder output signal to transform, including distinguishing pathways, adapting to the channel conditions and improve the reliability of communication and coding. The secret code. Signal on the output of the channel encoder to transform, namely, in order to make the information in the transmission process is not easy to be stolen and coding. This paper introduced the Shannon code encoding process and C language code to achieve.关键词:累加概率、排序、熵、码长、二元码1 香农编码原理1.1信源编码器将信源符号序列按一定的数学规律映射成码符号的过程称为信源编码,完成编码功能的器件,称为编码器。接受端有一个译码器完成相反的功能。图1-1 信源编码模型。信源编码器图 11信源编码器的输入是信源符号集,共有q个信源符号。同时存在另一个符号集,称为码符号集,共有r个码符号,码符号集中的元素称为码元或者码符号。编辑器输出的符号序列称为码。信源符号对应,须用个码符号来表示,称为码字长度,简称码长。能够获得最佳编码的方法主要有:香农(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。1.2码的分类1. 分组码和非分组码将信源符号集中的每个信源符号固定的映射成一个码字,这样的码成为分组码,又称为块码。与分组码对应的分类是非分组码,又称树码。2. 奇异码和非奇异码若一种分组码种的所有码字都不相同,则称此分组码为非奇异码,否则称为奇异码。3. 唯一可译码和非唯一可译码任意有限长的码元序列,只能够唯一地分割成一个个码字,便称为唯一可译码。4. 即时码和非即时码无需考虑后续码符号就可以从码符号序列译出码字,这样的唯一可译码称为即时码。一个唯一可译码称为即时码的充分必要条件是其中任何一个码字都不是其他码字的前缀。综上所述,可将码作如下分类:码非分组码分组码奇异码非奇异码非唯一可译码唯一可译码非即时码即时码 图 121.3香农第一定理设离散无记忆信源S的信源熵,它的N次扩展信源,其熵。并用码符号对信源进行变长编码,那么总可以找到一种唯一的可译,使每个信源符号所需的平均码长满足 公式 1或者写成 公式 2式中,其中是扩展信源的信源符号所对应的码字长度,因此是扩展信源的信源符号的平均码长。平均码长满足 公式 3即 公式 41.4香农编码步骤香农第一定理指出了平均码长与信源熵之间的关系,同时也指出了可以通过编码使码长达到极限值。香农编码的方法是选择每个码长长度,满足 公式 5香农编码的具体如下:(1) 将所有q个信源符号按其概率的递减次序 排列。(2) 按下式依次计算每个信源符号的二元码码长。 公式 6(3) 计算每个信源符号的累加概率,并变换成二进制小数得到其码字。累加概率 公式 7(4) 将累加概率变换成二进制小数,取小数点后位数作为第i个信源符号的码字。1.5香农编码的不足通过对香农码的编码算法进行分析研究,可以发现在香农编码过程中,由于先限定每个码字的码长,以至于在码字的选取中是以每个码字的码长作为先决条件而没有考虑各个码字之间的相关性,因此编出的码字往往存在较大的冗余,比如其中某个码字原本可以编为1111,但由于根据香农编码规则该码字的先定码长为7,于是该码字的码长必须为7.很显然由于码长先决条件的限制,而使得整个码字的平均码长变大,无形中降低了编码效率,增加了通信过程中的冗余,使得通信系统的有效性这一重要指标的提高得到了很大限制。1.6香农编码的优化 在编码过程中,忽略每个码字该有的码长限定,只需要根据最小概率计算出最小概率所对应的码长Z,将该码长作为参考值计算出所有累加概率所对应的二进制串,所有二进制串的长度均为Z,然后从每个长为Z的二进制串中选择最后的码字,其原则是任意一个码字一定不是前后备用码的前缀同时码字的选择必须要从二进制串的最左端开始,从左往右依次选取。根据该优化原理,具体过程可以描述如下:1) 将信源发出的y符号按其概率递减顺序进行排列 公式 82) 计算概率最小符号的对数值,其中 公式 93) 计算出第i个符号的累加概率 4) 将每个符号所对应的累加概率变换成二进制小数,取小数后面的l位作为备用码。5) 从概率最大的符号所对应的备用码开始,采用比较方法选取该符号所对应的码字,原则为:码字的选取从备用码的第一个二进制位开始从前往后依次选取,选取的码字不能是前后备用码的前缀,每个码字的选取尽可能短。2香农编码实例按照香农编码步骤,对一个有7个信源符号的信源编码。例如当i=4时,先求第4个信源符号的二元码的码长: 公式 10因此码长取为3。 表格 2-1信源符号概率累加概率码长二元码S10.2002.343000S20.190.22.413001S30.180.392.483011S40.170.572.563100S50.150.742.743101S60.100.593.3441110S70.010.996.667再计算累加概率: 公式 11将累加概率变成二进制小数: 公式 12即 公式 13根据码长取小数点后三位作为第四个信源符号的二元码,即“100”。其他的信源符号编码可依次求得。由表2-1可以看出,一共5个三位的二元码,个码字至少有以为码符号不同。这个码就是唯一可译码,而且是即时码。 平均码长: 公式 14 编码后的信息传输率: 公式 153 香农编码C+实现的算法介绍3.1 算法介绍C+是一种使用非常广泛的计算机编程语言,是一种面向对象的程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。利用C+语言的结构体知识可以对香农编码定义一个结构体(struck ShannonCode),结构体种允许不同的数据类型成员。能够结构化,层次清晰的对香农的编码过程中的概率排序、概率累加、求码长、求二元码等一系列的准确的代码呈现。并且根据概率累加公式、码长公式、二元码算法等计算并输出相应的数据。3.2 程序功能介绍程序主要有三个函数完成,分别是主函数(void mian()、输入函数(void input()、输出函数(void Display()。在程序开始定义:头文件以及可输入的最大的信源个数,并且给出了香农编码结构体(struct ShannonCode)以数组的方式存储信息。#include<iostream>#include<math.h>using namespace std;/定义可输入的最大的信源个数#define MAX 100 /定义ShannonCode(香农编码)结构体struct ShannonCode double x;/字符概率double y;/字符概率类加int k;/码字长度int code;/第i个消息符号的码字xMAX;在输入信息概率是先确定输入的信源个数,然后再进行循环输入每个信源概率,在输入的过程中对所有信源累加求和,若和不等于1,将递归调用Input()函数重新输入信源概率:for(i=0;i<m;i+) cout<<"P(x"<<i+1<<"):"cin>>ai; sum=sum+ai;if(sum!=1)cout<<"输入概率和是"<<sum<<"不为1,请重输"am=NULL;/若不满足概率和为1,递归调用概率输入函数Input(); 在VC中若输入的信源正确,那么程序将会在Display()函数中执行相应的概率排序功能、概率累加功能、计算码长功能、计算二元码功能。详细代码如表2。表格 2/将概率由大到小排序for(i=0;i<n;i+)max=i;for(j=i+1;j<n;j+) if(xi.x<=xj.x)max=j; t=xi.x;xi.x=xmax.x;xmax.x=t;/计算码长for(i=0;i<n;i+) I=-log(xi.x)/log(2);if(I-(int)I=0)xi.k=(int)I;else xi.k=(int)I+1;/概率累加for(i=0;i<n;i+)if(i!=0) p+=xi-1.x;xi.y=p;else xi.y=0;/计算并输出二元码float t=xi.y;for(j=0;j<xi.k;j+)t=t*2;if(t>=1)cout<<"1"t=t-1;elsecout<<"0"3.3程序执行结果4参考文献1 石峰,莫忠息. 信息论基础.武汉:武汉大学出版社,2006.2李梅,李亦农.信息论基础教程.北京:北京邮电大学出版社,2009.3叶中行.信息论基础.北京:高等教育出版社,2003.4傅祖芸.信息论基础理论与应用.北京:点子工业出版社,2011.5张燕红,刘瑜,孟海翠,刘晓娣.香农编码与香农-弗诺编码方法的研究及C#实现.电脑知识与技术,2013.6邵军花,刘玉红,邸敬,周东梅.香农编码的优化算法研究J.兰州交通大学学报,2010.5附录#include<iostream>#include<math.h>using namespace std;/定义可输入的最大的信源个数#define MAX 100 /定义ShannonCode(香农编码)结构体struct ShannonCode double x;/字符概率double y;/字符概率类加int k;/码字长度int code;/第i个消息符号的码字xMAX;/* 信源概率排序、概率累加、求码长、求二元 码、并且以表格的形式输出相关数据信息*/void Display(double a,int n) int i,j,max;double I=0,t,p=0;for(i=0;i<n;i+) xi.x=ai; /将概率由大到小排序for(i=0;i<n;i+)max=i;for(j=i+1;j<n;j+) if(xi.x<=xj.x)max=j; t=xi.x;xi.x=xmax.x;xmax.x=t; /计算码长for(i=0;i<n;i+) I=-log(xi.x)/log(2);if(I-(int)I=0)xi.k=(int)I;else xi.k=(int)I+1;cout<<endl;cout<<"信源符号xi"<<"t概率p(xi)"<<"t累加概率"<<"t码字长度"<<"t二元码"<<endl;for(i=0;i<n;i+)/概率累加if(i!=0) p+=xi-1.x;xi.y=p;else xi.y=0;cout<<" "<<"S"<<i+1<<"tt "<<xi.x<<"tt "<<xi.y<<"tt "<<xi.k<<"tt"/计算并输出二元码float t=xi.y;for(j=0;j<xi.k;j+)t=t*2;if(t>=1)cout<<"1"t=t-1;elsecout<<"0"cout<<endl;cout<<endl;/数据输入函数void Input()int i,m;double sum=0;double aMAX;cout<<"输入信源个数:"cin>>m; cout<<"输入"<<m<<"个该信源概率:"<<endl;for(i=0;i<m;i+) cout<<"P(x"<<i+1<<"):"cin>>ai; sum=sum+ai;if(sum!=1)cout<<"输入概率和是"<<sum<<"不为1,请重输"am=NULL;/若不满足概率和为1,递归调用概率输入函数Input(); /输出相关信息else Display(a,m);/主函数void main() Input();专心-专注-专业

    注意事项

    本文(香农编码基于C++语言的实现(共12页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开