通信原理课程设计与实践
题目:线性分组码编码与译码仿真设计
学 院: 专 业: 姓 名: 学 号: 指导老师:
——基于M语言汉明码的译码
计算机与通信工程 通信工程 龚利明 20145826 宫铭举 童峥嵘 2016年12月
摘 要
当代社会,线性分组码是差错控制编码的重要一种,在本次课程设计中,
我们采用MATLAB对线性分组码(7,4)码进行编码与译码的仿真设计。当接收到的六位码字中有一位发生错误时,可以纠正这一位错码;当接收到的码字有两位发生错误时,只能纠正一位错误,但同时能检测出另一位错误不能纠正。只有特定位有两位错误时,才能纠正两位错误。这样就译出正确的信息码组,整个过程是用MATLAB语言实现的。
为了实现通信,在信号传输过程中,往往由于信道传输特性不理想以及加性噪声的影响,传输的信息中不可避免地会发生错误,影响通信系统的传输可靠性。随着数字通信技术的发展,各种业务对系统误码率的要求也逐渐提高,采用差错控制编码技术是提高数字通信可靠性的有效方法之一。差错控制编码就是在发送端的信息码无序列中,以某种确定的编码规则加入一些监督码元,使信息码元与监督码元之间具有某种相关性。接收端通过检验这种相关性是否存在来判断在传输过程中是否出现了误码。
关键词:线性分组码,汉明码,译码
目 录
第一章 绪论 ...................................................... 1
1.1线性分组码的意义 ............................................ 1 1.2汉明码的简单介绍 ............................................ 1 1.3 对MATLAB的介绍 ............................................ 2
第二章 线性分组码的结构与设计 ................................. 3
2.1线性分组码的原理解析 ........................................ 3 2.1.1线性分组码的原理介绍 ...................................... 3 2.1.2线性分组码的译码设计原理 .................................. 5 2.2线性分组码的逻辑设计 ........................................ 5
2.2.1 程序设计译码逻辑图 .................................... 5 2.2.2对于编码的简单概述 .................................... 9
第三章 线性分组码系统调试 ..................................... 10
3.1编译码调试 ................................................. 10 3.2仿真输出结果 ............................................... 12
第四章 总结与展望 .............................................. 14
4.1总结问题 ................................................... 14 4.2展望未来 ................................................... 14
参考文献 ........................................................ 15 附 录 ........................................................ 16
附录1 程序代码 ................................................ 16
致 谢 ........................................................ 19
天津理工大学2014级通信原理课程设计与实践
第一章 绪论
1.1线性分组码的意义
在本次课设通过对线性分组码中的(7,4)码编译过程的编程实现,了解到线性分组码的构成方式是把信息序列分成每k个码元一段,并由这k个码元按一定规则产生r 个校验位,组成长度为n=k+r的码字,用(n,k)表示。信息码元与校验位之间为线性关系。并且知道了线性分组码中的(7,4)码的编码过程信息码元与校验位之间的线性关系实现起来是时分简单的.分组码是一组固定长度的码组(n , k),通常它用于前向纠错。在分组码中,监督位被加到信息位之后,形成新的码。在编码时,k个信息位被编为n位码组长度,而n-k个监督位的作用就是实现检错与纠错。对于长度为n的二进制线性分组码,它有种可能的码组,从种码组中,可以选择M=个码组(k 1.2汉明码的简单介绍 汉明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为海明码。当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错。与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置。在接受端通过纠错译码自动纠正传输中的差错来码纠错功能,称为前向纠错FEC。 在数据链路中存在大量噪音时,FEC可以增加数据吞吐量。通过在传输码列中加入冗余位(也称纠错位)可以实现前向纠错。但这种方法比简单重传协议的成本要高。汉明码利用奇偶块机制降低了前向纠错的成本。进行奇偶校验的方法是先计算数据中1的个数,通过增加一个0或1(称为校验位),使1的个数变为奇数(奇校验)或偶数(偶校验)。例如,数据1001总共是4个比特位,包括2个1,1的数目是偶数,因此,如果是偶校验,那么增加的校验位就是一个0,反之,增加一个1作为校验位。通过“异或”运算来实现偶校验,“同或”运算来实现奇校验。单个比特位的错误可以通过计算1的数目是否正确来检测出来,如果1的数目错误,说明有一个比特位出错,这表示数据在传输过程中受到噪音影响而出错。利用更多的校验位,汉明码可以检测两位码错,每一位的检错都通过数据中不同的位组合来计算出来。校验位的数目与传输数据的总位数有关,可以通过汉明规则进行计算:d+p+1<=2的p次方d表示传输数据位数目,p表示校验位数目。两部分合称汉明码字,通过将数据位与一个生成矩阵相乘,可以生成汉明码字。分迅速,很多电子产品已经渐的融入了我生活,电子抢 1 天津理工大学2014级通信原理课程设计与实践 1.3对Matlab的介绍 MATLAB(矩阵实验室)是MATrix LABoratory的缩写,是一款由美国The MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其它语言(包括C,C++和FORTRAN)编写的程序。 MATLAB由一系列工具组成。这些工具方便用户使用MATLAB的函数和文件,其中许多工具采用的是图形用户界面。包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。随着MATLAB的商业化以及软件本身的不断升级,MATLAB的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强,操作更简单。而且新版本的MATLAB提供了完整的联机查询、帮助系统,极大的方便了用户的使用。简单的编程环境提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。 MATLAB是一个包含大量计算算法的集合。其拥有600多个工程中要用到的数学 运算函数,可以方便的实现用户所需的各种计算功能。函数中所使用的算法都是科研和工程计算中的最新研究成果,而前经过了各种优化和容错处理。在通常情况下,可以用它来代替底层编程语言,如C和C++ 。在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。MATLAB的这些函数集包括从最简单最基本的函数到诸如矩阵,特征向量、快速傅立叶变换的复杂函数。函数所能解决的问题其大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程的组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学 运算、多维数组操作以及建模动态仿真等。 M语言,编程语言,是微软新Oslo发展和面向服务策略的一部分。一种演算纸方式的编程语言。通过这种语言,用户可以用类似于数学公式的方式来编写算法,大大降低了编程所需的难度并节省了时间,从而让用户把主要的精力集中在算法的构思而不是编程上。在一个软件为中心的世界里,我们已经有了太多太多的计算机语言用以编程——从脚本语言到字节码编译语言,再到最高级的架构语言和嵌入式语言。而现在,微软正打算开发另外一种编程语言,代号为“M”(代表Microsoft)。这种新编程语言是微软新Oslo发展和面向服务策略的一部分,在保持文本(textual)和特定领域(domaiN-specific)的同时,还整合了来自XAML的特性。与Visual Studio 2010一起,M将与其他两个即将一同发布的组件被直接应用:这两个组件其中一个是QuadraNt,它是一个可视化构建模型的工具;而另外一个组件是在SQL数据库中用于存储和浏览模型的存储器。 2 天津理工大学2014级通信原理课程设计与实践 第二章 线性分组码的结构与设计 2.1线性分组码的原理解析 2.1.1线性分组码的原理介绍 一,监督位 线性分组码是一类重要的纠错码,应用很广泛。在(n,k)分组码中,若监督码元是按线性关系模2相加而得到的,则称其为线性分组码。 一般来说,若汉明码长为n,信息位数为k,则监督位数r?n?k.若希望用r个监督位构造出r个监督关系式来指示一位错码的n种可能位置,则要求 2r?1?n 或 2r?k?r?1 (2.1) 现在以(7,4)分组码为例来说明线性分组码的特点。设其码长为7,前4位是信息位,后3位是监督位,可用下列线性方程组来描述该分组码产生监督位: ?a2?a6?a5?a4??a1?a6?a5?a3 ?a?a?a?a643?0(2.2) 二,监督矩阵H 式(2.2)所示的(7,4)汉明码的监督方程可以改写为: ?a6?a5?a4?a2?0??a6?a5?a3?a1?0 ?a?a?a?a?0430?6式(2.3)可以表示成如下矩阵 (2.3) ?a6??a??5??1110100??a4??0??1101010??a???0??模2????3??? ??0????1011001??a2?????a1??a??0?(2.4) 式(2.4)还可以简记为 H?AT?0T 或 A?HT?0 3 (2.5) 天津理工大学2014级通信原理课程设计与实践 ?1110100??;A??aaaaaaa?;0??000?。 其中H??11010106543210?????1011001?右上标“T”表示将矩阵转置。例如,HT是H的转置,即HT的第一行为H的第一列,HT的第二行为H的第二列等等。 我们将H称为监督矩阵。只要只要监督矩阵H给定,编码时信息位和监督位的关系也就随即确定下来了。 三,生成矩阵G 公式(2.2)也可改写成 ?a6??a2??1110????a???1101??a5??1????a? 4????1011a????0???a3??111??110??a2a1a0???a6a5a4a3?????a6a5a4a3?Q ?101????011?(2.6) 或者 (2.7) 式(2.7)中,Q为一个k*r阶矩阵,它为P的转置,即 Q?PT (2.8) 式(2.8)表示,在信息位给定后,用信息位的行矩阵乘矩阵Q就产生出监督位。 我们将Q的左边加上一个k?k阶单位方阵,就构成一个矩阵G ?1000111??0100110?? G??IkQ????0010101???0001011??(2.9) G称为生成矩阵,因为由它可以产生整个码组 A??a6a5a4a3??G (2.10) 因此,如果找到了码的生成矩阵G,则编码的方法就完全确定了。具有?IkQ?形式的生成矩阵称为典型生成矩阵。由典型生成矩阵的出的码组A中,信息位的位置不变,监督位附加于其 4 天津理工大学2014级通信原理课程设计与实践 后。这种形式的码称为系统码。 四,校验子 送码组A,在传输过程中可能由于干扰引入差错,故接收码组B与A不一定相同。 B??bn?1bn?2???b1b0? (2.11) 则错码行矩阵 E??en?1en?2???e1e0? (2.12) 2.1.2线性分组码的译码设计原理 一,线性码的纠检错能力:对于任一个(n,k)线性分组码,若要在码字内(1) 检测出e个错误,则要求码的最小距离d≥e+1; (2) 纠正t个错误,则要求码的最小距离d≥2t+1; (3) 纠正t个错误同时检测e(≥t)个错误,则要求d≥t+e+1。 二,假设接收端收到的码字为R,那么它和原来发送端发送的码字A之间就有可能存在着误差。即在码组A=[a5 a4 a3 a2 a1 a0]中的任意一位就有可能出错。这样我们在接收端接收到一个码组是就有可能判断错发送端原来应该要表达的意思。为了描述数据在传输信道中出现错误的情况,引入了错误图样E,在错误图样中,0代表对应位没有传错,1代表传输错误。实际上错误图样E就是收序列与发送序列的差。所以在译码中用接收到的码字B模尔加错误图样E就可以得到发送端的正确码字A。因此译码的过程就是要找到错误图样E。 三,定义:伴随式S,S = R *TH= ( A + E ) * T,H= A *TH+ E *T,H= E * T,H(3-10)因为A是编得的正确码字。根据前面所叙述,它和监督矩阵的转置相乘为0。显然,S仅与错误图样有关,它们之间是一一对应的关系。找到了伴随式S,也就可以找到E。而与发送的码字无关。若E=0,则S=0;因此根据S是否为0可进行码字的检错。 2.2线性分组码的的逻辑设计 2.2.1 程序设计译码逻辑图 逻辑图分为编码和译码部分,在小组中我做的是译码部分所以在图2.1先行介绍的是译码部分。再进行编码部分。 如图2.2是线性分组码译码的逻辑设计图: 5 天津理工大学2014级通信原理课程设计与实践 开始 译码输入七位码 b6b5b4b3b2b1b0 根据输入求出校 验子 校正子 S=0? Y 输出四位信息码 N 根据S与E的关系纠正错码 a3a2a1a0 结束 图2.1译码逻辑设计图 (7,4)汉明码的译码器的功能就是把输入的7 位汉明码B=[b6b5b4b3b2b1b0] 译为a3a2a1a0 等4位信息码,并且根据伴随矩阵S 从而纠正编码中可能出现的1 位错码。最后结束译码部分。通过输入s和e之间的关系就能够纠正错码,但是这个汉明码只能够最多检测出两个错码并且只能够纠正一位错码。 表2-2是(7,4)汉明码译码输入、输出对应关系表: 6 天津理工大学2014级通信原理课程设计与实践 表2-1 (7,4)汉明码译码输入输出对应关系 序号 输出校正子错误码率 错码位置C 译码输入a6 a5a4a3a2a1a0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000010 0001111 0010101 0011110 0101110 0100101 0010011 0111000 1000111 1001101 1010000 1011101 1101011 1111000 1010100 0111111 a3a2a1a0 s2s1s0 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 010 100 000 000 011 011 100 000 000 001 010 100 011 101 110 111 b1 b2 无错 无错 2 3 0 0 4 4 6 0 0 1 2 3 4 5 6 7 b3 b3 b5 无错 无错 b0 b1 b2 b3 b4 b5 b6 表2-2是汉明码的全部码组: 7 天津理工大学2014级通信原理课程设计与实践 表2-2 汉明码的全部码组 信息位a6a5a4a3 0000 0001 0010 0011 0100 0101 0110 0111 监督位a3a2a1 000 011 101 110 110 101 011 000 信息位a6a5a4a3 1000 1001 1010 1011 1100 1101 1110 1111 监督位a3a2a1 111 100 010 001 001 010 100 111 由表2-3可知:(7,4)汉明码的最小码距d0=3,它能纠1位错或检2位错。由此可见,汉明码是能够纠正单个错误的线性分组码,其特点是:最小码距d0=3,码长n与监督位r满足关系式。说明上述所说的(7,4)线性分组码就是汉明码。汉明码是一个高效码。 如表2-3所示的是校正子和错误图样之间的关系: 表2-3校正子和错误图样之间的关系表 错码行矩阵E 错误码位 校正子S 错误位置 e6e5e4e3e2e1e0 0000001 0000010 0000100 0001000 0010000 0100000 S2S1S0 001 010 100 011 101 110 b0 b1 第一位 第二位 第三位 第四位 第五位 第六位 b2 b3 b4 b5 8 天津理工大学2014级通信原理课程设计与实践 b6 无错 1000000 0000000 111 000 第七位 无 由上表2-4可知:当S=001时,则出错在1 位,即b0 出错;当S=010时,则出错在2 位,即b1 出错;当S=100时,则出错在3 位,即b2 出错。当S=011时,则出错在4 位,即b3 出错;当S=101时,则出错在5 位,即b4 出错;当S=110时,则出错在6 位,即b5 出错;当S=111时,则出错在7 位,即b6 出错;当S=000时,则无错。 2.2.2对于编码的简单概述 汉明码的编码就是将输入的四位信息码M[a6a5a4a3]加上三位监督码b2b1b0编成七位汉明码[a6a5a4a3a2a1a0]编码输出B=[a6a5a4a3 a2a1a0]。由A=MG=[a6a5a4a3]G可知,信息码M与G的乘积就是编好的(7,4)汉明码。 如图2.2所示是编码的设计流程图: 开始 输入生成矩阵G 输入信息位a6a5a4a3输出(7,4)汉明码 结束 图2.2 编码流程图 根据(7,4)汉明码的编码原理,将上式计算所得的监督位和输入的信息位一起输出,则此次编码就算完成了。 9 天津理工大学2014级通信原理课程设计与实践 第三章 线性分组码的系统调试 3.1编译码调试 1.编码部分:为译码成功打下坚实的基础。如图3.1所示是编码部分: 图3.1 编码部分 图3.1表示的是编码部分,开始先输入生成矩阵,接着利用公式求出监督矩阵,然后输出监督矩阵,然后输入I,同样利用公式求出汉明码的许用码组矩阵,最后输出许用码组。 2.译码部分: 1.如图3.2所示的是求出伴随式S中的代码 1 0 天津理工大学2014级通信原理课程设计与实践 图3.2 求出伴随式S 图3.2表示的是译码部分,首先输入生成矩阵,再输入接收的码组,接着通过输入的 接收码组再对a和b进行赋值,接着输入错误码组,然后同样利用公式求出监督码组和伴随式S,再者输出伴随式。 2.图3.3是接着图3.2的部分: 图3.3求S与E的和 图3.3为对i=1进行赋值,然后进行for循环通过s利用公式求出M的值,再通过for循环,利用switch语句求出正确值A。 3.图3.4是接着图3.3的延伸: 图3.4 显示第几位出错 1 1 天津理工大学2014级通信原理课程设计与实践 图3.4显示的是通过for循环,再通过M的值与错码的对应关系,求出对应的错码在第几位。 4.同理,图3.5是基于图3.4的延伸 图3.5输出正确码组 图3.5译码4表示的是:首先,对A取余数,再利用while分别进行三次的循环输出I。 3.2 仿真输出结果 1.接下来就是仿真:接收码组1. 1 2 天津理工大学2014级通信原理课程设计与实践 图3.5输入错误接收码组 图3.5表示的是输入接收码组为3行7列的码组,并且分别在a0,a1,a2上分别产生错码,所以反正结果为提示第1,2,3位是错误,最后输出纠正后的码组和信息码组I。 2.接收码组2: 图3.6输入正确接收码组 图3.6输入码组2显示的是输入接收码组2,我选择的是没有出现错误。 1 3 天津理工大学2014级通信原理课程设计与实践 第四章 总结与展望 4.1总结 对于本次课程设计的结束,我真切感觉到自己知识能力的匮乏,很多东西都只是知道一些浅显的知识,真正搞懂会应用的东西很少。或许一个人的进步需要一个缓慢的过程。在过程中需要不断地借鉴,学习,汲取别人的东西。同别人的成果中攫取知识和营养,然后它变成自己的东西。通过这次课程设计。我学到了很多东西,首先,通过这次课程设计,我熟练地掌握了汉明码的纠错码的原理,了解的(7,4)汉明码的相关知识。其次,我觉得学习理论和实践是两个层次,理论指导实践,而实践验证理论,理论往往是在理想的条件下得出的,而实践是在现实生活中进行的,所以,实践得出的结论往往与理论的结论有一定的差别,这是很正常的。另外团结协作,互助共赢是时代的主流。在这次课设的制作中,交流合作的精神在我们体现的可谓是淋漓尽致。相互探讨,学习交流,优势互补,这样才最终处成了这课设。争论与交流是解决问题很好的方法,问题也总是在思想与意见的碰撞中得到解决而这也是我们对理论理解的更为深刻。通过图书馆,搜索引擎查阅资料的能力也得到了相应的提升。总之,在这次课程设计的制作的过程中学到了很多东西,能力也有相应的提升。在此还要感谢指导老师的辛勤教导,感谢老师在此次课程设计中给以孜孜不倦的解惑。 4.2展望 课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。本次课设通过对线性分组码中的(7,4)码编译过程的编程实现,了解到线性分组码的构成方式是把信息序列分成每k个码元一段,并由这k个码元按一定规则产生r 个校验位,组成长度为n=k+r的码字,用(n,k)表示。信息码元与校验位之间为线性关系。并且知道了线性分组码中的(7,4)码的编码过程信息码元与校验位之间的线性关系实现起来是相对简单的。线性分组码具有编译码简单,封闭性好等特点,采用差错控制编码技术是提高数字通信可靠性的有效方法,是目前较为流的差错控制编码技术之一。 1 4 天津理工大学2014级通信原理课程设计与实践 参考文献 [1] 樊昌信 通信原理 北京:国防工业出版社,2002 [2] 刘敏 MATLAB 通信仿真与应用 国防工业出版社,2006 [3] 王彦朋. 大学生电子设计与应用.北京:中国电力出版社,2012 [4] 吴伟陵等著 移动通信原理 北京:电子工业出版社,2005 [5] 赵静 基于MATLAB的通信系统仿真 北京:北京航空航天大学出版社,2013 [6]葛哲学 精通MATLAB 北京:电子工业出版社,2008年 [7]徐东艳 孟晓刚编. MATLAB函数库查询词典. 中国铁道出版社. 2006 [8]吴玲达 杨冰等编. 计算机通信原理与技术. 国防科技大学出版社. 2003 1 5 天津理工大学2014级通信原理课程设计与实践 附 录 附录1 程序代码 clear all close all G=[1 0 0 0 1 1 1; 0 1 0 0 1 1 0; 0 0 1 0 1 0 1; 0 0 0 1 0 1 1]; H=gen2par(G); disp('监督矩阵为:H='); disp(H); I=[0 0 0 0;0 0 0 1; 0 0 1 0;0 0 1 1; 0 1 0 0;0 1 0 1; 0 1 1 0;0 1 1 1; 1 0 0 0;1 0 0 1; 1 0 1 0;1 0 1 1; 1 1 0 0;1 1 0 1; 1 1 1 0;1 1 1 1]; C=rem(I*G,2); disp('所得汉明码组结果为:C='); disp(C); clear all; close all; G=[1 0 0 0 1 1 1; 0 1 0 0 1 1 0; 0 0 1 0 1 0 1; 0 0 0 1 0 1 1]; R=input('请输入接收到的码组R:'); [a,b]=size(R); E=[0 0 0 0 0 0 0;1 0 0 0 0 0 0; 0 1 0 0 0 0 0;0 0 1 0 0 0 0; 0 0 0 1 0 0 0;0 0 0 0 1 0 0; 1 6 天津理工大学2014级通信原理课程设计与实践 0 0 0 0 0 1 0;0 0 0 0 0 0 1]; H=gen2par(G); S=rem(R*H',2); disp('所得伴随式为:S='); disp(S); i=1; for i=1:1:a M(i,1)=S(i,1).*4+S(i,2).*2+S(i,3); end for i=1:1:a switch(M(i,1)) case 0 A(i,:)=R(i,:)+E(1,:); case 7 A(i,:)=R(i,:)+E(2,:); case 6 A(i,:)=R(i,:)+E(3,:); case 5 A(i,:)=R(i,:)+E(4,:); case 4 A(i,:)=R(i,:)+E(6,:); case 3 A(i,:)=R(i,:)+E(5,:); case 2 A(i,:)=R(i,:)+E(7,:); case 1 A(i,:)=R(i,:)+E(8,:); end end for i=1:1:a switch(M(i,1)) case 0 disp('没有出现错误!'); case 1 disp('注意:第1位出现一个错误!请纠正!'); case 2 1 7 天津理工大学2014级通信原理课程设计与实践 disp('注意:第2位出现一个错误!请纠正!'); case 4 disp('注意:第3位出现一个错误!请纠正!'); case 3 disp('注意:第4位出现一个错误!请纠正!'); case 5 disp('注意:第5位出现一个错误!请纠正!'); case 6 disp('注意:第6位出现一个错误!请纠正!'); case 7 disp('注意:第7位出现一个错误!请纠正!'); end end A=rem(A,2); disp('检纠错后的码组A='); disp(A); j=1; while j<=4 I(:,j)=A(:,j); j=j+1; end disp('译出的信息序列I='); disp(I); 1 8 天津理工大学2014级通信原理课程设计与实践 致 谢 很高兴这次能能够完成这次的电子课程设计。尤其是与老师和同学给予我的帮助是分不开的,老师们的悉心指导让我们很快找到了入手的方向,小组成员之间的团结协作让组内工作非常高效和有序,这次的实践让我学到了很多,无论是知识,还是友谊,都将会是我人生中一笔宝贵的财富,在此向大家表达一下我由衷地感谢,希望在接下来的工作和学习中,我们一起共同进步! 1 9