2024年2月15日发(作者:)
一、HDB3码的编码和译码
1、实验要求:掌握HDB3码的编码规则,利用MATLAB设计并实现HDB3码的编码和译码。
2、原理简述:
编码规则:
1) 先将消息代码变换成AMI码,若AMI码中连0的个数小于4,此时的AMI码就是HDB3码;
2) 若AMI码中连0的个数大于3,则将每4个连0小段的第4个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的交替特性使输出无直流特性,又要不出现四个以上的连0,因此可以先满足后者。
1)把"0000"换为取代节。
规则:先将"0000"分离开来,第一个"0000"直接变为"000V",然后数相邻两个"0000"之间"1"的个数,奇数则变为"000V",偶数则变为" B00V"。
2)更新符号。
根据教材有:B总是与其前面的1或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连 “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; % "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符号同极性
B(k-3)=yh(k); % B脉冲位置记录
V(k)=yh(k); % V脉冲位置记录
yh(k+1:length(yn))=-1*yh(k+1:length(yn));
% 并让后面的非零符号从V符号开始再交替变化
end
sign=yh(k); % 记录前一个V符号的极性
end
else
num=0; % 当前输入为“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);stairs([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程序设计语言实现数字带通系统的调制解调。
2、原理简述:
数字调制:用数字基带信号控制载波,把数字基带信号变换为数字带通信号(已调信号)的过程成为数字调制。
数字调制与模拟调制的基本原理相同,但数字信号有离散取值的特点。因此数字调制技术有两种方法:①利用模拟调制的方法实现数字调制,即把数字调制看成是模拟调制的特例把数字基带信号当成是模拟信号的特殊情况处理;②利用数字信号的离散取值特点通过开关
键控制载波,从而实现数字调制。这种方法称为键控法,比如对载波的振幅,频率和相位进行键控,便可得到振幅键控ASK,频移键控FSK和相移键控PSK三种基本的数字调制方式。
振幅键控ASK
振幅键控利用载波的幅度变化来传递数字信息,而其频率和初始相位保持不变。在2ASK中,载波的幅度只有两种变化状态,分别为对应二进制信息“0”或“1”。常用的二进制振幅键控方式称为通断键控,2ASK信号的一般表达式为 其中
2ASK有两种基本的解调方法:非相干解调和相干解调,解调方式如下:
非相干解调方式:
带通滤波器——全波整流器——低通滤波器——抽样判决器——输出
想干解调方式:
带通滤波器——相乘器——低通滤波器——抽样判决器——输出
频移键控FSK
频移键控是利用载波的频率变化来传递数字信息。在2FSK中,载波的频率随二进制基带信号在f1和f2两个频率点检变化。一个2FSK信号可以看成是两个不同载频的2ASK信号的叠加。其产生方式有两种:①采用模拟调频来实现②也可采用键控法实现,即在二进制基带矩形序列的控制下通过开关电路对两个不同的独立频率源进行选通。但相邻码元之间的相位不一定连续。
2FSK信号的常用解调方法也采用相干解调和非相干解调两种方式。其解调原理是将2FSK信号分解为上下两路2ASK信号分别进行解调,然后进行判决。
相移键控PSK
二进制相移键控2PSK
相移键控是利用载波的相位变化来传递数字信息,而振幅和频率保持不变。在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解调后的信号
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)
for j=1:1/datat;
ask_pre(j+(i-1)*(1/datat))=1;
end
elseif(m(i==0))
ask_pre(j+(i-1)*(1/datat))=0;
end
end
ask_pre=[ask_pre,m(i)];
ask=ask_pre.*c;
[ask_F,ask,df1]=fftseq(ask,datat,df);
[C,c,df1]=fftseq(c,datat,df);
[M,ask_pre,df1]=fftseq(ask_pre,datat,df);
f=[0:df1:df1*(length(c)-1)]-fs/2;
subplot(2,1,1);plot(t,ask_pre(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间 ms');title('未调信号');ylabel('幅值 :v');
subplot(2,1,2);plot(t,ask(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间 ms');title('2ASK信号');ylabel('幅值 :v');
%--------------------------------------------------------------------------
%--------------------- 解调 ------------------------------
%--------------------------------------------------------------------------
ask_n=(ask_pre+rand(1,length(ask_pre))).*c; %(高斯白噪声)
[ask_NF,ask_n,df1]=fftseq(ask_n,datat,df);
f_strain=8;
n_off=floor(f_strain/df1);
f=[0:df1:df1*(length(ask)-1)]-fs/2;
n0=floor((fc-8)/df1):floor((fc+8)/df1);
BP=zeros(1,length(f));
BP(min(n0):max(n0))=ones(1,length(n0)); %带通滤波器设计
BP(length(BP)-max(n0):length(BP)-min(n0))=ones(1,length(n0));
H=zeros(1,length(f));
H(1:n_off)=2*ones(1,n_off); % 矩形窗截取
H(length(f)-n_off+1:length(f))=2*ones(1,n_off);
%H(1:n_off)=2*hamming(n_off); %hamning窗截取
%H(length(f)-n_off+1:length(f))=2*hamming(n_off);
BP1=BP.*ask_F;
BPN=BP.*ask_NF;
ask_re1=ifft(BP1);
ask_ren1=ifft(BPN);
ask_re=2*ask_re1.*c; %相干解调法
ask_ren=2*ask_ren1.*c; %相干解调(高斯白噪声)
[ask_reF,ask_re,df1]=fftseq(ask_re,datat,df);
[ask_reNF,ask_ren,df1]=fftseq(ask_ren,datat,df);
D1=H.*ask_reF;
DN=H.*ask_reNF;
d1=ifft(D1);
dn=ifft(DN);
for i=1 :
length(m) % 判决
if(d1((i-1)*(1/datat)+(1/(2*datat)))>=0.5) % 判决规则:d1>0.5 => 1
m_de(i)=1; % 否则
d1<0.5 => 0
for j=1:1/datat
d11(j+(i-1)*(1/datat))=1; %为了画解调波形需要
end
else m_de(i)=0;
for j=1:1/datat
d11(j+(i-1)*(1/datat))=0; %为了画解调波形需要
end
end
end
for i=1 :
length(m) % 判决
if(dn((i-1)*(1/datat)+(1/(2*datat)))>=0.5) % 判决规则:d1>0.5 => 1
m_den(i)=1; % 否则
d1<0.5 => 0
for j=1:1/datat
dnn(j+(i-1)*(1/datat))=1; %为了画解调波形需要
end
else m_den(i)=0;
for j=1:1/datat
dnn(j+(i-1)*(1/datat))=0; %为了画解调波形需要
end
end
end
figure(2);
subplot(4,1,1);plot(t,ask(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间');title('解调器接收波形');
subplot(4,1,2);plot(t,ask_re1(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间');title('经过带通滤波器波形');
subplot(4,1,3);plot(t,d1(1:length(t)));axis([0,N,-0.5,2.5]);xlabel('时间');title('经过低通滤波器波形');
subplot(4,1,4);plot(t(1:length(d11)),d11);axis([0,N,-1.5,1.5]);xlabel('时间');title('经过判决器波形');
2FSK
clear;
N=20; %调制序列的长度
fc=5; %载波基频
datat=0.01; %时域采样间隔
fs=1/datat; %频率分辨率
df=0.01 %频率缩放系数
t=0:datat:N; %设每个码元长度为1ms 时间矢量:0:N
m=randint(1,N); %产生调制序列
for i=1:length(m)
if(m(i)==1)
for j=1:1/datat;
fsk_f(j+(i-1)*(1/datat))=4; %1码的载波基波倍频系数 20hz
mm(j+(i-1)*(1/datat))=1; %为了画码元时域波形需要
end
elseif(m(i)==0)
for j=1:1/datat;
fsk_f(j+(i-1)*(1/datat))=1; %0码的载波基波倍频系数 5hz
mm(j+(i-1)*(1/datat))=0; %为了画码元时域波形需要
end
end
end
if(m(i)==1) nn=4;
else nn=1;
end
fsk_f=[fsk_f,nn]; %使fsk_f的长度与t相同
fsk_c=fsk_f*fc; %根据不同的倍频系数产生不同的载波频率
c=cos(2*pi*fsk_c.*t); %2fsk信号产生
[C,c,df1]=fftseq(c,datat,df); %2fsk信号的傅立叶变换
[MM,mm,df1]=fftseq(mm,datat,df); %基带信号的傅立叶变换
f=[0:df1:df1*(length(mm)-1)]-fs/2; %频率作图矢量
figure(1);
subplot(2,1,1);plot(t,mm(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间 ms');title('未调信号');ylabel('幅值 :v');
subplot(2,1,2);plot(t,c(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间 ms');title('2FSK信号');ylabel('幅值 :v');
%--------------------------------------------------------------------------
%---------------- 解调 -----------------------------
%--------------------------------------------------------------------------
B0=[fc-2,fc+2]; %0码频带宽
B1=[fc*4-2,fc*4+2]; %1码频带宽
n0=floor((fc-2)/df1):floor((fc+2)/df1);
n1=floor((4*fc-2)/df1):floor((4*fc+2)/df1);
H0=zeros(1,length(C));
H0(min(n0):max(n0))=ones(1,length(n0)); %滤波器设计(0码带通滤波器)
H0(length(H0)-max(n0):length(H0)-min(n0))=ones(1,length(n0));
H1=zeros(1,length(C));
H1(min(n1):max(n1))=ones(1,length(n1)); %滤波器设计(1码带通滤波器)
H1(length(H1)-max(n1):length(H1)-min(n1))=ones(1,length(n1));
n_off0=fc/df1;
n_off1=4*fc/df1;
L0=zeros(1,length(C)); %(0码低通滤波器)
L0(1:n_off0)=2*ones(1,n_off0);
L0(length(L0)-n_off0+1:length(L0))=2*ones(1,n_off0);
L1=zeros(1,length(C)); % %(1码低通滤波器)
L1(1:n_off1)=2*ones(1,n_off1);
L1(length(L1)-n_off1+1:length(L1))=2*ones(1,n_off1);
C0=C.*H0;
C1=C.*H1;
m0=ifft(C0);
m1=ifft(C1);
mm0=abs(m0); %包络检波
mm1=abs(m1);
[MM0,mm0,df1]=fftseq(mm0,datat,df);
[MM1,mm1,df1]=fftseq(mm1,datat,df);
MM0=MM0.*L0;
MM1=MM1.*L1;
mm0=ifft(MM0);
mm1=ifft(MM1);
for
判决
if(abs(m0((i-1)*(1/datat)+(1/(2*datat))))>=abs(m1((i-1)*(1/datat)+(1/(datat*2))))) % 判决规则:mo>m1 => 0
m_de(i)=0; % 否则
=> 1
for j=1:1/datat
m_anti(j+(i-1)*(1/datat))=0; %为了画解调波形需要
end
else m_de(i)=1;
for j=1:1/datat
m_anti(j+(i-1)*(1/datat))=1; %为了画解调波形需要
end
end
end
m_anti=[m_anti,m_de(i)];
figure(2)
subplot(5,1,1);plot(t,m0(1:length(t)));xlabel('时间'); title('经过带通滤波器1后波形');
subplot(5,1,2);plot(t,m1(1:length(t))); xlabel('时间'); title('经过带通滤波器2后波形');
subplot(5,1,3);plot(t,mm0(1:length(t)));xlabel('时间');axis([0,N,-0.1,2]); title('经过低通滤波器1后波形');
subplot(5,1,4);plot(t,mm1(1:length(t))); xlabel('时间'); axis([0,N,-0.1,2]); title('经过低通滤波器2后波形');
i=1 :
length(m) % 比较器
subplot(5,1,5);plot(t,m_anti(1:length(t))); xlabel('时间'); axis([0,N,-0.5,1.5]); title('经过比较起判决后波形');
2PSK
clear;
N=10; %调制序列的长度
fc=10; %载波频率
datat=0.01; %时域采样间隔
fs=1/datat; %频率分辨率
df=0.01 %频率缩放系数
t=0:datat:N; %设每个码元长度为1ms 时间矢量:0:N
m=randint(1,N); %产生调制序列
%--------------------------------------------------------------------------
%-------------------- 调制 ----------------------
%--------------------------------------------------------------------------
for i=1:length(m)
if(m(i)==1)
for j=1:1/datat;
psk_p(j+(i-1)*(1/datat))=pi; %1码的对应的相位为[pi](采用a方式)
mm(j+(i-1)*(1/datat))=1; %为了画码元时域波形需要
end
elseif(m(i)==0)
for j=1:1/datat;
psk_p(j+(i-1)*(1/datat))=0; %0码的对应的相位为[0](采用a方式)
mm(j+(i-1)*(1/datat))=0; %为了画码元时域波形需要
end
end
end
if(m(i)==1) nn=pi/2;
else nn=-(pi/2);
end
psk_p=[psk_p,nn]; %使p的长度与t相同,psk_p为根据不同码元产生不同的调制相位
c=cos(2*pi*fc*t+psk_p); %2psk信号产生
[C,c,df1]=fftseq(c,datat,df); %2fsk信号的傅立叶变换
[MM,mm,df1]=fftseq(mm,datat,df); %基带信号的傅立叶变换
f=[0:df1:df1*(length(mm)-1)]-fs/2; %频率作图矢量
subplot(2,1,1);plot(t,mm(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间 ms');title('未调信号');ylabel('幅值 :v');
subplot(2,1,2);plot(t,c(1:length(t)));axis([0,N,-1.5,1.5]);xlabel('时间 ms');title('2PSK信号');ylabel('幅值 :v');
%--------------------------------------------------------------------------
%------------------- 解调 ---------------------
%--------------------------------------------------------------------------
carwav=2*cos(2*pi*fc.*t);
[CF,carwav,df1]=fftseq(carwav,datat,df);
n_off=(fc-1)/df;
n0=floor((fc-2)/df1):floor((fc+2)/df1);
BP=zeros(1,length(f));
BP(min(n0):max(n0))=ones(1,length(n0)); %带通滤波器设计
BP(length(BP)-max(n0):length(BP)-min(n0))=ones(1,length(n0));
H=zeros(1,length(f));
H(1:n_off)=2*ones(1,n_off); % 低通滤波器设计 (矩形窗截取)
H(length(f)-n_off+1:length(f))=2*ones(1,n_off);
CC=C.*BP; %接受时经过一个带通滤波器
cc=ifft(CC); %反福利也变换
c_re=cc.*carwav; %乘以载波进行相干解调
cc1=c_re;
[c_reF,c_re,df1]=fftseq(c_re,datat,df);
c_reF=c_reF.*H; %经过低通滤波器
c_ref=ifft(c_reF);
for i=1 :
length(m) % 判决
if(c_ref((i-1)*(1/datat)+(1/(2*datat)))<0) % 判决规则: >0 => 0
m_de(i)=1; % 否则
<0 => 1
for j=1:1/datat
c_de(j+(i-1)*(1/datat))=1; %为了画解调波形需要
end
else m_de(i)=0;
for j=1:1/datat
c_de(j+(i-1)*(1/datat))=0; %为了画解调波形需要
end
end
end
c_de=[c_de,c_re(i)];
figure(2);
subplot(5,1,1);plot(t,c(1:length(t)));axis([0,N,-2,2]); xlabel('时间 ms');title('调制信号');ylabel('幅值 :v');
subplot(5,1,2);plot(t,carwav(1:length(t)));axis([0,N,-2,2]);xlabel('时间 ms');title('载波恢复');ylabel('幅值 :v');
subplot(5,1,3);plot(t,c_re(1:length(t)));axis([0,N,-2,2]);xlabel('时间 ms');title('载波相乘');ylabel('幅值 :v');
subplot(5,1,4);plot(t,c_ref(1:length(t)));axis([0,N,-2.5,2.5]);xlabel('时间 ms');title('低通滤波后信号');ylabel('幅值 :v');
subplot(5,1,5);plot(t,c_de(1:length(t)));axis([0,N,-0.2,1.5]);xlabel('时间 ms');title('相干解调信号');ylabel('幅值 :v');
发布者:admin,转转请注明出处:http://www.yc00.com/news/1707996312a1534597.html
评论列表(0条)