matlab_HDB3编码译码数字信号调制解调

玛丽莲梦兔
826次浏览
2021年02月22日 20:28
最佳经验
本文由作者推荐

-

2021年2月22日发(作者:功夫派小雪球)


一、


HDB3


码的编码和译码

< br>


1


、实验要求:掌握


HDB3


码的编码规则,利用


MATLAB


设计 并实现


HDB3


码的编码和译码。



2


、原理简述:



编码规则


:




1




先将消息代码变换成


AMI


码,若


AMI


码中连


0


的个数 小于


4,


此时的


AMI


码就是


HDB3



;




2





AMI


码中连


0


的 个数大于


3,


则将每


4


个连


0


小段的第


4

< p>


0


变换成与前一个非


0


符号


(+1



-1)


同极性的符号


,


用表示


(+1+,-1-);




3




为了不 破坏极性交替反转,当相邻符号之间有偶数个非


0


符号时,再将 该小段的



1



0


变换成+


B


-B,


符号的极性与前一非零符号的相反,


并让后面的非零 符号


从符号开始再交替变化。




例如


:




消息代码


: 1 0 0 0 0 1


0 0 0 0


1 1 0 0 0 0 1 1




AMI



: +1 0 0 0 0 -1


0 0 0 0


+1 -1 0 0 0 0 +1 -1




HDB3


码:


+1 0 0 0 +V -1


0 0 0 -V


+1 -1 +B 0 0 +V -1 +1


简易编码方法:



原理:


HDB3


码既要包含


AMI

< p>
的交替特性使输出无直流特性,又要不出现四个以上的


< br>0


,因此可以先满足后者。





1


)把



换为取代节。





规则:先将



分离开来,第一个



直接变为



,然后数相邻 两个



之间



的个 数,奇数则变为



,偶数则变为







2


)更新符号。





根据教材有:

B


总是与其前面的


1


< p>
V


符号相反,


V


总是与前 面的


1



B


相 符号相同,


1


总是与前面的


V



B


符号相反,就可以编符号了。




例如


:




消息代码:


1 0 0 0 0 1


0 0 0 0


1 1 0 0 0 0 1 1


0 0 0 0


0 0 0 0 1 1 1


0 0 0 0


1




中间码:



1 0 0 0 V 1


0 0 0 V


1 1 B 0 0 V 1 1


B 0 0 V


B 0 0 V 1 1 1


0 0 0 V


1


HDB3


码:


+1 0 0 0 +V -1


0 0 0 -V


+1 -1 +B 0 0 + V -1 +1 -


B 0 0 -V


+B 0 0 +V -1 +1 -1


0


0 0 -V


+1



解码规则:



1


)虽然编码很复杂,但解码规则很简单,若


3



“0”


前后非零脉冲同极性,则将最后一个


非零元素译为零,如


+1000+1


就应该 译成


“10000”


;若


2

< p>



“0”


前后非零脉冲 极性相同,则


两零前后都译为零,如


-100-1


,就应该译为


0000.


2


)再将所有的


-1


变换成


+1


后,就可以得到原消息代码。



3


、程序运行结果
























运行程序






可自定义二进制序列,第一个窗口 显示所输入的二进制码元,第二个窗口为


HDB3


编码


后的结果,最后一个窗口为解码后的窗口。



4


、程序源代码



% ch7example6prog1.m

















































% AMI


码的编码



xn=[1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0];%


输入单极性码



yn=xn;%


输出


yn


初始化



num=0;%


计数器初始化



for k=1:length(xn)





if xn(k)==1








num=num+1;

















%


计数器












if num/2 == fix(num/2) %


奇数个


1


时输出


-1,


进行极性交替

















yn(k)=1;











else
















yn(k)=-1;











end






end


end










% HDB3


编码



num=0;



%


连零计数器初始化



yh=yn;



%


输出初始化



sign=0; %


极性标志初始化为


0


V=zeros(1,length(yn));% V


脉冲位置记录变量




B=zeros(1,length(yn));% B


脉冲位置记录变量



for k=1:length(yn)





if yn(k)==0









num=num+1;



%


连“


0


” 个数计数










if num==4




%


如果


4


连“


0













num=0;





%


计数器清零












yh(k)=1*yh(k-4);































%



0000


的最后一个


0


改变为与前一个非零符号相同极性的符号












V(k)=yh(k);









% V


脉冲位置记录












if yh(k)==sign






%


如果 当前


V


符号与前一个


V


符号的极性相同















yh(k)=-1*yh(k); %


则让当前


V


符号极性反转


,


以满足


V


符号间相互 极性反转要求















yh(k-3)=yh(k);



%


添加


B


符号


,



V< /p>


符号同极性















B(k-3)=yh(k);




% B


脉冲位置记录















V(k)=yh(k);






% V


脉冲位置记录















yh( k+1:length(yn))=-1*yh(k+1:length(yn));






























% < /p>


并让后面的非零符号从


V


符号开始再交替 变化












end









sign=yh(k);











%


记录前一个

V


符号的极性








end




else








num=0;

















%


当前输入为“

< br>1


”则连“


0


”计数器清零





end


end


























%


编码完成



