南华大学电气工程学院通信原理课程设计设计题目:数字基带信号HDB3码的译码器设计班级:电子1002班学生姓名:王超学号:20104470245指导教师:李圣摘要在数字基带信号传输中,HDB3码(三阶高密度双极性码)是常用的传输码型之一。HDB3码是AMI码的一种改进型,它既保留了AMI码无直流成分的优点,又解决了原信码出现长连“0”串的问题,使连“0”个数不超过3个。本设计针对数字基带传输系统中HDB3码的特点,使用MATLAB编程实现HDB3码的译码功能和其码型图。关键词:数字基带传输;HDB3码(三阶高密度双极性码);MATLAB。目录1、绪论············································································12、设计原理及方案·····························································12.1数字基带通信系统·····················································12.2HDB3编译码····························································12.3设计方案·································································22.3.1编码程序···························································22.3.2译码程序···························································32.3.3绘图程序···························································33、程序调试及结果分析·······················································44、总结与体会···································································95、参考文献····································································101、绪论在生活中,我们得到的大多是低频信号或直流信号,但是,含有直流分量和较丰富低频分量的单极性基带信号波形不适合在普通的信道中传输,因为一般的信道的低频传输特性差容易受噪声的干扰,可能造成信号严重畸变,甚至可能被噪声完全淹没而分不出信号,因此有必要对传输的信号进行编码,而经过信道编码后的传输码具有较强的波形抗干扰性。我们常用的编码规则为HDB3编码。HDB3码的编码规则虽然比较复杂,但解码却比较简单。从编码规则看出,每一个破坏脉冲V总是与前一非“0”脉冲同极性(包括B在内)。这就是说,从收到的符号序列中可以容易地找到破坏点V,于是也断定V符号及前面的三个符号必是连“0”符号,从而恢复四个连“0”码,再将所有—1和+1变成1后便得到原消息代码。在本课程设计中,我根据编码及译码规则,采用MATLAB编程实现了原码转换成HDB3码,再从HDB3码转换成译码的过程。2、设计原理及方案2.1数字基带通信系统数字基带传输系统的输入信号是由终端设备或编码设备产生的二进制脉冲序列,通常使用的是单极性的矩形脉冲信号(NRZ码)。为了使这种信号适合于信道的传输,一般要经过码型变换器,把单极性的二进制脉冲变成双极性脉冲(如AMI或HDB3码)。发送滤波器对码脉冲进行波形转换,以减小信号在基带传输系统中传输时产生的码间串扰。码间串扰和信道噪声是影响基带信号进行可靠传输的主要因素,而它们都与基带传输系统的传输特性有密切的关系,为了使基带系统的总传输特性能够把码间串扰和信道噪声的影响减少到尽量小的程度,是基带传输系统的设计目的。信号在传输过程中,由于信道特性不理想及加性噪声的影响,会使接收到的信号波形产生失真,为了减小失真对信号的影响,接收信号首先进入接收滤波器滤波,然后再经均衡器对失真信号进行校正,最后由抽样判决器恢复数字基带脉冲序列。2.2HDB3编译码HDB3码的全称是3阶高密度双极性码,它是AMI码的一种改进型,其目的是为了保持AMI码的优点而克服其缺点,使连“0”个数不超过3个。其编码规则如下:(1)当信码的连“0”个数不超过3时,仍按AMI码的规则编,即传号极性交替;(2)当连“0”个数超过3时,则将第4个“0”改为非“0”脉冲,记为+V或-V,称之为破坏脉冲。相邻V码的极性必须交替出现,以确保编好的码中无直流;(3)为了便于识别,V码的极性应与其前一个非“0”脉冲的极性相同,否则,将四连“0”的第一个“0”更改为与该破坏脉冲相同极性的脉冲,并记为+B或-B;(4)破坏脉冲之后的传号码极性也要交替。例如:代码:1000010000110000l1AMI码:-10000+10000-1+10000-1+1HDB3码:-1000-V+1000+V-1+1-B00-V+1-1其中的±V脉冲和±B脉冲与±1脉冲波形相同,用V或B符号的目的是为了示意是将原信码的“0”变换成“1”码。虽然HDB3码的编码规则比较复杂,但译码却比较简单。从上述原理看出,每一个破坏符号V总是与前一非0符号同极性(包括B在内)。这就是说,从收到的符号序列中可以容易地找到破坏点V,于是也断定V符号及其前面的3个符号必是连0符号,从而恢复4个连0码,再将所有-1变成+1后便得到原消息代码。HDB3码保持了AMI码的优点外,还将连“0”码限制在3个以内,故有利于定时信号的提取。2.3设计方案2.3.1编码程序编码程序主要分为四部分。第一部分:采集原码。定义一个数组,提示输入一组二进制码,将这组二进制码存在这个数组内。用length函数来记录序列的长度,用于后面程序的执行。部分程序如下所示:hdb=input('以数组形式输入原码(即在[]里输入):');yuanma=hdb;%输出原码yuanmaa=length(hdb);第二部分:检测1。检测出原码中1,然后每检测到一个1变一次符号。部分程序如下所示:l=1;forn=1:aifhdb(n)==1;l=-l;hdb(n)=l;endend第三部分:检测连0个数。检测到如果出现连续四个0的话,将第四个0变为V,但是数组里面无法出现V,则用2暂时代替。用m记录连续四个0前的非零码元的符号,用2*m即可分出V的正负。部分程序如下所示:m=-1;%符号初始化fork=1:a-3ifabs(hdb(k))==1m=hdb(k);endifhdb(k)==0ifhdb(k+1)==0ifhdb(k+2)==0ifhdb(k+3)==0hdb(k+3)=2*m;endendendendend第四部分:在已完成的序列中插入B。L=1表示两个V之间有偶数个非零码,L=-1表示两个V之间有奇数个非零码。V之间的非零码只有+1和-1,遇到一个1变一次L的符号,表示奇数或偶数。检测到下一个V时,若为偶数个,则插入一个B。这是无符号的B,再找出B,B与前一个位置的带符号的归一值相乘再取反,实现符号B的极性与前一非符号的相反,B后面第三个就是接下来的V,从它开始非零码正负号交替变化。部分程序如下所示:l=1;fors=1:aifabs(hdb(s))==2ford=s+1:aifabs(hdb(d))==1l=-l;endifabs(hdb(d))==2ifl~=1l=1;elsehdb(d-3)=3*(-(hdb(d-4))/(abs(hdb(d-4))));hdb(d:a)=-hdb(d:a);endendendendendfors=1:aifabs(hdb(s))==3hdb(s)=hdb(s)*(-(hdb(s-1))/(abs(hdb(s-1))));endend2.3.2译码程序译码部分比较简单,找到序列中代替V的2和V前面的第三个码元,把他们都变为0。找到绝对值为1的码元,全部变为1。即可实现HDB3码的译码。fork=1:aifabs(hdb(k))==2hdb(k-3)=0;hdb(k)=0;endifabs(hdb(k))==1hdb(k)=1;endend2.3.3绘图程序绘图程序使用subplot函数,产生三行一列的图形,第一个显示原码型,第二个显示HDB3的码型图,第三个显示译码后的码型图。原码的码型图产生程序如下所示:subplot(3,1,1)i=0:a-1;stairs(i,hdb);axis([0,a,-1.5,2]);title('原码')xlabel('x');ylabel('y');set(gca,'XTick',0:1:a);gridon3程序调试及结果分析3.1程序调试clearclchdb=input('以数组形式输入原码(即在[]里输入):');yuanma=hdb;%输出原序列yuanmaa=length(hdb);%测量输入的序列的长度subplot(3,1,1)%作出原序列的码型图i=0:a-1;stairs(i,hdb);axis([0,a,-1.5,2]);title('原码')xlabel('x');ylabel('y');set(gca,'XTick',0:1:a);gridonl=1;forn=1:aifhdb(n)==1;l=-l;%每检测到一个1变一次符号hdb(n)=l;endendfork=1:a-3ifabs(hdb(k))==1m=hdb(k);%m记录可能存在的连续4个0前面非零码元的符号endifhdb(k)==0ifhdb(k+1)==0ifhdb(k+2)==0ifhdb(k+3)==0%检测是否连续4个码元都是0hdb(k+3)=2*m;%用2表示Vendendendendendl=1;%l(L)=1表示两个V之间有偶数个非零码,0是偶数,所以初始为1,l=-1表示两个V之间有奇数个非零码fors=1:aifabs(hdb(s))==2ford=s+1:aifabs(hdb(d))==1%V之间的非零码只有+1,-1遇到一个使l变一次符号,表示偶数或奇数l=-l;endifabs(hdb(d))==2ifl~=1l=1;%计数器清零else%检测到下一个V时,若为偶数个,则插入Bhdb(d-3)=3*(-(hdb(d-4))/(abs(hdb(d-4))));%3代表B,插入不带符号的Bhdb(d:a)=-hdb(d:a);%V后的符号再交替endendendendendfors=1:aifabs(hdb(s))==3%找到Bhdb(s)=hdb(s)*(-(hdb(s-1))/(abs(hdb(s-1))));%B与前一个位置的带符号的归一值相乘再取反,实现符号B的极性与前一非符号的相反。B后面第三个就是接下来的V,从它开始非零码正负号交替变化endendfprintf('\nHDB3:\n');fork=1:aif((hdb(k))==+1)%在输出时把2和3输出为V和Bfprintf('+1');endif((hdb(k))==-1)fprintf('-1');endif(hdb(k)==0)fprintf('0');endif(hdb(k)==-2)fprintf('-v');endif(hdb(k)==2)fprintf('+v');endif(hdb(k)==3)fprintf('+b');endif(hdb(k)==-3)fprintf('-b');endendc=zeros(1,a);%定义一个全0阵列c,为了绘图方便把V和B看作1,改变后存在c中fork=1:aif(hdb(k)==1)c(k)=1;continue;endif(hdb(k)==-1)c(k