
信息论课程设计.doc
34页华北科技学院信息论基础课程设计说明书班级:计算B092 :宁⑺设计题目: 信源编码软件 设计时间: 至 指导教师: 慧 评 语: 目录设计总说明 1前 言 2第1章 总体设计方案 31.1 软件结构设计 3第2章 算法思想及设计 42.1香农编码 4香农编码思想: 4香农编码算法设计: 62.2费诺编码 6费诺编码思想 6费诺编码算法设计 7第3章 软件详细设计 73.1主界面设计 73.2功能设计 8香农编码的实现 8费诺编码的实现 15有关文档的 20皮肤切换的设计 22第4章 软件测试 244.1香农编码的测试 244.1.1 软件运行及结果测试 244.2费诺编码的测试 254.2.1 软件运行及结果测试 254.3测试结果 27第5章 总结 27参 考 文 献 28附 录 29设计总说明早期的数据压缩起源于人们对概率的认识当对文字信息进行编码时,如果为出现概率较 高的字母赋予较短的编码,为出现概率较低的字母赋予较长的编码,平均编码长度就能缩短不 少印象中的著名的Morse电码就是一个例信息论之父曾指出,任何信息都存在 冗余,冗余大小与信息中每个符号的出现概率(不确定性)有关。
他所提出的无失真信源编码 定理奠定了数据压缩的理论基础数据压缩的目的就是要消除信息中的冗余,而信息熵及相关 的定理恰恰用数学手段精确地描述了信息冗余的程度本文主要采用香农编码和费诺编码方法来描述信源的编码过程香农编码采用信源符号与概 率由用户输入通过一定的校验代码确保离散信源的正确性例如单个符号的概率不能大于 1, 概率和不能大于 1,信源概率和不为 1 时无法编码等校验由于香农编码是将信源概率由大到小 排序的,所以,本软件也实现了这一点,输入时不必考虑信源概率顺序问题,软件会自动按概 率排序编码最后将结果显示在 MFC 列表控件上用户可以将最终结果保存成文件费诺编码 通过输入字符串来自动计算单个信源符号的概率当然,为了方便起见,本软件对费诺编码还 提供了打开文件完成信源输入,从而可以更快的输入字符串进行编码时同样按概率从大到小 排序,同样可以将结果保存到文件中本软件界面友好,方便可靠,用户可根据自己的爱好选择不同的界面风格在首页加入了 好看的Flash使软件更为美观同样反映除了本软件的功能特性根据实验要求和日常压缩数据的习惯,本软件最终完成了以下目标:1、 界面设计友好,美观,数据存储安全,可靠。
2、 操作简便、适用,无冗余操作3、 编码效率较高,编码时间短关键词: 离散信源;香农编码;费诺编码;信源熵、八前言本课程设计是在学习了《信息论与编码》和相关开发的软件课程后,让学生通过实际的操 作来熟悉信源编码微机实现,培养学生能够独立的完成对相关课题或者项目的分析能力、设计 能力和调试能力本课程设计是衔接在大一时C课程设计之后的,同样是运用MFC程序来设 计,联系本学期所学容,要求有独立的操作界面由于在以前有过类似的练习,故在这次的课 程设计相对以前来说不是太难在这次的课程设计中,着重培养的是学生的自学能力,以及独 立分析互联网上和图书馆里的各种资料,来丰富自己的知识并且提高对数学公式的计算机实 现、VC+等软件的实际操作能力通过这次的课程设计,能够使学生对已经学习过的信息论与 编码课程的进一步的掌握,能够对知识进行最大程度的消化融汇因此这次的课程设计对我们 有着非常重要的意义本课程设计中用VC+编写出基于MF(界面的简单软件以实现压缩信源的目的软件应用香 农编码的相关理论,经过比较系统合理的编程操作,实现可视化的窗口以方便用户使用通过 简单校验确保信源正确性,保证软件的可靠性最终将结果保存为文档方便记录编码结果。
通过让完成具体编码算法的程序设计和调试工作,达到提高编程能力和深刻理解编码理论 的目的培养我们使用计算机和查阅参考资料的能力,提高我们的基本设计能力培养了理论 联系实际和独立思考的能力并激发我们的实际开发创造的意识和能力培养和提高我们的自 学能力以及综合运用所学理论知识去分析解决实际问题的能力第1章总体设计方案1.1软件结构设计图软件功能结构图输入信源符 号和概率 »检验信息—正确f进行编码J 丿错误I 1显示结果信概累码码尸 1信信编源加源息码符率概长字效号L -J率LJL L y熵率L J率7图香农编码流程图第2章算法思想及设计2.1香农编码香农编码思想:设有离散无记忆信源:X1 x2P(xj P(X2);n ) / P(Xi) 1P(Xn) i 11 •按信源符号的概率从大到小的顺序排列,为方便起见,可令P(Xi) P(X2)P(Xn)2•令p(xo) 0,用pa (x j ), j i 1表示第i个码字的累加概率j 1Pa(Xj) P(Xi) j 1,2, ,ni 13 •确定满足下列不等式的整数ki,并令ki为第i个码字的长度log 2 p(Xi) ki 1 log2 p(Xi)4 •把Pa(Xj)用二进制表示,用小数点后的ki位作为Xi的码字例:有一单符号离散无记忆信源P(X)X1 x20.25 0.25X3 X4 X50.2 0.15 0.1X60.05对该信源编二进制香农码编码过程:Pa(Xj)P(Xi)Pa(Xj)ki码字X10.250200X20.250.25201X30.20.53100X40.150.73101X50.10.8541101X60.050.955111102.42RK—logP(X)ki 2.7H(x)i 0H(X)89.63%2 m_ 6K香农编码算法设计:通过文本框输入信源符号及相应概率。
用冒泡法将信源符号及概率依概率由大到小排序, 计算其累加概率,用数学公式计算每个信源符号的ki最后把结果写入列表控件中,以可视化 方式显示编码结果2.2费诺编码费诺编码思想设有离散无记忆信源X X2 ..… XnP(X1) P(X2)..…P(Xn)nP(Xi) 1i 11. 按信源符号的概率从大到小的顺序排队不妨设P(xj P(X2)…… P(Xn)2. 将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同, 并对各组赋予一个二进制码元“ 0”和“ 1”3. 将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同, 并对各组赋予一个二进制符号“ 0”和“ 1”4. 如此重复,直至每个组只剩下一个信源符号为止5. 信源符号所对应的码字即为费诺码例:有一单符号离散无记忆信源X X1X2 X3 X4 X5 X6P(X) 0.32 0.22 0.18 0.16 0.08 0.04对该信源编二进制费诺码编码过程X10.320000X20.2210110X30.1810X40.1610110X50.08101110X60.0411111H (X) 2.35(bit/sign)R K log 2 mH(x)R97.92%6K p(x)ki 2.4(比特 / 符号)i 1费诺编码算法设计通过输入字符串或打开相关文件获取字符串,用字符串处理方法统计每个字符的数量及运 算其概率。
然后按照每个字符的概率用冒泡法进行排序然后用递归的思想进行费诺编码,求得了每个字符的二进制码字并且对编码后的平均码 长,以及编码的传输效率进行了求解第3章软件详细设计3.1主界面设计编码软件主界面如图所示,基本功能在菜单中进行选择用Falsh CS5软件设计一个简单的Flash插入到主界面,使界面更美观而且形象nO华二 电子信息与电气学料规划敎材•电子信息科学与工程类专业图主界面3.2功能设计香农编码的实现香农编码是通过编辑框依次输入信源符号和概率的,输入时同时完成校验工作即单个信 源符号概率不能大于1,信源概率和不能大于1,概率和不为1时不能进行编码正确输入信源 符号及其概率后便可计算出该离散信源的码长、码字等信息可以讲编码结果保存为txt文本等 文件骗码拮果平均码长 I 同輛 I信息率 I编码效冇漏码保存结果1Sff_ ―“返回图香农编码界面图322保存编码结果(1)添加信源代码:void CSha nnon Code::O nAdd(){// TODO: Add your con trol no tificati on han dler code here UpdateData(true);CString tempf1,tempf2; //添加之前、之后列表控件值float sum=0.0, sum2=0.0, tempa1, tempa2;if(m_prob >= 1.0) //单个信源符号概率不能大于 1{MessageBox(概率小于 1!","提示");return;}for(int i = 0;i < count;i++) //计算信源概率和{ tempf1 = m_list1.GetItemText(i,1);tempa1 = (float)(atof(tempf1));sum = sum +tempa1;}if(sum >= 1.0) //如果和大于等于 1 ,则不再添加{MessageBox(信源概率和已等于1!无法添加!",”提示"); return;}CString s1,s2; m_list1.InsertItem(r,""); s1.Format("%s",m_single); m_list1.SetItemText(r,0,s1); s2.Format("%.6f",m_prob); m_list1.SetItemText(r,1,s2); r++; count++;for(int j = 0;j < count;j++) //计算信源概率和{tempf2 = m_list1.GetItemText(j,1); tempa2 = (float)(atof(tempf2)); sum2 = sum2 +tempa2;}if(sum2 > 1.0) //如果添加后概率和大于 1,则最后添加的信源不做计算{MessageBox(当前信源添加后信源概率和大于1!","提示"); s1.Format("%s","")。