re=[xn',yn',yh',V',B'];






%


结果输出


: xn AMI HDB3 V&B


符号































% HDB3


解码



input=yh;




















% HDB3


码输入



decode=input;
















%


输出初始化



sign=0;






















%


极性标志初始化



for k=1:length(yh)






if input(k) ~= 0









if sign==yh(k)








%


如果当前码与前一个非零码的极性相同













decode(k-3:k)=[0 0 0 0];%


则该 码判为


V


码并将


*00V


清零










end









sign=input(k);








%


极性标志







end


end


decode=abs(decode);










%


整流



error=sum([xn'-decode']);




%


解码的正确性检验


,


作图



subplot( 3,1,1);stairs([0:length(xn)-1],xn);axis([0 length(xn) -2 2]);


subplot(3,1,2);stair s([0:length(xn)-1],yh);axis([0 length(xn) -2 2]);


subplot(3,1,3);stairs([0:length(xn)-1], decode);axis([0 length(xn) -2 2]);


二、数字带通系统的调制解调



1


、实验要求:


利用


MATLAB

< p>
程序设计语言实现


数字带通系统的调制解调。



2


、原理简述:


数字调制:


用数字基带信号控制载波,


把数字基带信号变换 为数字带通信号


(已调信号)


的过程成为数字调制。

< p>


数字调制与模拟调制的基本原理相同,但数字信号有离散取值的特点。因 此数字调制技


术有两种方法:


①利用模拟调制的方法实现数字调 制,


即把数字调制看成是模拟调制的特例


把数字基带信号当成是 模拟信号的特殊情况处理;


②利用数字信号的离散取值特点通过开关

键控制载波,从而实现数字调制。这种方法称为键控法,


比如对载波的振幅,频率和 相位进


行键控,便可得到振幅键控


ASK


,频移键控


FSK


和相移键控


PSK


三种基本的数字调制方式。



振幅键控


ASK


振幅键控利用载波的 幅度变化来传递数字信息,


而其频率和初始相位保持不变。


在< /p>


2ASK


中,载波的幅度只有两种变化状态,分别为对应二进制信 息“


0


”或“


1



。常用的二进制振


幅键控方式称为通断键控,


2ASK


信号的一般表达式为



其中




2A SK


有两种基本的解调方法:非相干解调和相干解调,解调方式如下:

< br>


非相干解调方式:



带通滤波 器——全波整流器——低通滤波器——抽样判决器——输出



想干解调方式:



带通滤波器——相乘器——低通滤波器——抽样判决器——输出



频移键控


FSK


频移键控是利用载波 的频率变化来传递数字信息。在


2FSK


中,载波的频率随二进 制基


带信号在


f1


< br>f2


两个频率点检变化。


一个


2 FSK


信号可以看成是两个不同载频的


2ASK


信号


的叠加。


其产生方式有两种:

①采用模拟调频来实现②也可采用键控法实现,


即在二进制基


带矩形序列的控制下通过开关电路对两个不同的独立频率源进行选通。


但相邻码元之间 的相


位不一定连续。



2FSK


信号的常用解调方法也采用相干解调和非相干解调两种方式。其解调原理是将

< br>2FSK


信号分解为上下两路


2ASK

< br>信号分别进行解调,然后进行判决。



相移键控


PSK


二进制相移键控


2PSK


< p>
相移键控是利用载波的相位变化来传递数字信息,


而振幅和频率保持不变。



2PSK


中,


通常用初始相位


0


和π分别表示二进制“

1


”和“


0


。与


2ASK


信号的产生方式相比,只是对


s(t)


的要求不同,在


2ASK

中是单极性的,而在


2PSK


中是双极性的基带信号。



2PSK


信号的解调通常采用相干解调法 。



二进制差分相移键控


2DPSK


2PSK


相干解调时,


由于载波恢复中 相位有


0



π模糊性,


导致解调过程出现


“反向工作”


现象,恢复出的数字信 号“


1




0


”倒置,使得


2PSK


难以实际应用。 而


2DPSK


是利用前后相


邻码元的载 波相对相位变化传递数字信息,


对于相同的基带数字信息序列,


由于初始相位不


同,


2DPSK


的相位 可以不同。也就是说,


2DPSK


信号的相位并不直接代表基带 信号,而前后


码元相对相位的差才唯一决定信号符号。



2DPSK


信号的解调方法为相干解调(极性比较法)加码反变换法。



其原理为:



带通滤波器——相乘器——低通滤波器——抽样判决器——码反变换——输出



3


、程序运行结果




2ASK


调制后的信号以及


2ASK


解调后的信号




2PSK


基带信号,


2PSK


调制后的信号以及


2PSK

< br>解调后的信号




2FSK


调制后的信号以及使用


2FSK


解调后的信 号




随机产生得二进制原始信号以及


2DPSK


调制之后得信号




使用


2DPSK

解调之后的信号




4


、程序源代码



2ASK


clear all;


clear;


N=10;




















%


调制序列的长度




fc=20;



















%


载波频率



datat=0.01;














%


时域采样间隔



data=1/datat;


df=0.01



;

















%


频率分辨率



t=0:datat:N;













%


设每个码元长度为


1ms


时间矢量:


0



N


m=randint(1,N);










%


产生调制序列



fs=1/datat;


c=cos(2*pi*fc*t);



for i=1:length(m)






if(m(i)==1)

-


-


-


-


-


-


-


-