基于MATLAB的CMI编码与解码摘要本课程设计是基于MATLAB进行CMI编码与解码。认真学习CMI编码与解码的基本规则和原理,设计CMI编码和解码的仿真程序,并总结CMI编码与解码的主要特征和性质。在掌握CMI编码与解码的基本原理的基础上,再具体实现二进制序列的CMI编码与解码,完成了设计目的。关键词MATLAB;CMI;二进制序列NRZ码;编码;解码1引言基带信号作为代码的一种电表示形式,在实际的基带传输系统中,并不是所有的基带电波形都能在信道中传输,若一个变换器把数字基带信号变换成适合于基带信道传输的基带信号,将有效的提高基带信号的传输效率。归纳起来,对传输用的基带信号主要要求有两点:一是对各种代码的要求,期望将原始信息符号编制成适合于传输用的码型;二是对所选码型的电波要求,期望电波形适宜于在信道中传输[1]。本课程设计主要是对二进制序列(例如:110010111)的基带信号进行CMI编码与解码,编码成更适合与基带信道传输的基带信号。在掌握了CMI编解码的基本规则基本原理后,在MATLAB环境下用程序语言实现CMI编码和CMI解码以及CMI编解码一体的信号还原功能[2]。具体实现了CMI编码与解码仿真过程。1.1课程设计目的(1)熟悉基带传输的常用码型,以及常用基带传输码的主要特性;(2)了解基带传输常用编码中的CMI编码与解码的基本规则和原理;(3)学会熟练使用MATLAB基本语言来设计简单、常用的程序,来解决一些简单的专业问题,模拟实现简单通信原理的功能[3]。(4)通过对二进制序列NRZ码的CMI编码前和解码后的信号进行码型和波形的比较,掌握CMI编码的原理和特性[4]。(5)通过独立完成设计任务,独立思考和独立解决问题,提高自己的动手能力和独立思考能力,从而做到增强自身在这瞬息万变社会中的适应能力。1.2课程设计要求(1)设计CMI编解码程序前,应认真了解其编解码规则和原理,以理论做指导,再认真构思设计方案。(2)程序设计完成后应进行调试、仿真和分析[3]。(3)对于仿真结果的处理和理论分析结论应该一致,而且仿真应符合理论。(4)独立完成课程设计并按要求编写课程设计报告书。1.3课程设计内容及其步骤(1)随机产生数字基带信号:一段二进制序列NRZ码,画出其波形图;将产生的数字基带信号进行CMI编码,画出编码后的波形图;将NRZ码编码前后的波形进行比较和分析;(2)自定义一段CMI码,画出自定义CMI码的波形图;将自定义CMI码进行解码,并画出解码后二进制NRZ码的波形;将自定义CMI码的波形与其解码后的NRZ码波形进行比较和分析;(3)随机产生数字基带信号:一段二进制序列NRZ码;将产生的NRZ码进CMI编码;将编码生成的CMI码进行解码,画出原NRZ码波形和CMI编码波形以及解码后的波形,将其码型和波形分别与原输入NRZ码型和波形进行比较和分析,观察编解码还原是否正确。1.4课程设计平台(1)微机一台;(2)微软Windowsxp操作系统;(3)MATLAB7.0;(4)微软OfficeWord2003;2CMI编码与解码设计原理2.1CMI编码原理基带传输常用码型CMI编码的方案设计:根据CCITT推荐,由于这种码型有较多的电平跳跃,因此,含有丰富的定时信息。在程控数字交换机中CMI码一般作为PCM四次群数字中继接口的码型,在光缆传输系统中也用做线路传输码型[1]。CMI码的全称是传号反转码,CMI码的编码规则如下:当输入“0”码时,编码输出“01”,当输入“1”码时,编码输出则“00“和”11“交替出现[1]。例如:NRZ代码:11010010CMI码:1100011101010001其相应的波形比较如图2-1所示:图2-1编码前与编码后波形图根据此规则输出CMI码元的速率应为输入基带信号的2倍。编码的总体思想是对输入的基带信号进行采样判断,如果‘0’则转化为“01”,如果为“1”则交替转化为“11”或“00”。“0”的转化结果只有一种可以直接转化为“01”,而“1”的转化结果有两种“11”和“00”,因此需要一个信号作为判断,当前面一个“1”码编码转换的是“00”时,判断编码转化为“11”,当前一个“1”码编码转换的是“11”时,则判断编码转化为“00”。2.2CMI解码原理CMI码解码的方案设计:根据CCITT推荐,由于这种码型有较多的电平跳跃,因此,含有丰富的定时信息,在程控数字交换机中CMI码一般作为PCM四次群数字中继接口的码型[1]。CMI码的编码规则如下:当输入“0”码时,编码输出“01”,当输入“1”码时,编码输出则“00”和“11”交替出现[1]。根据此规则,在CMI的解码模块中:如果接收到“01”码,则可解码成“0”码;如果接收到“00”码或“11”码,则可解码还原为基带信号“1”,如果接收到“10”(因为CMI编码输出是先输的高位)但是由于CMI是串行传输,码流中可能出现会出现“10”这样的错误CMI码,为了解决这个问题,我们在解“10”码时统一将其解码输出为原先值。例如:CMI码:110001011101100100输出解码:1100101001其相应的波形比较如图2-2所示:图2-2CMI码与其解码波形图3设计内容3.1对二进制序列NRZ码进行CMI编码(1)随机产生长度为20位数字基带信号:二进制序列NRZ码;x=randint(20,1);生成的20位NRZ码为:10100011110011011010(2)将生成的二进制序列NRZ码输入CMI编码程序进行CMI编码;将编码前后码型进行比较;画出编码前后的波形进行分析;%CMI编码程序,输入随机产生的20位NRZ码x,程序对其进行CMI编码,运行直接输出编码结果(详细程序见附录I的cmiencode.m);fork=1:20%for语句NRZ码序列的第一个到第二十个循环;m=mod(n,2);%cmi编码结果“00”和“11”交替的判决语句;if(x(k)==0)%如果NRZ码为“0”,则进行下一步;b(k)=0;%cmi编码输出的前一位为“0”;c(k)=1;%cmi编码输出的后一位为“1”;endif(x(k)==1&m==1)%如果NRZ码为“1”且编码判决码为1,则进行下一步;b(k)=1;%cmi编码输出的前一位为“1”;c(k)=1;%cmi编码输出的后一位为“1”;n=n+1;%判决辅助码加“1”;endif(x(k)==1&m==0)%如果NRZ码为“1”且编码判决码为“0”,则进行下一步;b(k)=0;%cmi编码输出的前一位为“0”;c(k)=0;%cmi编码输出的后一位为“0”;n=n+1;%判决辅助码加“1”;endendfork=1:20%for语句cmi编码后序列的第一个到第二十个的循环;if(b(k)==1&c(k)==1)%如果cmi编码后的前一位和后一位都为“1”,则进行下一步;fprintf('11')%cmi编码输出为11;endelseif(b(k)==0&c(k)==0)%如果cmi编码后的前一位和后一位都为“0”,则进行下一步;fprintf('00')%cmi编码输出为00;endelse%上述情况以外;fprintf('01')%cmi编码输出为01;endendCMI编码输出结果为:0001110101010011001101010011010011010001将上述CMI编码结果和原NRZ码比较发现,编码输出符合:当输入“0”码时,编码输出“01”,当输入“1”码时,编码输出则“00“和”11“交替出现的编码规则,编码程序仿真正确。CMI编码前后波形比较如图3-1所示:图3-1CMI编码前后波形由图中波形可以看出,将二进制序列NRZ码进行CMI编码后,信号的电平跃变更多了,故定时信息量增加了,从而更加适合于基带传输,提高了传输效率。3.2对自定义CMI码进行解码(1)自定义一段CMI码,画出其波形图;将自定义CMI码进行解码,画出解码后的波形;输入的CMI码y为:11000111010111000100其波形图如图3-2所示:图3-2自定义CMI码波形(2)将CMI码输入解码程序:%CMI码解码程序,输入10个CMI码,运行程序将其进行解码直接输出解码结果(详细程序见附录II的cmidecode.m);fork=1:2:21%输入的“1”、“0”一到二十循环;if((k+1)21)%为保证后面的k+1不超出码长;if(y(k)==1&y(k+1)==1)%如果输入CMI为11时,运行下一步;fprintf('1');%解码输出1;endif(y(k)==1&y(k+1)==0)%如果CMI码的10,则为错误码,则输出原码;fprintf('10');endif(y(k)==0&y(k+1)==0)%如果CMI码为00,则运行下一步;fprintf('1');%解码输出1;endif(y(k)==0&y(k+1)==1)%如果CMI码为01,则运行下一步;fprintf('0');%解码输出0;end%结束循环语句;endend得到解码结果为:1101001101其波形如图3-3所示:图3-3自定义CMI解码波形观察解码结果和波形发现解码符合CMI解码规则,解码正确,CMI解码仿真成功。3.3对二进制序列NRZ码进行编码再解码还原(1)随机产生数字基带信号:二进制序列NRZ码;x=randint(10,1);生成的10位NRZ码为:0010111100(2)将产生的NRZ码输入编解码程序进行CMI编码,再解码还原成二进制序列NRZ码。%CMI码编解码一体的还原程序,输入随机产生的10位二进制序列NRZ码,运行程序进行编码后输出编码结果,再解码输出解码的结果(详细程序见附录III的cmi.m);fork=1:10%for语句cmi编码后序列的第一个到第十个的循环;if(b(k)==1&c(k)==1)%如果cmi编码后的前后位都为“1”,则进行下一步;fprintf('11')%cmi编码输出为11;elseif(b(k)==0&c(k)==0)%如果cmi编码后的前后位都为“0”,则进行下一步;fprintf('00')%cmi编码输出为00;else%上述情况以外;fprintf('01')%cmi编码输出为01;end%结束本if语句;end%结束上层if语句;end%结束for循环语句;fprintf('\n');%换行;fprintf('Displaydecoderesult:\n');%显示输出解码结果为:;fork=1:10%for循环语句;if(b(k)==1&c(k)==1)%if循环语句,如果cmi码的前序列为1,则运行下一步;fprintf('1');%输出显示1;end%if循环结束;if(b(k)==1&c(k)==0)%如果cmi码的前序列为1后序列为0,则运行下一步;fprintf('10');%错误CMI码,解码输出显示原码10;endif(b(k)==0&c(k)==0)%if循环语句,如果cmi码的前后位都为0,则运行下一步;fprintf('1');%输出显示1;end%if循环结束;if(b(k)==0&c(k)==1)%if循环语句,如果cmi码的前位为0且后位为1;fprintf('0');%输出显示0;end%if循环结束;end%for循环结束;程序运行输出结果为:TheinputNRZcodeis:x=0010111100Displayencoderesult:01011101001100110101Displaydecoderesult:0010111100(3)随机生成的二进制序列NRZ码波形、CMI编码和解码后波形如图3-4所示:图3-4随机NRZ码波形、编码后的波形、解码后的波形通过前述程序输出码型和波形,不难看出程序的编解码还原过程符合CMI编解码规则,将二进制序列NRZ码进行CMI编码后,信号的电平跃变更多了,故定时信息量增加了,且解码输出的二进制序列码与原输入的NRZ码完全一致,编解码一体还原仿真