J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*实践教学#J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J* #J*2011 年春季学期目:计算机通信》 课程设计■_rJ线性分组码的编译码软件设计专业班级: 姓 名:学 号:指导教师: —成 绩: 摘要本次课程设计是(7,4)线性分组码的编译码软件设计,该软件可以对输入的多个四位信息 码进行Hamming编码,对于接收的多个七位信息码可以进行译码,从而译出四位信息位当 接收的信息码中有一位错误时,可以纠正这一位错码,进而译出正确的信息码组,整个程序 是用 C 语言编写的关键词:线性分组码;编码;译码;纠错;检错目录前言 1一、 C语言简介 21.1什么是C语言 21.2 C 语言的特点 21.3运行C程序的步骤与方法 3二、 设计目标 5三、 线性分组码的基本原理 63.1 线性分组码的编码 63.1.1 监督矩阵 63.1.2 生成矩阵 83.2 线性分组码的译码 93.2.1 码的距离及纠检错能力 93.2.2 伴随式与译码 10四、 推导过程 114.1 编码过程 114.2 译码过程 11五、 程序设计及仿真分析 135.1 程序流程图 135.1.1 主程序流程图 135.1.2 编码程序流程图 145.1.3 译码程序流程图 155.2 程序运行分析 165.2.1 主程序运行分析 165.2.2 编码运行分析 195.2.3 译码运行分析 205.3 软件分析 21设计总结 23致谢 23参考文献 24附录 25前言数字通信系统是以数字信号的形式来传递信息的一种通信系统。
它所包括的范围很广, 从现在的市话通信系统、数字蜂窝系统、计算机通信系统到雷达系统、遥控测控系统、计算 机运算和存储系统等都是数字通信系统所有数字通信系统都可归结为如图 1所示的模型图 1 数字通信系统模型图 1 中,信源编码器把信源发出的消息如语言、图像、文字等转换成为二进制(也可以 转换成为多进制)形式的信息序列,并且为了传输有效,还去掉一些与传输信息无关的冗余 有时为了保密,信源编码器后还可以接上加密器为了抗击传输过程中的各种干扰,往往要 认为地增加一些冗余,使系统具有自动检错和纠错能力,这种功能由图中的信道编码器即纠 错编码器完成调制器的功能是把纠错编码器送出的信息序列通过调制器变换成适合于信道 传输的信号数字信号在信道传输过程中,总会遇到各种干扰而使信号失真,这种失真信号 传输到接收端的解调器进行解调,变成二进制信息(多进制)序列由于信道干扰的影响, 该信息序列中可能有错误,经过信道译码器即纠错码译码器,对其中的错误进行纠正,再通 过信源译码器(及解密器)恢复成原来的消息送给用户从上可知,信道编码是用来控制有扰信道对信息序列所产生的差错,故也称为差错控制 编码这种方法是提高数字通信可靠性的有效方法,也是目前较为流行的差错控制编码技术。
分组码是一组固定长度的码组,可表示为(n , k),通常它用于前向纠错在分组码中, 监督位被加到信息位之后,形成新的码在编码时,k个信息位被编为n位码组长度,而n-k 个监督位的作用就是实现检错与纠错这种码的编码效率比较高,因此得到了广泛的应用一、c语言简介1.1什么是C语言C 语言是一种计算机程序设计语言它既具有高级语言的特点,又具有汇编语言的特点 它由美国贝尔研究所的D.M.Ritchie于1972年推出1978后,C语言已先后被移植到大、中、 小及微型机上它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设 计语言,编写不依赖计算机硬件的应用程序它的应用范围广泛,具备很强的数据处理能力, 不仅仅是在软件开发上,而且各类科研都需要用到 C 语言,适于编写系统软件,三维,二维 图形和动画具体应用比如单片机以及嵌入式系统开发1.2 C语言的特点一种语言之所以能存在和发展,并具有较强的生命力,总是有不同于其他语言的特点 主要的优缺点介绍如下优点•简洁紧凑、灵活方便C语言一共只有32个关键字,9种控制语句,程序书写 形式自由,区分大小写把高级语言的基本结构和语句与低级语言的实用性结 合起来。
C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是 计算机最基本的工作单元•运算符丰富C语言的运算符包含的范围很广泛,共有 34种运算符C语言把 括号、赋值强制类型转换等都作为运算符处理从而使 C 语言的运算类型极 其丰富,表达式类型多样化灵活使用各种运算符可以实现在其它高级语言中 难以实现的运算• 数据类型丰富 C 语言的数据类型有:整型、实型、字符型、数组类型、指针 类型、结构体类型、共用体类型等能用来实现各种复杂的数据结构运算并 引入了指针概念,使程序效率更高另外 C 语言具有强大的图形功能,支持多 种显示器和驱动器且计算功能、逻辑判断功能强大• C 是结构式语言结构式语言的显著特点是代码及数据的分隔化,即程序的各 个部分除了必要的信息交流外彼此独立这种结构化方式可使程序层次清晰, 便于使用、维护以及调试 C 语言是以函数形式提供给用户的,这些函数可方 便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化• 语法限制不太严格,程序设计自由度大虽然 C 语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度• 允许直接访问物理地址,对硬件进行操作。
由于C语言允许直接访问物理地址, 可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的 许多功能,能够像汇编语言一样对位、字节和地址进行操作,而这三者是计算 机最基本的工作单元,可用来写系统软件• 生成目标代码质量高,程序执行效率高一般只比汇编程序生成的目标代码效率低 10 20%• 适用范围大, 可移植性好 C 语言有一个突出的优点就是适合于多种操作系统,女口 DOS、UNIX、windows 98. windows NT;也适用于多种机型 C语言具有 强大的绘图能力,可移植性好,并具备很强的数据处理能力,因此适于编写系 统软件,三维,二维图形和动画,它也是数值计算的高级语言缺点• C 语言的缺点主要表现在数据的封装性上,这一点使得 C 在数据的安全性上有 很大缺陷,这也是C和C++的一大区别• C 语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等从应用的角度,C语言比其他高级语言较难掌握1.3 运行 C 程序的步骤与方法为了使计算机能按照人的意志进行工作,必须根据问题的要求,编写出相应的程序为 了使计算机能执行高级语言源程序,必须先用一种称为“编译程序”的软件,把源程序翻译成 二进制形式的“目标程序”,然后再将该目标程序与系统的函数库以及其他目标程序连接起来, 形成可执行的目标程序。
在编好一个C源程序后如何上机运行呢?在纸上写好一个程序后,要经过这样几个步骤: 上机输入与编辑源程序T对源程序进行编译T与库函数连接T运行目标程序以上过程如 图2 所示图中实线表示操作流程,虚线表示文件的输入输出例如,编辑后得到源程序文 件f.c,然后在进行编译时再将源程序文件f.c输入,经过编译得到目标程序文件f.obj,再将 目标程序f.obj输入内存,与系统提供的库函数等连接,得到可执行的目标程序f.exe,最后把 f.exe调入内存再使之运行有有错?无可执行目标程序f.exe库函数和其 他目标程序目标程序f.obj源程序f.c结果 正确?f开始)不正确正确I结束丿编辑编译连接执行图 2 运行 C 程序的流程图二、设计目标本次课程设计主要是用C语言编写一个(7, 4)线性分组码的编译程序,最基本的是要 具备对输入的信息码进行编码,让它具有抗干扰的能力同时,还要让它具有对接收到的整 个码组中提取信息码组的功能但是,在实际的通信系统中,由于信道传输特性不理想以及 加性噪声的影响,接收到的信息中不可避免地会发生错误,影响通信系统的传输可靠性,因 而,本设计要让该程序具有纠正错误的能力,当接收到的码组中有一位码,发生错误时可以 检测到这一位错码,并且可以纠正这一位错码,最终系统可以从纠正后的码组中提取正确的 信息码组;对于接收码组中出现的两位错误,能检测到错误,但是不能正确的纠正错误。
该编译器针对具体的生成矩阵_1 0 0 0 1 1 1_0 10 0 110G =0 0 10 10 10 0 0 1 0 1 1完成如下工作:1. 完成对任意信息序列的编码2. 根据生成矩阵,形成监督矩阵;3. 根据得到的监督矩阵,得到伴随式,并根据它进行译码;4. 验证工作的正确性三、线性分组码的基本原理3.1 线性分组码的编码3.1.1 监督矩阵线性分组码(n, k)中许用码组为2k个定义线性分组码的加法为模二加法,乘法为二进 制乘法即 1 + 1 二 0、1 + 0 二 1、0 + 1 二 1、0 + 0 二 0 ; 1X 1 = 1、1 X 0 二 0、0 X 0 二 0、0 X 1 二 0 且码组与码组的运算在各个相应比特位上符合上述二进制加法运算规则线性分组码具有如下性质(n,k)的性质:1. 封闭性任意两个码组的和还是许用的码组2. 码的最小距离等于非零码的最小码重对于码组长度为n、信息码元为k位、监督码元为r = n - k位的分组码,常记作(n,k)码, 如果满足2r -1 > n,则有可能构造出纠正一位或一位以上错误的线性码下面我们通过(7, 4)分组码的例子来说明如何具体构造这种线性码。
设分组码(n,k)中,k = 4,为能纠正一位误码,要求r > 3取r = 3,则n = k + r = 7该例子中,信息组为(a a a a ), 6543码字为(a a a a a a a )用S , S , S的值与错码位置的对应关系可以规定为如表1所列6 5 4 3 2 1 0 1 2 3由表中规定可知,当已知信息组时,按以下规则得到三个校验元,即:S = a㊉a㊉a ㊉a1 6 5 4 2
接收端收到每个码组后先按式(3.1)计算出s , S和S,再按表1判断错码情况1 2 3表 2 ( 7 , 4 )线性分组码(海明码)信息组码组信息组码组00000000000100010001110001000101110011001100001000101011010101001000110011110101110110010100010011011001100001010101011011101110111001100110011111011101000111011100011111111111给出(7,4)线性分组码有24即16个许用码字或合法码字,另有27 - 24个禁用码字发送方发送的是许用码字,若接收方收到的是禁用码字,则说明传输中发生了错误因此,这式 3.3)按上述方法构造的码称为海明码表2所列的(7,4)海明码的最小码距d二3,0—1 -r》Cr — 1L种码能纠正一个错码或检测两个错码海明码的编码效率等于r - 1/1 — r /n当n很大时,则编码效率接近1可见,海明码是一种高效码现在再来讨论线性分组码的一般原理上面已经提到,线性码是指信息位和监督位满足一组线性方程的码,式(3.1)就是这样一组线性方程的例子。
现在将它改写成:1 • a㊉1 • a㊉1 • a㊉0 • a㊉1 • a㊉0 • a=06543201 • a㊉1 • a㊉0 • a㊉1 • a㊉0 • a㊉0 • a=06543201 • a6㊉0 • a5㊉1 • a4㊉1 • a3㊉0 • a2㊉1 • a0=0式 3.4)式( 3.4)可以表示成如下矩阵形式:a6a5j110100_a4o1101010a3—01011001a2a1a00模2)式 3.5)上式还可以简记为:H • At = Ot 或 A • Ht = 0式 3.6)其中A = \a a a a a a a65432100 1 0 0101010011 1 1H =1101 0 1O = t) 0 o]右上标“T”表示将矩阵转置将H称为监督矩阵,编码时只要监督矩阵给定,编码时监督位和信息位的关系就完全确 定由式(3.4)、式(3.5)都可看出,H的行数就是监督关系式的数目,它等于监督位的数 目rH的每行中的T”的位置表示相应码元之间存在的监督关系式(3.5)中的H矩阵可 以分为两部分:1110:100H=1101:0101011:001=tPI]r式 3.7)式中,P为r x k阶矩阵,I为r x r阶单位方阵,将具有bl ]形式的H矩阵称为典型监督矩rr阵。
由代数理论可知,H矩阵的各行应该是线性无关的,否则将得不到r个线性无关的监督 关系式,从而也得不到r个独立的监督位若一行矩阵能写成典型的矩阵形式\PI ],则其各 r行一定是线性无关的因为容易验证Il ]的各行是线性无关的,故bl ]也是线性无关的rr3.1.2 生成矩阵类似于式(3.4)改变成式(3.5)中矩阵形式那样,式(3.5)也可以改写成:a「1 1 1 0「2a=110 11a一 n -10 110a6 a5 a4 a式 3.8)或者Ia2a ]= Ia061-1a -3 1a3]Q式 3.9)式中,Q为一个k x r阶矩阵,即它为P的转置,即Q = PT式 3.10) 式(3.9)表明,信息位给定后,用信息位的行距乘矩阵Q就产生出监督位 将Q的左边加上一 k x k阶单位方阵就构成一矩阵G,即1 000111G = 1/ Q ]=0 100110(式 3.11)k0 0101010 001011G 称为生成矩阵,因为由它可以产生整个码组,即有la a a a aaa ]= laaaa ]• G(式 3.12)65432106543或者A = la6a5aa43]•G(式 3.13)因此,如果找到了码的生成矩阵G,则编码的方法就完全确定。
具有形式的生成矩k阵称为典型生成矩阵由典型生成矩阵得出的码组A中,信息位不变,监督位附加于其后, 这种码称为系统码与H矩阵相似,也要求G矩阵的各行是线性无关的因为由式(3.13)可以看出,任一 码组A都是G的各行的线性组合G共有k行,若它们线性无关,则可组合出2k种不同的码 组A,它恰是有k为信息位的全部码组;若G的各行有线性相关的,则不可能由G生成2k种 不同码组了实际上,G的各行本身就是一个码组因此,如果已有k个线性无关的码组, 则可以用其作为生成矩阵G,并由它生成其余的码组3.2 线性分组码的译码3.2.1 码的距离及纠检错能力1.码的距离两个码字之间,对应位取之不同的个数,称为汉明距离,用d表示一个码的最小距离d .min定义为d = min{d(c ,c ), i丰j,c ,c e (n,k)},两个码字之间的距离表示了它们之间差别的 min i j i j大小距离越大,两个码字的差别越大,则传送时从一个码字错成另一码字的可能性越小 码的最小距离愈大,其抗干扰能力愈强2.线性分组码的纠检错能力对于任一个(n, k)线性分组码,(1) 若要在一个码字内检测出e个错误,则要求码的最小距离d > e +1 ;(2) 纠正t个错误,则要求码的最小距离d > 2t +1 ;(3) 纠正t个错误同时检测e(e > t)个错误,则要求d > t + e +1。
3.2.2 伴随式与译码一般说来,式(3.13)中A为一n列的行矩阵此矩阵的n个元素就是码组中的n个码元, 所以发送的码组就是A此码组在传输中可能由于干扰引入差错,故接收码组一般说来与A不 一定相同若设接收码组为一n列的行矩阵B,即B = \b b …b ] (式 3.14)n-1 n - 2 0则发送码组和接收码组之差为:B- A 二 E (模 2) (式 3.15)它就是传输中产生的错码行矩阵,其中E = \e e …e ] (式 3.16)n -1 n - 2 0其中[0 当 b = ai [1当b丰aii因此,若e二0,表示该位接收码元无错;若e二1,则表示该位接收码元有错式(3.15)ii 也可以改写成:B 二 A + E (式 3.17)接收端译码时,可将接收码组B代入式(3.6)中计算若接收码组中无错码,即E二0, 则B = A + E = A,把它代入式(3.6)后,该式仍成立,则有B• Ht = 0 (式 3.18)当接收码组有错时,E鼻0,将B代入式(3.15)后,该式不一定成立在错码较多,已 超过这种编码的检错能力时, B 变为另一许用码组则式(3.18)仍能成立。
这样的错码错码 是不可检测的在未超过检错能力时,上式不成立,即其右端不等于零假设这时式(3.18) 的右端为S,即B• Ht = S (式 3.19)将B二A + E代入式(3.19)中可得S = (A + E) • Ht 二 A • Ht + E • Ht由式(3.6)知,A• Ht = 0,所以S = E • HT (式 3.20)式中,S称为伴随式或校正子它与式(3.1)中的S相似,有可能利用它来指示错码位 置,这一点可以直接从式(3.20)中看出,式中S只与E有关,而与A无关,这就意味着S与 错码E之间有确定的线性变换关系若S和E之间一一对应,则S将能代表错码的位置四、推导过程4.1 编码过程由H与G的分块表示的矩阵形式则有G • Ht = 0I ]n - k:Q ]kP=QTQ 二 PtH • Gt = 0式 4.1 ) 式 4.2 ) 式 4.3 ) 式 4.4 )式 4.5 )已知生成矩阵1000010000100001111011011011根据以上几式可求出监督矩阵H=最后可以根据输入的四位信息位和生成矩阵相乘得到编码矩阵即式 4.6 )C = mG所有的编码情况如表1所示。
4.2 译码过程对于译码过程来说,同样由上知道监督矩阵:111H=110101根据监督矩阵,将矩阵的行和列调换,可求出监督矩阵的转置矩阵HT111110101HT =011100010001再根据式(3.20 )即B • HT = S求出伴随式,由伴随式式可以知道错码的位置及及纠正错码, 具体的错码位置如表 1 所示纠正了接收码后可以提取出其中的四位信息位五、程序设计及仿真分析5.1 程序流程图5.1.1 主程序流程图主程序一开始就有欢迎界面,并对该编译器做了简单的介绍,同时为方便用户使用,对 用户的操作也进行了补充说明,接着给用户显示出了选择提示语句,可以选择编码器、译码 器、退出当用户做出选择后便会进入各自的子程序,执行相应的功能,如果用户输入错误 还会给出错误提示主程序的流程图如图 3 所示图 3 主程序流程图5.1.2 编码程序流程图在程序进入编码子程序时,它首先提示用户输入需要编码的码组个数,根据用户选择的 个数接着要求用户输入编码的信息码组,信息码组与生成矩阵相乘便会得到相应的编码,其 流程图如图 4 所示图 4 编码程序流程图5.1.3 译码程序流程图对于译码程序,因为信息在传输过程中会遇到噪声干扰,所以接收码组会出现错码、丢 码或多码现象。
又因为很难判断丢码或多码的具体位置,所以这两种情况处理起来比较复杂 在这暂不进行译码,只做出判断对于错码,可以纠正一位错误,发现两位错误在译码的过程中,要用到监督矩阵的转置矩阵,所以先求生成矩阵对应的监督矩阵,再 进行转置,然后提示输入接收码组,输入的接收码组中有可能丢失码位,故而先判断,再进 行纠检错,输出正确的码组,最后提取出正确的信息组其流程图如图 5所示5.2程序运行分析521主程序运行分析接上页求接收码组与转置矩阵的乘积输出伴随式根据伴随式译码输出纠正后的码组, 并提取信息码输出图5译码程序流程图图6主界面运行图从程序一开始就运行主界面,主界面有对该软件的简单介绍,接着就给出了选择功能 用户输入不同的序号可以执行不同的功能,主界面仿真结果如图6所示输入T”后按回车键 执行编码功能,如图7所示;输入“2”后按回车键执行译码功能,如图8所示;输入“3”后按 回车键执行退出如图9所示;输入其它系统会显示错误提示信息,如图10所示图7选择编码功能图8选择译码功能'F :诅濒转換嘉 \ haha h\Debug\ke5 he.exe"您好!欢迎使用线性分组码编译器!岸编译器针对〔叭4)码,所来用的生成矩阵G =10 0 0 1110 10 0 1100 0 10 19 10 0 0 10 11豔鱷號瓣噓他情…入細* 10teis觇在请輸入您所选择的编译器所对应的序号,按回车键继续:}编码器羅译码器齐退出嵌选择:3懒谢您的使用,欢迎再说使用!Press any key 七口 con七inue522编码运行分析执行编码程序时,为了满足用户的不同需求,可以先输入用户需要的编码的信息组数, 再根据用户输入的信息组数决定输入信息码的多少,输入完按回车键就完成了一次编码。
例 如用户一次需要对连续的四个四位信息组进行编码,信息组为(1011010100011001),根据表 2可知,编码后的结果为(1011001010100100010111001100),仿真过程如图11和图12所示r — - I ―~I ~~'F :\坝颇转接器、haha h\De bug\kes h e.ex e"— 亠 — Mi现在请输入您所选择的编译器所对应的序号,按回车键继续:「编码器沢译码器史退出*选择:1请输入您需要编码的信息组数4请输入您需要编码的4组四位二进制信息组「码组间用空格分开,按回车键确认 信息组时图11输入信息组数后系统界面图12编码后的系统界面由运行的界面可知,软件还可以持续操作,当用户再做出选择,可以执行相应的功能, 整个体系就是按照这个思想联系在一起的523译码运行分析对于信道编码程序而言,由于信道干扰,接收码组的长度不一,当接收码组中出现丢码 时,系统会给出提示,对这种情况系统无法译码只给出提示要求重新输入,例如输入 (01100011101112), 2作为输入的结束标志,因为信息码组只有十三位,传输过程丢了一位, 系统会给出提示,如图13所示;如果接收码组没有丢码,系统可以纠正一位错码,发现两位 错码,例如输入上面编码后的4个接收码组,并故意输错第二个码组的a 1位和第四个码组的a0 位和a/立,即输入(10110010101111000101110011112(2为结束标志),以验证系统运行的 正确性。
运行界面如图14所示为了体现软件的持续操作,我们从编码结束后再选择译码图13输入有丢码的接收码组时系统运行界面图14译码运行界面5.3软件分析根据软件运行情况分析来看,该软件最终实现的功能有:✓对数量不等的信息组编码;✓对数量不等的接收码组纠正一位错误,发现两位错误;✓对输入的接收码组判断是否有丢码;✓循环使用编码器和译码器;✓对操作失误做出提示与最初的设计目标相比,该软件的不足方面有:>使用编码器的时候,如果输入有误,系统没有给出明确提示;>当接收码组中有丢失位时,不能译码;>显示界面不够人性化总之,软件在可靠性方面已做出验证,达到了要求C语言比起其它语言要难学,更稳 定, C 程序的稳定性就证明了该软件具有很好的稳定性实用性方面,由于该软件只对四位 信息组编码,编码后有七位;对七位接收码组译码,提取信息位后是四位其它码并不适应 该软件,所以它的适用范围受到了限制设计总结三周的课程设计已经结束,这些天对于一天都在学习理论知识的我来说十分珍贵因为 这是一个理论联系实际,实践检验理论的相互过程在这一过程中,真切感觉到自己知识能力的匮乏,虽然我考过了C语言二级,但是好多 东西都只是知道一些皮毛,真正学透的东西很少,更不用说把学到的知识运用到实际生活中 了。
而且很多东西在实际中与理想相去甚远,而应用就是要减小这种差距每一点差距的缩 小都得付出艰辛的努力,但这种付出是非常值得的这次课设刚开始时,由于好长时间没有接触C语言,编写程序遇到的问题非常多,比如 写输入语句和输出语句的格式,还有每个语句后面的分号必须是英文的,在这个上最容易犯 错,幸好最后经过我的仔细检查最终完成了整个程序在程序的功能上,刚开始我想的比较 简单,只对简单的一个码组编译码,后来经过老师的提醒,我又做了很多改动,最终完成整 个程序但是在使用编码器的时候,对输入时的操作失误没有给出提示,由于时间的关系, 也没有修改,其他方面自己还比较满意,也许是因为自己收到了自己付出的东西,所以我还 是非常高兴的通过这次课程设计,我明白了:许多细小的环节是注意不到的,而这诸多环节往往影响 你整个系统的正常运转;这可真应验了“细节决定一切”这句话这一切告诉我做任何事情必 须从全局出发,并且要注意其中的任何一个细节致谢课设期间,得到了老师和各位同学的帮助,尤其是王维芳老师的诸多指导和帮助,在此 表示真挚的感谢!同时组里的同学也提出了很多宝贵意见,感谢各位!参考文献1. 海涛,龙军.计算机通信技术[M].重庆:重庆大学出版社,20052. 岳殿武.分组编码学[M].西安:西安电子科技大学出版社,20073. 谭浩强.C程序设计(第三版)[M].北京:清华大学出版社,20054. 冯桂,林其伟,陈东华.信息论与编码技术[M].北京:清华大学出版社,20075. 张宗橙.纠错编码原理和应用[M].北京:电子工业出版社,2005附录(7,4)码编译器整体程序:#include#includevoid main(){/*G:生成矩阵 H:监督矩阵 HT:监督矩阵对应的转置矩阵*//*M:输入信息序列C:编码输出序列Input:输入接收码序列B:译码输出序列S: 伴随式*/int Q,N;/*定义开始*/int i,j,s,r,k,t,p,u,m;int G[4][7]={{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}};int IR[3][3]={{1,0,0,},{0,1,0},{0,0,1}};int H[3][7], C[10][7],M[10][4],B[20][7],Input[100],HT[7][3],P[10],S[100][3];/* 定义结束*/ printf("\n您好!欢迎使用线性分组码编译器! \n");printf("\n\n本编译器针对(7, 4)码,所采用的生成矩阵G=\n");for(i=0;i<4;i++){for(j=0;j<7;j++)printf(" %d",G[i][j]);printf("\n");}printf("编译码过程都是针对二进制码组,除了系统要求选择功能,其他情况下禁止输入 除0,1以外的数。
请在使用的过程中严格按照编译器要求的格式输入数据\n\n");printf("现在请输入您所选择的编译器所对应的序号,按回车键继续:\n");printf("\n1 .编码器2.译码器3.退出\n");printf("\n 我选择:“);scanf("%d",&Q);if(Q==0)Q+=4;while(Q){if(Q==1||Q==2||Q==3)break;else{printf(“对不起,您输入有误,请重新输入");scanf("%d",&Q);}}while(Q==1||Q==2||Q==3){if(Q==l)/*编码程序*/{printf("\n请输入您需要编码的信息组数");scanf("%d",&N);printf("\n\n请输入您需要编码的%d组四位二进制信息组,码组间用空格分开, 按回车键确认\n",N);/*输入信息码*/printf("\n 信息组 m=");for(i=0;i2;i--)/*输出编码结果*/C[j][i]=M[j][i-3];printf("\n您所输入的信息组编码结果c=");for(j=0;j=0;i--) printf("%d",C[j][i]);printf("\n\n");printf("\n接下来您想:\n\n");/*选择功能*/ printf("l.用编码器2.用译码器3.退出\n\n");printf("我想:");scanf("%d",&Q);}else if(Q==2)/* 译码程序*/{for(i=0;iv3;i++)/* 求监督矩阵 */{for(j=0;j<4;j++)H[i][j]=G[j][i+4];for(j=4;j<7;j++)H[i][j]=IR[i][j-4];}printf("\n监督矩阵H=\n");/*输出监督矩阵*/for(i=0;i<3;i++){for(j=0;j<7;j++) printf(" %d",H[i][j]);printf("\n");}t=l;while(t!=2)/*输入接收码组*/{p=l;printf("\n 请输入总位数为 7 的倍数的接收码组,每位用空格隔开,每组位 数为7的倍数,以十进制2作为结束标志!按回车键确认\n");while(p){for(i=0;;i++){scanf("%d",&Input[i]);if(Input[i]==2)break;}k=i%7;if(k==0){p=0;t=2;}else{p=1;k=-k+7;printf(“您接收到的码组丢失了%小位,系统不能判断丢失位的具体 位置,请重新输入\n",k);}}}u=i/7;i=0;for(r=0;r=0;j--,i++)B[r][j]=Input[i];}printf("\n将接收码组每七位分为一个码组,如下:\n");for(i=0;i=0;i--)printf(" %1d",S[j][i]); printf("\n");} printf("\n");for(i=0;i=0;j--)printf("%1d",B[i][j]);printf("请您再次确认!");printf("译出的信息序列为:");for(j=6;j>2;j--)printf("%d",B[i][j]);break;}case 2:{B[i][O]=MB[i][O];printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--;for(j=6;j>=0;j--) printf("%1d",B[i][j]);printf("译出的信息序列为:");for(j=6;j>2;j--) printf("%d",B[i][j]);break;}case 3:{B[i][l]=MB[i][l];printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--;for(j=6;j>=0;j--) printf("%ld",B[i][j]);printf("译出的信息序列为:");for(j=6;j>2;j--) printf("%d",B[i][j]);break;}case 4:{B[i]⑶=MB[i][3];printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--;for(j=6;j>=0;j--)printf("%ld",B[i][j]);printf("译出的信息序列为:");for(j=6;j>2;j--) printf("%d",B[i][j]);break;}case 5:{B[i][2]=MB[i][2];printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--;for(j=6;j>=0;j--)printf("%1d",B[i][j]);printf("译出的信息序列为:");for(j=6;j>2;j--) printf("%d",B[i][j]);break;}case 6:{B[i][4]=MB[i][4];printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--;for(j=6;j>=0;j--)printf("%1d",B[i][j]);printf("译出的信息序列为:");for(j=6;j>2;j--) printf("%d",B[i][j]);break;}case 7:{B[i]⑸=MB[i][5];printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--;for(j=6;j>=0;j--)printf("%1d",B[i][j]);printf("译出的信息序列为:");for(j=6;j>2;j--)printf("%d",B[i][j]);break;}case 8:{B[i]⑹=MB[i][6];printf("\n\n您接收的第%d个码组有错误,正确的码组应为:",++i); i--;for(j=6;j>=0;j--) printf("%1d",B[i][j]);printf("译出的信息序列为:");for(j=6;j>2;j--) printf("%d",B[i][j]);break;}}}printf("\n\n总的译码结果为:“); for(i=0;i2;j--) printf("%1d",B[i][j]);printf("\n\n接下来您想:\n\n");/*继续选择功能*/ printf("1.用编码器2.用译码器3.退出\n\n");printf("我想:");scanf("%d",&Q);if(Q==0)Q=Q+4;while(Q){if(Q==1||Q==2||Q==3)break;else{printf(“对不起,您输入有误,请重新输入"); scanf("%d",&Q);}}}else if(Q==3)/* 退出程序*/{printf("\n谢谢您的使用,欢迎再次使用! \n"); Q=0;}}}图9执行退出功能"F 规频转摸器、haha h\Debug\ke5 he.ese"厚好!欢迎使用线性分组码编译器!计编译器针对 ⑺4)码,所采用的生成矩阵I10 0 0 1110 10 0 1100 0 10 10 10 0 0 19 11課翩觀謬鸚麟瞬酸册况下禁止输入細1 ° ”在请输入您所选择的编译器所对应的序号•按回车键继续;、编码器趴译码器3.退岀 k选择:4 、、亠对不起,您输入有误,请重新输入H 石谢您的使用,欢迎再次使用!Press an y key to cont inue。