信息论与编码课程设计
- 格式:doc
- 大小:107.93 KB
- 文档页数:16
信息论与编码课程设计一、课程背景信息和通信技术的快速发展,使得我们的生活变得越来越依赖于数字信息处理。
在现代通信系统中,信息的传输、存储、处理和安全性等方面的问题得到了广泛的关注和研究。
而信息论和编码技术作为数字通信系统的基础知识和技能之一,对于了解数字通信和信息处理领域具有重要的意义。
二、课程目标本门课程旨在使学生掌握以下内容:1.熟悉信息论的基本概念和理论框架;2.理解信源编码和信道编码的基本原理和实际应用;3.掌握一些典型的编码技术,如香农编码、哈夫曼编码、CRC 等;4.能够分析和评估不同的编码方案,并设计实际的编码系统;5.熟练掌握 MATLAB 编程,通过编程实现和模拟不同的编码方案。
三、课程教学方式本门课程采用讲授理论基础、案例分析、编码设计实践、编程实现等多种教学方式相结合,注重理论与实践的结合,充分激发学生的学习兴趣和创新思维。
四、课程内容1. 信息论基础信息的概念和量化,信息的熵和条件熵,信息的熵编码和香农编码,信道容量和误差概率等内容。
2. 信源编码离散无记忆信源的编码,霍夫曼编码,自适应霍夫曼编码,算术编码等内容。
3. 信道编码编码和译码的基本概念,线性块编码,循环冗余校验码CRC,卷积码,卷积码译码等内容。
4. 码量与码率控制码率控制的概念,码率控制的基本方法,码率控制的实现等内容。
5. 信道编码的应用无线通信系统中信道编码的应用,如GSM和CDMA系统等,数字电视的信道编码等内容。
五、课程设计1. 课程设计目标本门课程设计的目标是让学生通过实际的编码设计和仿真实现对课程所学理论知识的理解和掌握,提高学生的创新能力和实际应用能力。
2. 课程设计内容1.实际编码案例的分析和评估;2.编码方案的设计和实现;3.编码方案的性能分析和比较;4.编码系统的仿真和调试。
3. 课程设计时间安排•第一周:课程设计介绍和案例选题;•第二周:方案设计和实现;•第三周:性能分析和比较;•第四周:编码系统的仿真和调试;•第五周:报告制作和展示。
信息论与编码技术实验教案第一章:信息论基础1.1 信息的概念与度量介绍信息的基本概念,信息源的随机性,信息的不确定性。
讲解信息的度量方法,如香农熵、相对熵等。
1.2 信道模型与容量介绍信道的概念,信道的传输特性,信道的噪声模型。
讲解信道的容量及其计算方法,如单符号信道、多符号信道等。
第二章:信源编码与压缩2.1 信源编码的基本概念介绍信源编码的定义、目的和方法。
讲解信源编码的基本原理,如冗余度、平均冗余度等。
2.2 压缩算法与性能评价介绍无损压缩算法,如霍夫曼编码、算术编码等。
讲解有损压缩算法,如JPEG、MP3等。
分析各种压缩算法的性能评价指标,如压缩比、重建误差等。
第三章:信道编码与错误控制3.1 信道编码的基本概念介绍信道编码的定义、目的和方法。
讲解信道编码的基本原理,如纠错码、检错码等。
3.2 常见信道编码技术介绍常用的信道编码技术,如卷积码、汉明码、奇偶校验等。
分析各种信道编码技术的性能,如误码率、编码效率等。
第四章:数字基带传输4.1 数字基带信号与基带传输介绍数字基带信号的概念,数字基带信号的传输特性。
讲解数字基带信号的传输方法,如无编码调制、编码调制等。
4.2 基带传输系统的性能分析分析基带传输系统的性能指标,如误码率、传输速率等。
讲解基带传输系统的优化方法,如滤波器设计、信号调制等。
第五章:信号检测与接收5.1 信号检测的基本概念介绍信号检测的定义、目的和方法。
讲解信号检测的基本原理,如最大后验概率准则、贝叶斯准则等。
5.2 信号接收与性能分析分析信号接收的方法,如同步接收、异步接收等。
讲解信号接收性能的评价指标,如信噪比、误码率等。
第六章:卷积编码与Viterbi算法6.1 卷积编码的基本原理介绍卷积编码的定义、结构及其多项式。
讲解卷积编码的编码过程,包括初始状态、状态转移和输出计算。
6.2 Viterbi算法及其应用介绍Viterbi算法的原理,算法的基本步骤和性能。
讲解Viterbi算法在卷积编码解码中的应用,包括路径度量和状态估计。
《信息论与编码》课程教学大纲Information Theory & Codec.一、课程教学目标1、性质和地位:信息论与编码是通信工程(与计算机通信)专业的一门重要的专业课。
该课程是继通信原理与程控交换之后,为从事通信信息的编码研究学习而开设的专业必修或选修课。
2、知识要求:本课程的教学目的是通过教学和必要的练习、实践环节,使学生了解信息论的信源、信源炳概念,熟悉信源、信道编码定理,掌握一些重要的编码方法,为将来从事通信信息资源研发应用打好必要的基础。
3、能力要求:除课堂学习理论知识之外,通过练习与实践掌握一些常用的编码定理与编码方法,加深对信息论编码与通信可靠性、安全性的关系的认识。
二、教学原则和基本要求本课程教学采用课堂讲授与课外作业为主,以必要实习、实践(4~8学时)为辅的方法教学,通过本课程学习应达到如下基本要求:1.了解信息论信源炳重要基本概念;2.了解信息论的信源、信道编码定理;3.掌握信源炳的计算;4.掌握无失真信源最佳编码法(香农码、费诺码、哈夫曼码);5.掌握限失真信源常用编码法;6.了解几种信道差错编码及密码编码原理与方法。
三、教学内容和学时分配1.总体安排:本课程授课时间为48学时,3学分。
具体授课内容与学时列表分配如下: 教学内容章目本课程学分:3学时分配讲课学时课堂讨论编程实习合计第一章绪论1第二章信源及信源嫡8第三章无失真信源编码72第四章限失真信源编码9第五章信道编码132第六章密码学6合计444482.具体要求:第一章绪论[目的要求]了解信息论的发展及通信系统的模型。
[教学内容]信息论的发展,通信系统的模型。
[重点难点]无。
[教学方法]课堂教学。
[作业]无。
[课时]1学时第二章信源及信源炳[目的要求]了解信源的信息量与嫡的概念,掌握信源炳的计算。
[教学内容]信源的描述分类,离散信源的炳和互信息,连续信源的炳和互信息, 离散序列信源的炳,冗余度。
[重点难点]自信息量、互信息,炳的计算。
信息论与编码技术实验教案第一章:信息论基础1.1 实验目的1. 了解信息的基本概念及其度量方法;2. 掌握信息的熵、冗余度和信道容量等基本概念。
1.2 实验原理1. 信息的基本概念:信息、消息、信源等;2. 信息的度量:平均信息量、熵、冗余度等;3. 信道容量和编码定理。
1.3 实验设备与材料1. 计算机及投影仪;2. 相关实验软件。
1.4 实验步骤1. 讲解信息的基本概念及其度量方法;2. 分析实际例子,演示信息的熵、冗余度和信道容量的计算过程;3. 让学生通过实验软件进行相关计算和分析。
1.5 思考与讨论1. 信息量与消息长度的关系;2. 信道容量在实际通信系统中的应用。
第二章:数字基带编码2.1 实验目的1. 掌握数字基带编码的基本原理;2. 学会使用相关软件进行数字基带编码的仿真。
2.2 实验原理1. 数字基带编码的定义和分类;2. 常用数字基带编码方法:NRZ、RZ、曼彻斯特编码等;3. 数字基带编码的性能评估:误码率、带宽利用率等。
2.3 实验设备与材料1. 计算机及投影仪;2. 相关实验软件。
2.4 实验步骤1. 讲解数字基带编码的基本原理和方法;2. 演示常用数字基带编码的仿真效果;3. 让学生通过实验软件进行数字基带编码的仿真实验。
2.5 思考与讨论1. 数字基带编码的优缺点;2. 如何在实际通信系统中选择合适的基带编码方法。
第三章:信道编码与误码控制3.1 实验目的1. 了解信道编码的基本原理;2. 掌握常见的信道编码方法;3. 学会使用相关软件进行信道编码的仿真。
3.2 实验原理1. 信道编码的定义和作用;2. 常用信道编码方法:卷积编码、汉明编码、里德-所罗门编码等;3. 误码控制原理:检错、纠错等。
3.3 实验设备与材料1. 计算机及投影仪;2. 相关实验软件。
3.4 实验步骤1. 讲解信道编码的基本原理和方法;2. 演示常用信道编码的仿真效果;3. 让学生通过实验软件进行信道编码的仿真实验。
一设计目的信息论与编码是我们电子信息工程的一门重要的专业课,通过对本次课程设计,学习将学到的理论知识用于实践,同时也学习了用软件编写程序,进一步对本课程知识的巩固和理解。
学习分析问题,解决问题的方法和途径,提高对本专业的学习兴趣。
二设计任务与要求(1)统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。
(2)哈夫曼编码要求:任意输入消息概率,利用哈夫曼编码方法进行编码,并计算信源熵和编码效率。
三理论简介3.1通信系统的模型通信系统的模型通信系统的性能指标主要是有效性、可靠性、安全性和经济性,通信系统优化就是使这些指标达到最佳,除了经济性,这些指标正是信息论的研究对象,可以通过各种编码处理来使通信系统的性能最优化。
根据信息论的各种编码定理和上述通信系统的指标,编码问题可以分为3类:信源编码、信道编码和加密编码。
3.1.1 信源编码由于信源符号之间存在分布不均匀和相关性,使得信源存在冗余度,信源编码的主要任务就是减少冗余度,提高编码效率。
信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理。
前者适用于离散信源或数字信号;后者主要用于连续信源或模拟信号。
本次课程设计就是利用的无失真信源编码。
3.1.2 信道编码信源编码器的作用:把信源发出的消息变换成由二进制码元(或多进制码元)组成的代码组,这种代码组就是基带信号。
同时通过信源编码可以压缩信源的冗余度,以提高通信系统传输消息的效率。
信源译码器的作用:把信道译码器输出的代码组变换成信宿所需要的消息形式,它的作用相当于信源编码器的逆过程。
3.1.3 加密编码加密编码是研究如何隐蔽消息中的信息内容,以便在传输过程中不被窃听,提高通信系统的安全性。
3.2 信源熵3.2.1 信源的描述和分类& 按信源在时间和幅度上的分布情况离散信源:文字、数据、电报连续信源:语音、图像& 按发出符号的数量单个符号信源:指信源每次只发出一个符号代表一个消息符号序列信源:指信源每次发出一组含二个以上符号的符号序列代表一个消息 & 按符号间的关系无记忆信源有记忆信源3.2.2 离散信源熵& 自信息量:随机事件的自信息量定义为其概率对数的负值,即在信息论中常用的对数底是2,信息量的单位为比特(bit);& 联合自信息量两个消息xi ,yj 同时出现的联合自信息量:& 条件自信息量在事件yj 出现的条件下,随机事件xi 发生的条件概率为p(xi / yj) ,则它的条件自信息量定义为条件概率对数的负值:& 离散信源熵为信源中各个符号不确定度的数学期望,即单位为:比特/符号 或者 比特/符号序列。
信息与编码论课程设计一、课程目标知识目标:1. 学生能理解信息与编码的基本概念,掌握不同编码方式的特点及应用场景。
2. 学生能掌握二进制、十进制等数制转换方法,并运用这些方法进行编码和解码。
3. 学生了解信息安全的基本原理,认识到保护信息的重要性。
技能目标:1. 学生具备运用二进制进行简单计算和信息编码的能力。
2. 学生能够运用所学知识,分析并解决实际问题,例如:设计一个简单的加密和解密程序。
3. 学生能够通过合作与交流,共同探讨信息与编码的应用,提高团队协作能力。
情感态度价值观目标:1. 学生培养对信息科学的兴趣,激发探究精神,树立创新意识。
2. 学生认识到信息与编码在科技发展和社会生活中的重要作用,增强社会责任感。
3. 学生在合作交流中,学会尊重他人,培养良好的沟通能力和团队协作精神。
课程性质:本课程为理论与实践相结合的课程,旨在帮助学生掌握信息与编码的基本知识,提高实际操作能力。
学生特点:六年级学生具有一定的逻辑思维能力和自主学习能力,对新鲜事物充满好奇,喜欢探索和挑战。
教学要求:注重启发式教学,引导学生主动参与,培养实践操作能力;关注学生个体差异,因材施教,提高教学质量。
通过分解课程目标为具体学习成果,使学生在课程学习中获得全面、均衡的发展。
二、教学内容1. 信息与编码基本概念:介绍信息的定义、特性及编码的必要性;讲解不同编码方式(如:文字编码、图像编码、声音编码等)及其应用场景。
教材章节:第一章 信息与编码基本概念2. 数制转换:重点讲解二进制与十进制的转换方法,拓展至其他进制转换;通过实例分析,使学生掌握数制转换在实际应用中的运用。
教材章节:第二章 数制转换及其应用3. 编码与解码:以二进制编码为例,讲解编码和解码的基本原理;引导学生运用所学知识进行简单的编码与解码实践。
教材章节:第三章 编码与解码技术4. 信息安全:介绍信息安全的基本原理,如加密、解密、数字签名等;通过案例分析,使学生了解信息安全在现实生活中的重要性。
目录一:实验原理----------------------------1二:程序源代码--------------------------1三:实验分析-----------------------------6四:实验结论---------------------------7赫夫曼编码一:实验原理哈夫曼编码的具体步骤归纳如下:① 概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。
② 将n个信源信息符号的n个概率,按概率大小排序。
③ 将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。
④ 将n-1个概率,按大小重新排序。
⑤ 重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。
⑥ 如此反复重复n-2次,得到只剩两个概率序列。
⑦ 以二进制码元(0.1)赋值,构成哈夫曼码字。
编码结束。
哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大概信息符号分配码字长度短,小概率信息符号分配码字长度长。
C、哈夫曼编码的特点(1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;(2)哈夫曼编码的字长参差不齐,硬件实现不方便;(3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。
二:程序源代码:#define MAXVALUE 10000#define MAXLEAF 30#define MAXNODE 59#define MAXBIT 10#define LENTH 30#include "stdio.h"#include<iostream>typedef struct{float gailv;int flag;int parent;int lchild;int rchild;char ch;int t;}HNodeType;typedef struct{int bit[MAXBIT];int start;}HCodeType;typedef struct{float gailv;char letter;}mytype; /*it's the type of data save in file*/typedef struct filehuff{int count;mytype mydata[MAXLEAF];filehuff(){count=0; };};filehuff filedata;char code[MAXVALUE];HNodeType HuffNode[MAXNODE];void savetofile(){FILE *fp;if((fp=fopen("datafile.txt","wb"))==NULL){printf("打开失败 ....");return;}if(fwrite(&filedata,sizeof(filedata),1,fp)!=1) printf("写入文件失败 ....");fclose(fp);}void openfile(){ FILE *fp;if((fp=fopen("datafile.txt","rb"))==NULL){return;}fread(&filedata,sizeof(filedata),1,fp);}void translate(){char c;int i,j,k=0,m,n=0;printf("请输入你想要译码的二进制序列 ");printf("\n");getchar();scanf("%c",&c);for(i=0;(i<MAXVALUE)&&(c=='1'||c=='0');i++){ code[i]=c;scanf("%c",&c);}printf("对应的信源符号为:");for(j=0;j<=MAXVALUE&&HuffNode[j].parent!=-1;j++) m=j+1;for(j=0,k=m;j<=i;j++){if(code[j]=='0'){n=HuffNode[k].lchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}else{n=HuffNode[k].rchild;if(n==-1){printf("%c",HuffNode[k].ch);k=m;j--;continue;}k=n;}}}void Huffman(){HCodeType HuffCode[MAXLEAF],cd;int i,j,m1,m2,x1,x2,c,p,m;if(filedata.count==0){ printf("\n输入信源符号总数 : ");scanf("%d",&m);filedata.count=m;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch='a';}for(i=0;i<m;i++){ printf("请输入 (概率,信源符号):");scanf("%f %c",&HuffNode[i].gailv,&HuffNode[i].ch); filedata.mydata[i].gailv=HuffNode[i].gailv; filedata.mydata[i].letter=HuffNode[i].ch;savetofile();}}else{ m=filedata.count;for(i=0;i<2*m-1;i++){ HuffNode[i].gailv=0;HuffNode[i].parent=-1;HuffNode[i].flag=0;HuffNode[i].lchild=-1;HuffNode[i].rchild=-1;HuffNode[i].ch=3;}for(i=0;i<m;i++){ HuffNode[i].gailv=filedata.mydata[i].gailv;HuffNode[i].ch=filedata.mydata[i].letter;}}for(i=0;i<m-1;i++){ m1=m2=MAXVALUE;x1=x2=0;for(j=0;j<m+i;j++){ if(HuffNode[j].gailv<m1&&HuffNode[j].flag==0){ m2=m1;x2=x1;m1=HuffNode[j].gailv;x1=j;}else if(HuffNode[j].gailv<m2&&HuffNode[j].flag==0){ m2=HuffNode[j].gailv;x2=j;}}HuffNode[x1].parent=m+i;HuffNode[x2].parent=m+i;HuffNode[x1].flag=1;HuffNode[x2].flag=1;HuffNode[m+i].gailv=HuffNode[x1].gailv+HuffNode[x2].gailv;HuffNode[m+i].lchild=x1;HuffNode[m+i].rchild=x2;}for(i=0;i<m;i++){ cd.start=m-1;c=i;p=HuffNode[c].parent;while(p!=-1){ if(HuffNode[p].lchild==c)cd.bit[cd.start]=0;else cd.bit[cd.start]=1;cd.start--;c=p;p=HuffNode[c].parent;}for(j=cd.start+1;j<m;j++)HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start;}printf("对应的赫夫曼编码如下:");printf("\n信源符号概率编码\n");for(i=0;i<m;i++){printf("%c %f ",HuffNode[i].ch,HuffNode[i].gailv); for(j=HuffCode[i].start+1;j<m;j++)printf("%d",HuffCode[i].bit[j]);printf("\n");}printf("按任意键继续......\n");}main(){char yn;printf("\n");printf("\n");printf(" 信息论与编码实验 \n");openfile();Huffman();for(;;){printf("\n是否想要把序列译码为信源符号 ?: (输入 y or n) "); scanf("%c",&yn);if(yn=='y'||yn=='Y')translate();elsebreak;}return 0;system("pause");}三:实验分析编码实例如下:由图中可以看出,符合基本的赫夫曼编码的原理,概率大的用短码,概率小的用长码。
信息与编码论课程设计一、课程目标知识目标:1. 理解信息与编码的基本概念,掌握不同编码方式的原理及特点;2. 学会运用二进制、十进制等数制进行信息转换,并掌握其相互转换的方法;3. 了解信息安全的基本知识,提高信息保护意识。
技能目标:1. 能够运用所学知识对信息进行编码和解码操作;2. 培养学生的逻辑思维能力和问题解决能力,通过案例分析和课堂讨论,提高学生的信息处理能力;3. 能够运用所学知识对简单的信息安全问题进行识别和防范。
情感态度价值观目标:1. 培养学生对信息科学的兴趣,激发他们探索未知领域的热情;2. 增强学生的团队合作意识,培养他们在合作中互相学习、共同进步的精神;3. 提高学生的信息安全意识,培养他们尊重知识产权、遵守网络道德的观念。
本课程旨在通过系统的理论讲解和丰富的实践操作,帮助学生掌握信息与编码的基本知识,提高他们的信息素养。
针对学生的年龄特点和认知水平,课程设计注重理论与实践相结合,以激发学生的学习兴趣和探究欲望。
在教学过程中,注重培养学生的逻辑思维能力和问题解决能力,为我国信息技术领域培养具有创新精神和实践能力的后备人才。
二、教学内容1. 信息与编码基本概念:信息的定义、编码的原理、不同编码方式的特点;教材章节:第一章 信息与编码概述2. 数制及其转换:二进制、十进制、八进制、十六进制等数制的概念及相互转换方法;教材章节:第二章 数制及其转换3. 编码算法:ASCII编码、Unicode编码、Base64编码等编码算法的原理与应用;教材章节:第三章 编码算法4. 信息安全:加密算法、数字签名、安全协议等基本概念及其应用;教材章节:第四章 信息安全5. 实践操作:开展信息编码与解码、信息安全防护等实验,巩固理论知识;教材章节:第五章 实践操作教学内容安排和进度:第一周:信息与编码基本概念、数制及其转换;第二周:编码算法、信息安全;第三周:实践操作。
教学内容注重科学性和系统性,结合教材章节进行合理组织,旨在帮助学生全面掌握信息与编码的相关知识。
信息论与编码课程设计报告设计题目:判断唯一可译码、香农编码专业班级电信12-03学号 311208000607学生姓名曹琳指导教师成凌飞教师评分2015年 3月21日目录一、设计任务与要求 (2)二、设计思路 (2)三、设计流程图 (3)四、程序运行及结果 (4)五、心得体会 (6)参考文献 (7)附录:源程序 (8)一、设计任务与要求通过本次课程设计的练习,使学生进一步巩固信源熵、信源编码的基本原理,掌握具体的编码方法,熟悉编程软件的使用,培养学生自主设计、编程调试的开发能力,同时提高学生的实践创新能力。
1、判断唯一可译码利用尾随后缀法判断任意输入的码是否为唯一可译码,即设计一个程序实现判断输入码组是否为唯一可译码这一功能。
2、香农编码熟悉运用香农编码,并能通过C语言进行编程,对任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。
二、设计思路1、判断唯一可译码在我们学习使用了克劳夫特不等式之后,知道唯一可译码必须满足克劳夫特不等式。
但是克劳夫特不等式仅仅是存在性的判定定理,即该定理不能作为判断一种码是否为唯一可译码的依据。
也就是说当码字长度和码符号数满足克劳夫特不等式时,则必可以构造出唯一可译码,否则不能构造出唯一可译码。
因此我们必须找到一种能够判断一种码是否为唯一可译码的方法,尾随后缀法。
尾随后缀法算法描述:设C为码字集合,按以下步骤构造此码的尾随后缀集合F:(1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;(2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi 是Wj∈C 的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1(3)F包含于Fi即为码C(4) 若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。
在我们设计的算法中,需要注意的是我们需要的是先输出所有尾随后缀的集合,然后再判断该码是否是唯一可译码,即如F中出现了C中的元素,则C不是唯一可译码,否则若F中没有出现新的元素,则C为唯一可译码。
而不是F中出现C中的元素就终止,这也是在本题的要求中需要注意的问题。
2、香农编码香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。
香农第一定理指出,选择每个码字的长度Ki满足下式:I(xi)≤K﹤I(xi)+1,就可以得到这种码。
这种编码方法就是香农编码。
香农编码法有重要的理论意义。
编码步骤如下:(1)将信源消息符号按其出现的概率大小依次排列:p(x1)≥p(x2)≥···≥p(xn)(2)确定满足下列不等式整数码长Ki:-log2p(xi)≤Ki<-log2p(xi)+1(3)为了编成唯一可译码,计算第i个消息的累加概率;(4)将累加概率Pi变成二进制数;(5)取Pi二进制数的小数点后Ki位即为该消息符号的二进制码字。
三、设计流程图Array1、判断唯一可译码其框图如下:2、香农编码其框图如下:四、程序运行及结果1、判断唯一可译码其运行结果如下图所示:2、香农编码其运行结果如下图所示:五、心得体会这次信息论与编码的程序设计,对于我来说是一个挑战。
课程设计是培养学生综合运用所学知识,发现问题、提出问题、分析问题和解决问题的过程,锻炼学生的逻辑思维能力和实践能力,是对学生实际工作能力的具体训练和考察过程。
在整个课程程序中,我们充分应用和调用各个程序模块,从而部分实现了此次程序设计的所应该有的功能。
就是我在课程设计是比较成功的方面,而在这个过程中,让我感觉收获最大的就是我们都能利用这次课程设计学到很多我们在课本上没有的知识,充分的发挥了我们的主动性,使我们学会了自主学习,和独立解决问题的能力。
这次的程序软件基本上运行成功,可以简单的输入进行压缩,并且运用简单的数字告诉程序的操作者下一步该如何进行,使得程序规模相对较小,即功能还不很全面,应用也不很普遍。
总而言之,这次数据结构课程设计让我们感触很深,使我们每个人都了解到学习不应该只局限于课本,因为课本上告诉我们的只是很有限的一部分,只是理论上的死知识,所涉及的范围也是狭窄的。
我们若想在有限的范围内学习到无限的知识,就要我们自己懂得争取,懂得自学,懂得充分利用身边的任何资源。
在我们的程序中有一部分查找许多该方面的资料,我竭力将所获得的信息变成自己的资源。
我动手上机操作的同时,在了解和看懂的基础上对新学的知识进行改进和创新,但是在我们的程序软件中还有很多的不足,需要加以更新。
通过这次课程设计,我们都意识到了自己动手实践的弱势,特别是在编程方面,于是我们知道了计算机的实践操作是很重要的,只有通过上机编程才能充分的了解自己的不足。
通过这次的课程设计,我们深刻意识到自己在学习中的弱点,同时也找到了克服这些弱点的方法,这是在此活动中得到的一笔很大的财富。
同时也感谢老师给我们这次机会,发现自身存在的缺点与不足,从而在以后的大学生活中更好的提升和完善自我。
参考文献[1]曹雪虹.信息论与编码[M]. 北京:清华大学出版社,2009.2[2]河南理工大学概率论与数理统计教研组.概率论与数理统计[M]. 北京:高等教育出版社,2013.4[3]贾宗璞.C语言程序设计[M].北京:北京邮电大学出版社,2010附录:源程序1、判断唯一可译码#include <iostream.h>#include <stdlib.h>#include <string.h>struct strings{char *string;struct strings *next;};struct strings Fstr, *Fh, *FP;//输出当前集合void outputstr(strings *str){do{cout<<str->string<<endl;str = str->next;}while(str);cout<<endl;}inline int MIN(int a, int b){ return a>b?b:a; }inline int MAX(int a, int b){ return a>b?a:b; }#define length_a (strlen(CP))#define length_b (strlen(tempPtr))//判断一个码是否在一个码集合中,在则返回0,不在返回1 int comparing(strings *st_string,char *code){while(st_string->next){st_string=st_string->next;if(!strcmp(st_string->string,code))return 0;}return 1;}//判断两个码字是否一个是另一个的前缀,如果是则生成后缀码void houzhui(char *CP,char *tempPtr){if (!strcmp(CP,tempPtr)){cout<<"集合C和集合F中有相同码字:"<<endl<<CP<<endl<<"不是唯一可译码码组!"<<endl;exit(1);}if (!strncmp(CP, tempPtr, MIN(length_a,length_b))){struct strings *cp_temp;cp_temp=new (struct strings);cp_temp->next=NULL;cp_temp->string=new char[abs(length_a-length_b)+1];char *longstr;longstr=(length_a>length_b ? CP : tempPtr);//将长度长的码赋给longstr //取出后缀for (int k=MIN(length_a,length_b); k<MAX(length_a,length_b); k++) cp_temp->string[k - MIN(length_a,length_b)]=longstr[k];cp_temp->string[abs(length_a-length_b)]=NULL;//判断新生成的后缀码是否已在集合F里,不在则加入F集合if(comparing(Fh,cp_temp->string)){FP->next=cp_temp;FP=FP->next;}}}void main(){//功能提示和程序初始化准备cout<<"\t\t唯一可译码的判断!\n"<<endl;struct strings Cstr,*Ch, *CP,*tempPtr;Ch=&Cstr;CP=Ch;Fh=&Fstr;FP=Fh;char c[]="C :";Ch->string=new char[strlen(c)];strcpy(Ch->string, c);Ch->next=NULL;char f[]="F :";Fh->string=new char[strlen(f)];strcpy(Fh->string, f);Fh->next=NULL;//输入待检测码的个数int Cnum;cout<<"输入待检测码的个数:";cin>>Cnum;cout<<"输入待检测码"<<endl;for(int i=0; i<Cnum; i++){cout<<i+1<<" :";char tempstr[10];cin>>tempstr;CP->next=new (struct strings);CP=CP->next;CP->string=new char[strlen(tempstr)] ;strcpy(CP->string, tempstr);CP->next = NULL;}outputstr(Ch);CP=Ch;while(CP->next->next){CP=CP->next;tempPtr=CP;do{tempPtr=tempPtr->next;houzhui(CP->string,tempPtr->string);}while(tempPtr->next);}outputstr(Fh);struct strings *Fbegin,*Fend;Fend=Fh;while(1){if(Fend == FP){cout<<"是唯一可译码码组!"<<endl;exit(1);}Fbegin=Fend;Fend=FP;CP=Ch;while(CP->next){CP=CP->next;tempPtr=Fbegin;for(;;){tempPtr=tempPtr->next;houzhui(CP->string,tempPtr->string);if(tempPtr == Fend)break;}}outputstr(Fh);//输出F集合中全部元素}}2、香农编码#include<iostream.h>#include<math.h>#include<iomanip.h>#include<stdlib.h>class T{public:T() {}~T();void Create();void Coutpxj();void Coutk();void Coutz();void Print();protected:int n;double *p;double *pxj;int *k;double *mz;};void T::Create(){cout<<"请输入信源符号个数:";cin>>n;p=new double[n];cout<<"请分别输入这"<<n<<"个概率:\n";for(int i=0;i<n;i++)cin>>p[i];pxj=new double[n];k=new int[n];mz=new double[n];double sum=0.0;for(i=0;i<n;i++)sum+=p[i];if(sum!=1.0)throw 1;else{for(i=0;i<n;i++){int k=i;for(int j=i+1;j<n;j++)if(p[k]<p[j]) k=j;double m=p[i];p[i]=p[k];p[k]=m;}}}T::~T(){delete p;delete pxj;delete k;delete mz;}void T::Coutpxj(){pxj[0]=0;for(int i=1;i<n;i++){pxj[i]=0;for(int j=0;j<i;j++)pxj[i]+=p[j];}}void T::Coutk(){for(int i=0;i<n;i++){double d=(-1)*(log(p[i])/log(2));if(d-(int)d>0) k[i]=(int)d+1;else k[i]=(int)d;}}void T::Print(){cout<<"Xi"<<setw(8)<<"P(xi)"<<setw(8)<<"Pa(xj)"<<setw(8)<<"Ki"<<setw(8)<<"码字"<<endl;for(int i=0;i<n;i++){ cout<<"X"<<i+1<<setw(8)<<setprecision(2)<<p[i] <<setw(8)<<setprecision(2)<<pxj[i]<<setw(8)<<k[i]<<" ";mz[i]=pxj[i];for(int j=0;j<k[i];j++){if(2*mz[i]-1>=0){cout<<1;mz[i]=2*mz[i]-1;}else{cout<<0;mz[i]=2*mz[i];}}cout<<endl;}double K=0.0,H=0.0,Y;for(i=0;i<n;i++){K+=(double)p[i]*k[i];H+=(-1)*p[i]*(log10(p[i])/log10(2.0));}Y=H/K;cout<<"平均码长:"<<K<<endl;cout<<"信源熵:"<<H<<endl;cout<<"编码效率:"<<Y<<endl;}void main(){T t;int e;try{t.Create();t.Coutpxj();t.Coutk();t.Print();}catch(int e){if(e==1) cout<<"输入错误,请重新运行";} }。