CMI编码与解码系统设计Word下载.docx
《CMI编码与解码系统设计Word下载.docx》由会员分享,可在线阅读,更多相关《CMI编码与解码系统设计Word下载.docx(21页珍藏版)》请在冰点文库上搜索。
将自定义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代码:
11010010
CMI码:
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”码时统一将其解码输出为原先值。
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”;
end
if(x(k)==1&
m==1)%如果NRZ码为“1”且编码判决码为1,则进行下一步;
b(k)=1;
%cmi编码输出的前一位为“1”;
n=n+1;
%判决辅助码加“1”;
m==0)%如果NRZ码为“1”且编码判决码为“0”,则进行下一步;
c(k)=0;
%cmi编码输出的后一位为“0”;
end
20%for语句cmi编码后序列的第一个到第二十个的循环;
if(b(k)==1&
c(k)==1)%如果cmi编码后的前一位和后一位都为“1”,则进行下一步;
fprintf('
11'
)%cmi编码输出为"
11"
;
elseif(b(k)==0&
c(k)==0)%如果cmi编码后的前一位和后一位都为“0”,则进行下一步;
00'
00"
end
else%上述情况以外;
01'
01"
CMI编码输出结果为:
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);
2:
21%输入的“1”、“0”一到二十循环;
if((k+1)<
21)%为保证后面的k+1不超出码长;
if(y(k)==1&
y(k+1)==1)%如果输入CMI为"
时,运行下一步;
1'
);
%解码输出"
1"
if(y(k)==1&
y(k+1)==0)%如果CMI码的"
10"
则为错误码,则输出原码;
10'
if(y(k)==0&
y(k+1)==0)%如果CMI码为"
则运行下一步;
if(y(k)==0&
y(k+1)==1)%如果CMI码为"
0'
0"
end%结束循环语句;
得到解码结果为:
1101001101
其波形如图3-3所示:
图3-3自定义CMI解码波形
观察解码结果和波形发现解码符合CMI解码规则,解码正确,CMI解码仿真成功。
3.3对二进制序列NRZ码进行编码再解码还原
x=randint(10,1);
生成的10位NRZ码为:
0010111100
(2)将产生的NRZ码输入编解码程序进行CMI编码,再解码还原成二进制序列NRZ码。
%CMI码编解码一体的还原程序,输入随机产生的10位二进制序列NRZ码,运行程序进行编码后输出编码结果,再解码输出解码的结果(详细程序见附录III的cmi.m);
10%for语句cmi编码后序列的第一个到第十个的循环;
if(b(k)==1&
c(k)==1)%如果cmi编码后的前后位都为“1”,则进行下一步;
fprintf('
c(k)==0)%如果cmi编码后的前后位都为“0”,则进行下一步;
else%上述情况以外;
)%cmi编码输出为"
end%结束本if语句;
end%结束上层if语句;
end%结束for循环语句;
\n'
%换行;
Displaydecoderesult:
%显示"
输出解码结果为:
"
10%for循环语句;
if(b(k)==1&
c(k)==1)%if循环语句,如果cmi码的前序列为"
%输出显示"
1"
end%if循环结束;
if(b(k)==1&
c(k)==0)%如果cmi码的前序列为"
后序列为"
);
%错误CMI码,解码输出显示原码"
if(b(k)==0&
c(k)==0)%if循环语句,如果cmi码的前后位都为"
%输出显示"
end%if循环结束;
c(k)==1)%if循环语句,如果cmi码的前位为"
且后位为"
;
0"
end%if循环结束;
end%for循环结束;
程序运行输出结果为:
TheinputNRZcodeis:
x=
0010111100
Displayencoderesult:
01011101001100110101
0010111100
(3)随机生成的二进制序列NRZ码波形、CMI编码和解码后波形如图3-4所示:
图3-4随机NRZ码波形、编码后的波形、解码后的波形
通过前述程序输出码型和波形,不难看出程序的编解码还原过程符合CMI编解码规则,将二进制序列NRZ码进行CMI编码后,信号的电平跃变更多了,故定时信息量增加了,且解码输出的二进制序列码与原输入的NRZ码完全一致,编解码一体还原仿真成功。
4设计中出现的问题及解决方法
在此次课程设计中我遇到了很多难题,经过老师的细心指导和我自己的努力钻研和查阅书籍资料,问题都一一解决。
出现的主要问题如下:
(1)在设计之初,设计编码程序时,遇到“1”码的编码结果“11”和“00”交替,但是不知道何时编码输出为“11”,何时编码输出为“00”,经过仔细思考和认真研究原理,最后想到加一个判决码,辅助判决何时编码输出“11”,何时编码输出“00”。
(2)在设计单独的解码程序时,考虑到输入的CMI可能会出现错误,会有像“10”这样的错误码出现,它不符合CMI的编码规则,因此不能解码,在处理这个纠错问题上,最终还是以不解错误码,错误码按原码“10”输出。
(3)在画二进制序列的波形图时,由于我用的是plot函数画图,出现了不能画出形象代表二进制序列的方波,在查阅书籍之后也没找到结果,最后经过老师的指点最终采用的stairs函数;
(4)在用画图程序画出图形时,发现画出的图像线条特别细小,很难分辨出来,于是通过查阅书籍了解到加一个linewidth参数将线条设置成2倍粗度就可以了。
5结束语
在基带传输系统中传输码的结构将取决于实际信道的特性和系统工作条件。
较为复杂一些的基带传输系统中,传输码的结构应具有下列主要特性:
(1)能从相应的基带信号中获取定时信息;
(2)相应的基带信号无直流成分和只有很小的低频成分;
(3)高频分量尽量少,以节省传输频带并减少码间串扰;
(4)尽可能的提高传输码的传输效率;
(5)不受信息源统计特性的影响,即能适应于信息源的变化;
(6)具有内在纠错能力;
(7)编解码设备要尽可能简单,等等。
理论分析和实验证明:
在基带传输系统中CMI码符合上述特性,且CMI码与较多的电平跳跃,具有丰富的定时信息量;
此外,由于“10”为禁用码组,不会出现3个以上的连码,这个规律可用来检错。
CMI码易于实现,是CCITT推荐的PCM高次群采用的接口码型,在速率低于8.448Mb/s的光纤传输系统中有时也用作线路传输码型。
在这次课程设计中,我付出了很大的努力,也遇到了很多困难,但是在指导老师的细心指导下,困难一个个迎刃而解,通过努力课程设计基本完成。
通过这次课程设计,使我对通信原理基础知识有了很大的提高和巩固,设计过程中锻炼了我的独立思考和整体统筹、规划能力,开阔了我的知识视野,为以后自己走上工作岗位做独挡一面的强将打下了一定的基础。
整体而言,此次课程设计通过自身的努力和老师的指导已基本完成任务,也达到了考核和锻炼自我的效果。
参考文献
[1]樊昌信、张甫翊、徐炳祥、吴成柯,《通信原理》(第5版)[M],国防工业出版社,2007。
[2]孙祥、徐流美、吴清,《MATLAB7.0基础教程》[M],清华大学出版社,2005。
[3]楼顺天、陈生潭、雷虎民,《MATLAB5.x程序设计语言》[M],西安电子科技大学出版社,2002。
[4]邓华,《MATLAB通信仿真机应用实例详解》[M],人民邮电出版社,2003。
附录Ⅰ:
CMI编码程序清单
%程序名称:
cmiencode.m
%程序功能:
对输入的二进制NRZ码序列进行CMI编码
%程序作者:
邹智勇
%最后修改日期:
2008年1月16日
%=================================================================
clear;
fprintf('
x=input('
Pleaseinput20NRZcodea:
'
%提示输入原始的十个二进制NRZ序列x;
%显示“输入的NRZ序列是:
”,换行;
x%输出:
输入的二进制NRZ序列x;
m=1;
%1码的cmi编码的判决码;
n=1;
%1码的cmi编码判决码的辅助码;
q=[0,;
];
%cmi编码后的前一位序列数组;
h=[0,;
%cmi编码后的后一位序列数组;
20%for语句NRZ码序列的第一个到第十个循环;
%cmi编码结果00和11交替的判决语句;
if(x(k)==0)%如果NRZ码为0,则进行下一步;
q(k)=0;
%cmi编码输出的前一位为0;
h(k)=1;
%cmi编码输出的后一位为1;
end%本if语句循环结束;
m==1)%如果NRZ码为1且编码判决码为1,则进行下一步;
q(k)=1;
%cmi编码输出的前一位为1;
%判决辅助码加1;
m==0)%如果NRZ码为1且编码判决码为0,则进行下一步;
h(k)=0;
%cmi编码输出的后一位为0;
end%本for语句循环结束;
%显示"
输出编码结果为:
20%for语句cmi编码后序列的第一个到第十个的循环;
if(q(k)==1&
h(k)==1)%如果cmi编码后的前一位和后一位都为1,则进行下一步;
elseif(q(k)==0&
h(k)==0)%如果cmi编码后的前一位和后一位都为0,则进行下一步;
end%结束本if语句;
end%结束上层if语句;
end%结束for循环语句;
%随机生成的NRZ序列画图程序;
x=[10100011110011011010];
stairs(x,'
-k.'
'
linewidth'
2);
%绘图语句,用2倍粗度的实线条绘图;
axis([121-0.51.1]);
%设置坐标轴极限值;
title('
NRZ序列'
%图形命名;
gridon;
%添加网格;
%CMI编码输出序列的画图程序;
y=[0001110101010011001101010011010011010001];
stairs(y,'
axis([141-0.51.1]);
CMI编码输出'
附录Ⅱ:
CMI解码程序清单
cmidecode.m
对输入的CMI码序列进行CMI解码
y=[input('
Pleaseinput10CMIcode:
)];
%提示输入10位CMI码;
TheinputCMIcodeis:
\n'
输入的CMI码是:
换行;
%d'
y);
%打印输入的CMI码;
TheCMIdecoderesultis:
CMI编码结果是:
21
11)%为保证后面的k+1不超出码长;
y(k+1)==1)
%解码输出“1”;
y(k+1)==0)%如果CMI码的“10”,则为错误码,则继续解码下一个;
fprintf(‘10’);
%错误码解码输出源码“10”;
y(k+1)==0)
y(k+1)==1)
else
break;
%自定义CMI码序列的画图程序;
y=[11000111010111000100];
自定义CMI码'
%解码输出序列的画图程序;
z=[1101001101];
stairs(z,'
axis([111-0.51.1]);
解码输出'
附录Ⅲ:
CMI编码与解码程序清单
cmi.m
对二进制NRZ码序列进行CMI编码再进行解码还原成原序列。
f