信息论课程设计报告
信息论与编码课程设计
建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101学生: _____________________________学号: ________________________________ 扌指导教师:吕卅王超________________ 设计时间:2013.11.18 —2013.11.29、设计的作用、目的《信息论与编码》是一门理论与实践密切结合的课程, 课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。
其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。
通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法二、设计任务及要求通过课程设计各环节的实践,应使学生达到如下要求:1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2. 掌握哈夫曼编码/ 费诺编码方法的基本步骤及优缺点;3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;4. 能够使用MATLA或其他语言进行编程,编写的函数要有通用性。
三、设计容一个有8个符号的信源X,各个符号出现的概率为:X x1, x2, x3, x4, x5, x6 x7 x8P(X) 0.4 0.18 0.1 0.1 0.07 0.06 0.05 0.04 编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。
并不断重复这一过程,直到最后两个符号配以0和1为止。
信息论与编码课程设计报告书
信息论与编码课程设计报告设计题目:判断唯一可译码、香农编码专业班级电信12-03学号7学生琳指导教师成凌飞教师评分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为唯一可译码。
信息论课程设计报告书
信息论基础课程设计报告书班级: 计算331 姓名: 王宇(200909014217) 设计题目:课程设计软件设计时间: 2012.7.4 至2012.7.8指导教师:评语:_________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:____评阅教师:_____目录华北科技学院课程设计说明书设计总说明 (1)前言 (2)第1章总体设计方案 (3)1.1 软件结构设计 (3)第2章算法思想及设计 (5)2.1香农编码 (5)2.1.1香农编码思想: (5)2.1.2香农编码算法设计: (6)2.2费诺编码 (6)2.2.1费诺编码思想 (6)2.2.2费诺编码算法设计 (7)第3章软件详细设计 (8)3.1主界面设计 (8)3.2功能设计 (8)3.2.1香农编码的实现 (8)3.2.2费诺编码的实现 (15)3.2.3有关文档的链接 (22)3.2.4皮肤切换的设计 (23)第4章软件测试 (26)4.1香农编码的测试 (26)4.1.1 软件运行及结果测试 (26)4.2费诺编码的测试 (27)4.2.1 软件运行及结果测试 (27)4.3测试结果 (29)第5章总结 (30)参考文献 (31)附录 (32)设计总说明早期的数据压缩起源于人们对概率的认识。
当对文字信息进行编码时,如果为出现概率较高的字母赋予较短的编码,为出现概率较低的字母赋予较长的编码,平均编码长度就能缩短不少。
印象中的著名的Morse电码就是一个范例。
信息论之父C.E.Shannon曾指出,任何信息都存在冗余,冗余大小与信息中每个符号的出现概率(不确定性)有关。
信息论与编码课程设计
信息论与编码课程设计报告设计题目:统计信源熵、香农编码与费诺编码专业班级: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 次扩展信源无失真编码器凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合都可以称为最佳码。
信息论课程设计报告
成绩:2016-2017学年第1学期《信息论》课程设计学院名称:班级学号:学生:教师:2016年12 月一、判定唯一可译码1. 任务说明输入:任意的一个码(即已知码字个数及每个具体的码字) 输出:判决结果(是/不是)输入文件:in1.txt ,含至少2组码,每组的结尾为”$”符 输出文件:out1.txt ,对每组码的判断结果说明:为了简化设计,可以假定码字为0,1串2. 实现原理判断方法:将码C 中所有码字可能的尾随后缀组成一个集合F ,当且仅当集合F 中没有 包含任一码字,则可判断此码C 为唯一可译变长码。
构成集合F :首先观察码C 中最短的码字是否是其他码字的前缀。
若是,将其所有可能 的尾随后缀排列出。
就是将其他码字序列中截去与其最短码字相同的前缀 部分,将余下的序列为尾随后缀。
而这些尾随后缀又可能是某些码字的前 缀,或者最短码字又仍是这些尾随后缀的前缀,再将由这些尾随后缀产生 的新的尾随后缀列出。
然后再观察这些新的尾随后缀是否是某些码字的前 缀,或观察有否其他码字是这些新的尾随后缀的前缀,再将产生的尾随后 缀列出,依次下去,直至没有一个尾随后缀是码字的前缀或没有新的尾随 后缀产生为止。
这样,首先获得的是由最短码字能引起的所有尾随后缀。
接着,按照上述步骤将次短的码字、......所有码字可能产生的尾随后缀前部列出。
由此得到由码C 的所有可能的尾随后缀组成的集合F 。
参考算法伪代码:For all ,i j W W C ∈ doif i W 是j W 的前缀 then将相应的后缀作为一个尾随后缀放入集合0F 中 End if End forLoopFor all i W C ∈ doFor all j n W F ∈ doif i W 是j W 的前缀 then将相应的后缀作为一个尾随后缀放入集合1n F +中 Else if j W 是i W 的前缀 then将相应的后缀作为一个尾随后缀放入集合1n F +中End if End for End for i i F F ←If ,i i W F W C ∃∈∈ thenReturn falseElse if F 中未出现新的元素 thenReturn true End if//能走到这里,说明F 中有新的元素出现,需继续End loop3. 实现源码#include <iostream> #include <fstream> #include <stdio.h> #include <string.h> using namespace std;#pragma warning (disable :4996) char c[100][50]; //保存码字 char f[300][50]; //保存尾随后缀int N, sum = 0; //N 为码字的个数,sum 为尾随后缀个数 int flag; //判断是否唯一可译标志位//检测尾随后缀void patterson(char c[], char d[]) { int i, j, k; for (i = 0;; i++) { If (c[i] == '\0'&&d[i] == '\0')//两字符串一样长,跳出 break ; if (c[i] == '\0') //d 比c 长,将d 的尾随后缀放入f 中 { for (j = i; d[j] != '\0'; j++) f[sum][j - i] = d[j]; f[sum][j - i] = '\0'; for (k = 0; k<sum; k++) { if (strcmp(f[sum], f[k]) == 0) /*查看当前生成的尾随后缀在f 集合中是否存在*/ { sum--; break ; } } sum++; break ;}if (d[i] == '\0') //c比d长,将c的尾随后缀放入f中{for (j = i; c[j] != '\0'; j++)f[sum][j - i] = c[j];f[sum][j - i] = '\0';for (k = 0; k<sum; k++){if (strcmp(f[sum], f[k]) == 0) /*查看当前生成的尾随后缀在f集合中是否存在*/{sum--; break;}}sum++;break;}if (c[i] != d[i])//字符不一样了也退出(前缀不同)break;}}void main(){int k = 0, N = 0, m = 0, a[50], z = 0;a[m] = N; m++;fstream file1;file1.open("out1.txt");//码字读取FILE *file;file = fopen("in1.txt", "r+");int num = fgetc(file) - 48;for (int n = 0; n < num; n++){int i = 0, j;if (fgetc(file) == ' ')N += (fgetc(file) - 48);else N += (fgetc(file) - 48);a[m] = N; m++;fgetc(file);for (k; k < N; k++){for (int q = 0;; q++){char temp = fgetc(file);c[k][q] = temp;if (temp == ' ' || temp == '$'){c[k][q] = '\0';break;}}}//生成尾随后缀flag = 0;for (i = a[z]; i<N - 1; i++)//判断码本身是否重复for (j = i + 1; j<N; j++){if (strcmp(c[i], c[j]) == 0){flag = 1; break;}}if (flag == 1)//如果码本身有重复,就可以断定它不是唯一可译码{for (int y = a[z]; y < N; y++)file1 << c[y] << ' ';file1 << "不是唯一可译码。
信息论课程实验报告
中国地质大学(武汉)CHINA UNIV ERSIT Y OF GEOSCIENCES信息论课程实验报告指导老师:严军姓名:刘一龙班级:71082-14学号:20081002007中国地质大学(武汉)2011年6月实验一构造(7,4)系统码一、实验题目Construct a systematic (7,4) linear block code. Y ou can use c / MA TLAB / HDL (VHDL or Verilog-HDL) to describe it. Please write the detail of how to realize it in computer language. And list the program lines.二、实验程序算法设计:利用H的线性独立,通过n的二进制形式构造出H,然后利用H构造出G。
本算法具有通用性,不仅可以计算出(7,4)的生成矩阵,还可以构造出(15,11),(31,26)的生成矩阵。
Matlab程序:clc;disp('请输入系统码n的值');n = input('n=');disp('请输入系统码k的值');k = input('k=');r = n-k;temp=[];for i=1:ny=dec2bin(i,r);for j=1:rtemp(i,j)=mod(y(j),2);endendfor i=1:rt = temp(i,:);temp(i,:)=temp(2^(i-1),:);temp(2^(i-1),:)=t;endfor i=1:(fix(r/2))t = temp(:,i);temp(:,i)=temp(:,r-i+1);temp(:,r-i+1)=t;endH = temp';%-----构造矩阵G--------%P=H(:,r+1:n);G=[P',eye(k)];disp('生成矩阵');Gdisp('校验矩阵');H三、实验结果请输入系统码n的值n=7请输入系统码k的值k=4生成矩阵G =1 1 0 1 0 0 01 0 1 0 1 0 00 1 1 0 0 1 01 1 1 0 0 0 1校验矩阵H =1 0 0 1 1 0 10 1 0 1 0 1 10 0 1 0 1 1 1请输入系统码n的值n=15请输入系统码k的值k=11生成矩阵G =Columns 1 through 81 0 1 0 1 0 0 00 1 1 0 0 1 0 01 1 1 0 0 0 1 01 1 0 0 0 0 0 11 0 0 1 0 0 0 00 1 0 1 0 0 0 01 1 0 1 0 0 0 00 0 1 1 0 0 0 01 0 1 1 0 0 0 00 1 1 1 0 0 0 01 1 1 1 0 0 0 0 Columns 9 through 150 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 00 0 0 0 0 0 01 0 0 0 0 0 00 1 0 0 0 0 00 0 1 0 0 0 00 0 0 1 0 0 00 0 0 0 1 0 00 0 0 0 0 1 00 0 0 0 0 0 1校验矩阵H =Columns 1 through 81 0 0 0 1 0 1 10 1 0 0 0 1 1 10 0 1 0 1 1 1 00 0 0 1 0 0 0 0Columns 9 through 151 0 1 0 1 0 10 1 1 0 0 1 10 0 0 1 1 1 11 1 1 1 1 1 1实验二循环码一、实验题目We have already learned how to encode and decode cyclic codes. Please use the generator polynomial g(x)=1+x+x2+x4to construct a (7,3) code. And if the received code vector is [1 1 0 0 1 1 1], how to decode it? Use c / MATLAB / HDL language to realize the encoding and decoding system.二、实验程序算法设计:通过计算自己将生成矩阵G输入到计算机,然后输入要传输的信息m,利用c=mG 自动生成码字c。
信息论与编码课程设计(哈夫曼编码的分析与实现)..
吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101学生姓名:学号:指导教师:吕卅王超设计时间:2013.11.18-2013.11.29一、设计的作用、目的《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。
其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。
通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法二、设计任务及要求通过课程设计各环节的实践,应使学生达到如下要求:1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点;3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。
三、设计内容一个有8个符号的信源X ,各个符号出现的概率为:编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。
并不断重复这一过程,直到最后两个符号配以0和1为止。
最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。
哈夫曼编码方式得到的码并非唯一的。
在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面,12345678,,,,,()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ⎡⎤⎧⎫=⎨⎬⎢⎥⎣⎦⎩⎭这样可获得较小的码方差。
信息论与编码课程设计报告统计信源熵与香农编码
信息论与编码课程设计报告统计信源熵与香农编码信息论与编码课程设计报告设计题目:统计信源熵与香农编码专业班级电信 12-06学号学生姓名指导教师教师评分3 月 30日目录一、设计任务与要求 (2)二、设计思路 (2)三、设计流程图 (3)四、程序运行及结果 (4)五、心得体会 (6)参考文献 (7)附录:源程序 (8)一、设计任务与要求1.统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。
2.香农编码要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。
二、设计思路本次课程设计中主要运用C 语言编程以实现任务要求,分析所需要的统计量以及相关变量,依据具体公式和计算步骤编写语句,组成完整C 程序。
1、信源熵定义:信源各个离散消息的自信息量的数学期望为信源的平均信息量,一般称为信源的信息熵,也叫信源熵或香农熵,有时称为无条件熵或熵函数,简称熵,记为H ()。
计算公式:)(log )(-)x (i i i x p x p H ∑=2、香农编码过程:(1)将信源消息符号按其出现的概率大小依次排列为n p p ≥⋅⋅⋅≥≥21p(2)确定满足下列不等式的整数码长i K 为1)()(+-<≤-i i i p lb K p lb(3)为了编成唯一可译码,计算第i 个消息的累加概率∑-==11)(i k k i a p P(4)将累计概率i P 变换成二进制数。
(5)取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。
三、设计流程图1、统计信源熵开始计算字符概率输出结束2、香农编码开始计算信源熵计算编码效率输出结束四、程序运行及结果1、统计信源熵2、香农编码五、心得体会经过这次课程设计明显的体会到知识匮乏所带来的种种问题,首先是对C语言编程的不熟练,课程知识在与C语言的结合中没有清晰的思路,具体实现程序语言的编写较为困难。
在程序的调试中出现的问题无法及时快速的解决,有些错误甚至无法找到合适的解决方法,以至于不断的修改程序,浪费了大量的时间。
信息论与编码课程设计
n=0;
}
}
for(i=0;i<=25;i++)
{
if(p[i]!=0)
H=H-p[i]*((log(p[i]))/(log(2)));
}
printf("\n");
printf("信源熵=%f\n",H);
printf("字符长度:%d\n",sum);
//printf("\n");
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。在这个过程中不仅锻炼了我们坚持不懈的毅力,更磨练了一个队伍的团结互助的精神,只有大家一起努力才能将课程设计圆满的完成,设计中遇到和解决问题的过程对我们的探索解决问题能力有了一个提高,对我们以后的学习有很大的好处。
#include<math.h>
void main()
{
int i,sum=0,n=0,ch[50]={0};
double p[50]={0},H=0;
char c,zm;
printf("输入文字:\n");
while((c=getchar())!='\n')
{
sum++;
for (i=97;i<=122;i++)
在香农编码中对于求解编码效率主要是依靠这个公式:R=H(X)/K,其中
对于求解信源熵主要依靠公式:H(X)=
三、设计流程图
1、统计信源熵:
开始
↓
先输入一段英文文章
信息论和编码课程设计
信息论和编码课程设计一、课程目标知识目标:1. 理解信息论的基本概念,包括信息量、熵、信道等;2. 掌握常见编码方法(如:哈夫曼编码、算术编码)的基本原理及特点;3. 了解数字通信系统中误码的产生原因及其纠正方法。
技能目标:1. 能够运用信息论的基本原理分析简单通信系统;2. 能够运用编码方法对信息进行压缩和还原;3. 能够运用所学知识解决实际通信过程中的问题。
情感态度价值观目标:1. 培养学生严谨的科学态度和良好的学习习惯;2. 增强学生的团队协作意识和沟通能力;3. 激发学生对信息科学和通信技术的兴趣,培养创新精神。
分析课程性质、学生特点和教学要求,本课程旨在帮助学生掌握信息论和编码的基本知识,培养解决实际通信问题的能力。
课程目标具体、可衡量,便于教学设计和评估。
通过本课程的学习,使学生能够运用所学知识分析、解决实际问题,并为后续相关课程打下坚实基础。
二、教学内容1. 信息论基本概念:信息量、熵、信道容量、互信息等;教材章节:第一章 信息论基础2. 编码方法:- 哈夫曼编码:原理、构造方法及应用;- 算术编码:原理、算法流程及应用;教材章节:第二章 编码方法3. 误码纠正:- 误码产生原因及纠正方法;- 简单误码纠正码:奇偶校验、海明码等;教材章节:第三章 误码纠正4. 信息论与编码在实际通信系统中的应用案例分析。
教学内容安排和进度:1. 第1周:信息论基本概念;2. 第2-3周:编码方法(哈夫曼编码、算术编码);3. 第4周:误码纠正;4. 第5周:应用案例分析及讨论。
教学内容确保科学性和系统性,与课程目标紧密关联,涵盖信息论和编码的主要知识点。
通过以上教学安排,使学生全面掌握信息论和编码的基本知识,提高解决实际通信问题的能力。
三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:通过系统的讲解,使学生掌握信息论和编码的基本概念、原理和方法。
在教学过程中,注重启发式教学,引导学生主动思考问题,提高课堂互动效果。
信息论课程设计报告
xx大学信息论课程设计姓名:学号:学院:指导老师:完成日期:2015.01.04一、判定唯一可译码1.任务说明:输入:任意的一个码(即已知码字个数及每个具体的码字)输出:判决结果(是/不是)输入文件:in1.txt,含至少2组码,每组的结尾为”$”符输出文件:out1.txt,对每组码的判断结果说明:为了简化设计,可以假定码字为0,1串2.问题分析、实现原理判定唯一可译码根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。
算法:1、考察C 中所有的码字,若Wi是Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中;2、考察C和Fi俩个集合,若Wi ∈C是Wj∈F的前缀或Wi ∈F是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;3、F=∪Fi即为码C的尾随后缀集合;4、若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素则返回真。
3.源代码:#include<iostream>#include stdlib.h#include<string>using namespace std;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)) //判断一个码是否在一个码集合中,在则返回,不在返回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;}}}main()void{//功能提示和程序初始化准备cout<<\ \t\t判定唯一可译码屜屮<<endl;struct stringsCstr,*Ch, *CP,*tempPtr;Ch=&Cstr;CP=Ch;Fh=&Fstr;FP=Fh;char c[]=码字集合?尺;Ch->string=new char[strlen(c)];strcpy(Ch->string, c);Ch->next=NULL;char 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){<<endl; 尡是唯一可译码码组 cout<<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集合中全部元素}}4.程序结果截图:编码与译码二、LZW .任务说明:1L<=100 内字符构成的输入串,输入序列长度输入:由集合{a,b,c,d} 处理:先编码,再对编码结果译码输出:编码结果,译码结果:in4.txt,含至少两组输入,每组包含满足要求的串输入文件:out4.txt,对每组输入的编码和译码结果输出文件 2. 问题分析、实现原理编码程序:1(). 是空的。
信息论课程设计实验报告
《信息论课程设计》实验报告题目 1:实现香农编码及计算其编码效率题目 2:实现有噪信道编码中的循环码院系(部):计算机科学与技术学院专业及班级:信息与计算科学1301班姓名:唐诗韵学号: 1308060105 日期: 2016/01/10目录1. 课题描述 (1)2. 信源编码的相关介绍 (2)3. 香农编码(题目一) (3)3.1. 香农编码算法 (3)3.2. 香农编码特点 (4)4. 香农编码的C++程序实现 (4)4.1. 程序设计 (4)4.2. 运行结果 (6)5. 实现有噪信道中的循环码编码方法(题目二) (6)5.1. 循环码编码算法 (6)5.2. 循环码编码特点 (7)6. 循环码编码的C++程序实现 (7)6.1. 程序设计 (7)6.2. 运行结果 (9)7. 总结 (10)8. 参考文献 (11)1.课题描述信息论是一门理论和实践相结合的专业,因此相关题目都是来自于实践,同时具有上机练习的可操作性,此门科目是通信的基础。
香农1984年发表的一篇论文标志着信息论诞生,在他的论文中主要用概率来描述有效传输信息的问题,用概率给予了信息的定量描述方法,并提出了信源熵的概念,在现实生活中,人们经常把消息和信息分不清,认为消息就是信息,实则不是,消息是描述实物,而信息是定量描述一个消息所传输的信息量,通常用自信息量来描述一个消息所传达的信息量,它取值为此事件发生的概率的负对数,它表示一个事件发生之前此事件发生的不确定性大小,也表示一个事件发生后它所能提供的信息量,两个相互独立的消息所提供的信息量等于各自信息量之和。
此外,还可用互信息来描述信息的传达,为一个事件给出关于另一个事件的信息量,也表示事件y出现后信宿获得的关于x的信息量,互信息的引出,使信息的传递得到了定量的表示。
如果事件是以序列的形式表示的,及事件集,则用平均自信息量来表示信源所传递的信息,平均信息量表示信源的平均不确定性,比如抛掷一枚硬币的试验所包含的平均信息量。
信息论与编码课程设计报告(语音编码与测试)
语音编码及测试一、摘要利用手机录制18份小语音样本共3分钟,利用Matlab读取语音音频,并使用其统计函数对音频进行数据种类,个数及概率统计,利用统计得到的数据种类和概率进行概率密度函数拟合,拟合得到两段概率密度函数。
同时使用Lloyds分类算法对统计好的数据进行分类,共分为nR2个类别,即512类,得到其相应区间及质心。
对概率密度函数进行对应区间的积分得到区间对应的概率,然后使用Huffman编码进行二元编码,得到512个码字与质心对应。
测试阶段利用码字库,对随机录制的一段小语音进行编码得到音频对应的码字。
关键字:概率密度函数、Lloyds分类算法、Huffman编码、码字二、问题重述2.1语音编码录制一份语音,使用相应的工具对其音频进行提取,对提取到的音频进行概2个类率统计拟合出概率密度函数。
选取适当的方法将统计好的音频数字分为nR2个区间及区间对应的质心,既码字,概率密度函数进行别,分类后相应得到nRnR2个区间积分,由此得到nR2个码字及其概率对应,最后选取适当的编码方法得到质心对应的码字,都成编码库2.2编码测试录制一段小语音利用上诉的码字及其编码库,最终得到每个音频数对应的码字。
三、问题分析3.1语音编码由于录制的语音是作为实验得到码书的样本,因此语音的录制面要广且量应尽可能的多才能保证实验的合理性。
使用Matlab对语音进行音频读取及相应的概率统计,对统计后的结果利用Matlab中cftool工具箱对数据及其概率进行拟合,得到概率密度函数。
考虑到数据量及其较大的重复性,对于分类阶段采用统计好的音频数据,利用Matlab 中Lloyds 算法函数按nR 2分类,其结果会得到nR 2个区间及区间对应的质心,既码字。
利用密度函数对nR 2个区间进行积分得到nR 2个码字对应的概率,最后利用Matlab 中Huffman 编码程序对其概率进行0、1编码。
得到nR 2个码书构成本次实验的码字库。
信息论课程实验报告—唯一可译码的判定
return ISUDC; } /************************************************************************/ /* 该函数是用来对每个 pPostfix 和原码字序列进行比较, 如果重复了则在 pRetnBuf 中 /* 返回本身.并返回 1.否则如果没有得到新的后缀码的话返回 0 表示无重复*/ /* Stack 用来存储递归中产生的后缀码集合,这样确保每次得到的后缀码不会重复 /* 防止进去死循环 /************************************************************************/ int GetBacktraceSeq(const pCharVector& pCode,char* pPostfix,pCharVector& Stack,char** pRetnBuf) { char* iter1; for (int i = 0; i < pCode.size(); i++) { iter1 = pCode.at(i); int nRetn = IsPrefix(iter1,pPostfix); if (nRetn == ISSAME) { //第一次进来的话由于是码字序列内部的比较,所以 //肯定会遇到自己跟自己比较然后相等的情况,对该情况不允考虑 if(Stack.size() == 0) continue; *pRetnBuf = new char[strlen(pPostfix) + 1]; strcpy(*pRetnBuf,pPostfix); return 1; } if (ISPREFIX == nRetn) { //新得到的后缀码已经重复了,跳过对他的处理 if(PushBackUniqueValue(Stack,iter1) == false) continue; char* pTemp = NULL; //递归处理下一个后缀码 if(GetBacktraceSeq(pCode,pPostfix+strlen(iter1),Stack,&pTemp) == 0) { *pRetnBuf = NULL; Stack.pop_back(); continue; } Stack.pop_back(); //递归过程中遇到重复码字,算法应立即返回. //将自身和递归得到的后面的后缀码组合成一个歧义序列返回 char* pNewTraceSeq = new char[strlen(iter1) + strlen(pTemp) + 1]; pNewTraceSeq[0] = 0; strcat(pNewTraceSeq,iter1); strcat(pNewTraceSeq + strlen(iter1),pTemp); delete[] pTemp;
实验1-信息论相关实验实验报告
信息论与编码实验一实验报告学生姓名周群创指导教师张祖平学号 ********** 专业班级电子信息1101实验一关于信源熵的实验一、实验目的1. 掌握离散信源熵的原理和计算方法。
2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。
3. 自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具求解图像熵。
4. 掌握Excel 的绘图功能,使用Excel 绘制散点图、直方图。
二、实验原理1. 离散信源相关的基本概念、原理和计算公式产生离散信息的信源称为离散信源。
离散信源只能产生有限种符号。
随机事件的自信息量I(x i)为其对应的随机变量x i 出现概率对数的负值。
即:I(x i)= -log2 p(x i)随机事件X 的平均不确定度(信源熵)H(X)为离散随机变量x i 出现概率的数学期望,即:H(X )=-∑p(x )I (x ) =-∑p(x ) log p(x )2. 二元信源的信息熵设信源符号集X={0,1},每个符号发生的概率分别为p(0)=p,p(1)=q,p+ q=1,即信源的概率空间为则该二元信源的信源熵为:H(X) = - p log p –q log q = - p log p – (1- p) log (1- p)即:H (p) = - p log p – (1- p) log (1- p) 其中 0 ≤p ≤13. MATLAB 二维绘图用matlab 中的命令plot(x, y)就可以自动绘制出二维图来。
例1-2,在matlab 上绘制余弦曲线图,y = cos x,其中0 ≤x ≤2。
>>x=0:0.1:2*pi; %生成横坐标向量,使其为0,0.1,0.2,…,6.2>>y=cos(x); %计算余弦向量>>plot(x,y) %绘制图形4. MATLAB 求解离散信源熵求解信息熵过程:1) 输入一个离散信源,并检查该信源是否是完备集。
信息论与编码课程设计
信息论与编码课程设计报告设计题目:统计信源熵、香农编码与费诺编码专业班级:XXXXXXXXXXXX姓名:XXXXXXXXXXXX学号:XXXXXXXXXXXX指导老师:XXXXXXXXXXXX成绩:时间:2015年3月31日目录一、设计任务与要求 (2)二、设计思路 (2)三、设计流程图 (5)四、程序及结果 (7)五、心得体会 (11)六、参考文献 (12)附录 (13)一、设计任务与要求1. 统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。
2. 香农编码要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。
3. 费诺编码要求:任意输入消息概率,利用费诺编码方法进行编码,并计算信源熵和编码效率。
二、设计思路1、统计信源熵:统计信源熵就是对一篇英文文章中的种字符(包括标点符号及空格,英文字母不区分大小写)统计其出现的次数,然后计算其出现的概率,最后由信源熵计算公式:算出信源熵。
所以整体步骤就是先统计出文章中总的字符数,然后统计每种字符的数目,直到算出所有种类的字符的个数,进而算出每种字符的概率,再由信源熵计算公式计算出信源熵。
在这里我选择用Matlab来计算信源熵,因为Matlab中系统自带了许多文件操作和字符串操作函数,其计算功能强大,所以计算信源熵很是简单。
2、香农编码信源编码模型:信源编码就是从信源符号到码符号的一种映射,它把信源输出的符号变换成码元序列。
信源码元码符号次扩展信源无失真编码器凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合都可以称为最佳码。
为此必须将概率大的信息符号编以短的码字,概率小的符号编以长的码字,使得平均码字长度最短。
能获得最佳码的编码方法主要有:香农(Shannon)、费诺(Fano)、哈夫曼(Huffman)编码等。
香农第一定理:离散无记忆信源为熵,其次扩展为信源编码器熵为,码符号集为。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
xx大学信息论课程设计姓名:学号:学院:指导老师:完成日期:2015.01.04一、判定唯一可译码1.任务说明:输入:任意的一个码(即已知码字个数及每个具体的码字)输出:判决结果(是/不是)输入文件:in1.txt,含至少2组码,每组的结尾为”$”符输出文件:out1.txt,对每组码的判断结果说明:为了简化设计,可以假定码字为0,1串2.问题分析、实现原理判定唯一可译码根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。
算法:1、考察C 中所有的码字,若Wi是Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中;2、考察C和Fi俩个集合,若Wi ∈C是Wj∈F的前缀或Wi ∈F是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;3、F=∪Fi即为码C的尾随后缀集合;4、若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素则返回真。
3.源代码:#include<iostream>#include stdlib.h#include<string>using namespace std;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)) //判断一个码是否在一个码集合中,在则返回,不在返回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;}}}main()void{//功能提示和程序初始化准备cout<<\ \t\t判定唯一可译码屜屮<<endl;struct stringsCstr,*Ch, *CP,*tempPtr;Ch=&Cstr;CP=Ch;Fh=&Fstr;FP=Fh;char c[]=码字集合?尺;Ch->string=new char[strlen(c)];strcpy(Ch->string, c);Ch->next=NULL;char 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){<<endl; 尡是唯一可译码码组 cout<<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集合中全部元素}}4.程序结果截图:编码与译码二、LZW .任务说明:1L<=100 内字符构成的输入串,输入序列长度输入:由集合{a,b,c,d} 处理:先编码,再对编码结果译码输出:编码结果,译码结果:in4.txt,含至少两组输入,每组包含满足要求的串输入文件:out4.txt,对每组输入的编码和译码结果输出文件 2. 问题分析、实现原理编码程序:1(). 是空的。
步骤一:开始时的词典包含所有可能的根,而当前前缀P 字符流中的下一个字符。
:=步骤二:当前字符C P+C步骤三:判断是否在词典中:。
P:=P+C)如果“是”,1(如果“否”,则:)2(的码字输出到码字流。
把代表当前前缀①P 添加到词典中。
P+C符串-把缀②.③令P:=C。
(3)判断字符流中是否还有字符需要编码:①如果“是”,返回到步骤二。
②如果“否”:输出相应于当前前缀P的码字。
结束编码。
(2).译码程序:步骤一:在开始译码时,词典包含所有可能的前缀根。
步骤二:当前码字cW:=码字流中的第一个码字。
步骤三:输出当前缀-符串string.cW到字符流。
步骤四:先前码字pW:=当前码字cW。
步骤五:当前码字cW:=码字流中的下一个码字。
步骤六:判断当前缀-符串string.cW是否在词典中:(1)如果“是”,则:①当前缀-符串string.cW输出到字符流。
②当前前缀P:=先前缀-符串string.pW。
③当前字符C:=当前前缀-符串string.cW的第一个字符。
④把缀-符串P+C添加到词典。
(2)如果“否”,则:①当前前缀P:=先前缀-符串string.pW。
②当前字符C:=当前缀-符串string.pW的第一个字符。
③输出缀-符串P+C到字符流,然后把它添加到词典中。
步骤七:判断码字流中是否还有码字要译:(1)如果“是”,就返回到步骤四。
(2)如果“否”,结束。
3.源代码:#include<iostream>#include<string>#include<iomanip>using namespace std;string dic[30];int n;int find(string s) //字典中寻找,返回序号{int temp=-1;for(int i=0;i<30;i++){if(dic[i]==s)temp=i+1;}return temp;}void init() //字典初始{开始时词典包含所有可能的根//; 慜 dic[0]=dic[1]=扜;dic[2]=捜;dic[3]=摜;for(int i=4;i<30;i++) //其余为空{dic[i]=\;}}void code(string str){init(); //初始化char temp[2];temp[0]=str[0]; //取第一个字符temp[1]='\0';string P=temp; //P为前缀int i=1;int j=4; //目前字典存储的最后一个位置cout<<编码后的码字为:;while(1){char t[2];t[0]=str[i]; //取下一字符t[1]='\0';string C=t; //C为字符流中下一个字符if(C==\) //无码字要译,结束{cout<<?<<find(P); //输出代表当前前缀的码字break;} //退出循环,编码结束if(find(P+C)>-1) //有码字要译,如果P+C在词典中,则用C扩展P,进行下一步:{P=P+C;i++;}else//如果P+C不在词典中,则将P+C添加到词典中,令P:=C {cout<<?<<find(P);string PC=P+C;dic[j++]=PC;P=C;i++;}}cout<<endl;cout<<生成的词典为:<<endl;for(i=0;i<j;i++) //输出词典中的内容,j为词典的长度{cout<<setw(12)<<i+1<<setw(12)<<dic[i]<<endl;}cout<<endl;}void decode(int c[]){init(); //译码词典与编码词典相同,将a,b,c设为初始的前缀int pw,cw; //pw:先前码字,cw:当前码字cw=c[0]; //输入码字流的第一个码字,赋给当前码字int j=3,i;cout<<译码为:;cout<<dic[cw-1]; //输出当前字符串到字符流for(int m=0;m<n-1;m++){pw=cw; //当前码字赋给先前码字cw=c[m+1];if(cw<=j+1) //若当前码字在词典中{cout<<dic[cw-1]; //输出当前码字锁代表的字符串char t[2];t[0]=dic[cw-1][0];t[1]='\0';string k=t;j++;dic[j]=dic[pw-1]+k; //将先前码字与当前码字所代表的字符串的首字符连接而成的//字符串添加到词典中}else//若当前码字不在词典中{char t[2];t[0]=dic[pw-1][0];t[1]='\0';string k=t;j++;dic[j]=dic[pw-1]+k; //将先前码字与当前码字所代表的字符串的首字符连接而//成的字符串添加到词典中cout<<dic[cw-1]; //输出该字符串}}cout<<endl;cout<<生成的词典为:<<endl;for(i=0;i<j;i++) //输出词典中的内容,j为词典的长度{cout<<setw(12)<<i+1<<setw(12)<<dic[i]<<endl;}cout<<endl;}int main() //主程序{string str;char choice;while(1){cout<<屜湜屜屮瑜屜屴<<.编码<<屜瑜屜屴<<.译码屜屮湜;cout<<请选择功能对应的编号:;cin>>choice;if(choice=='1') //若选择1则编码{cout<<\输入要编码的字符串(由a、b、c 、d组成):;cin>>str;code(str);}else if(choice=='2') //若选择2则译码{int c[30];cout<<\准备译码的消息序列的长度是:;cin>>n;cout<<\准备译码的消息码字依次是:;for(int i=0;i<n;i++){cin>>c[i];}decode(c);}elsereturn 0; //其他选择则退出程序}}4.程序结果截图:三:循环码的编码与译码任务说明:1.,分别实现编码(多项式乘法)和译码,要其中,,g(x)= x3+x+1要求:(7,4)非系统循环码求译码可在伴随式法和标准阵列法中随意选择选择编码时,:in51.txt,包括至少两组待编码的信息元序列输入文件:out51.txt,对每组信息元的编码输出文件选择译码时,串7的0/1输入文件:in52.txt,包括至少2组长为,译码结果输出文件:out52.txt 问题分析、实现原理、流程图2..编码过程(1)g(x),也就是从的在编码时,首先需要根据给定循环码的参数确定生成多项式;然后,利用循环码的编码特点,即所有循环码多g(x))次因子中选一个(n-k 多项式作为。