一.问题描述-----------------------------------------3
二.实验原理-----------------------------------------4
三.源程序-------------------------------------------6
四.数据测试----------------------------------------16
五.调试分析----------------------------------------22
六.用户使用手册------------------------------------23
七.心得体会----------------------------------------24
一、问题描述
1.使用matlab编程完成HDB3的编码与解码。
2.课程设计需要运用MATLAB编程实现2ASK,2FSK,2PSK,2DPSK调制解调过程,并且输出其源码,调制后码元以及解调后码元的波形。
二、实验原理
1.HDB3编码解码原理
HDB3码:三阶高密度双极性码。
HDB3码与二进制序列的关系:
(1)二进制信号序列中的“0”码在HDB3码中仍编为“0”码,二进制信号中“1”码,在HDB3码中应交替地成+1和-1码,但序列中出现四个连“0”码时应按特殊规律编码(引入传号交替反转码的“破坏点”V码);
(2)二进制序列中四个连“0”按以下规则编码:信码中出现四个连“0”码时,要将这四个连“0”码用000V或B00V取代节来代替(B和V也是“1”码,可正、可负)。这两个取代节选取原则是,使任意两个相邻v脉冲间的传号数为奇数时选用000V取代节,偶数时则选用B00V取代节。
2.二进制数字调制技术原理
数字信号的传输方式分为基带传输和带通传输,在实际应用中,大多数信道具有带通特性而不能直接传输基带信号。为了使数字信号在带通信道中传输,必须使用数字基带信号对载波进行调制,以使信号与信道的特性相匹配。这种用数字基带信号控制载波,把数字基带信号变换为数字带通信号的过程称为数字调制。通常使用键控法来实现数字调制,比如对载波的振幅、频率和相位进行键控。
(1)2ASK信号的产生方法通常有两种:模拟调制和键控法。解调有相干解调和非相干解调。P=1时f(t)=Acoswt;p=0时f(t)=0;其功率谱密度是基带信号功率谱的线性搬移
(2) 一个2FSK信号可以看成是两个不同载波的2ASK信号的叠加。其解调和解调方法和ASK差不多。2FSK信号的频谱可以看成是f1和f2的两个2ASK频谱的组合。
(3) 2PSK以载波的相位变化作为参考基准的,当基带信号为0时相位相对于初始相位为0, 当基带信号为1时相对于初始相位为180°。
(4) 2DPSK调制原理方框图如下图。
S(t)
间接法信号调制器原理方框图
2DPSK信号的解调,主要有两种方法,即相位比较法和相干解调法。相干解调法原理方框图如下图:
相干解调法原理方框图
三、源程序
clear
clc
a=20; %a表示元素个数,可以修改码元为任意个数如1024
r=unidrnd(2,1,a-1); %随机产生离散均匀二值分布(1,2),共a-1个
rn=r-1; %每个元素减1变为(0,1)二值随机数列
rn=[1,rn]; %跟书上一致,从1开始随机产生离散均匀二值分布(1,2),共a个
ori=rn; %将原序列保存起来,便于后面解码后比较
ori
l=1;
for k=1:a-3
if abs(rn(k))==1
m=rn(k); %m记录可能存在的连续4个0前面非零码元的符号
end
if rn(k)==0
if rn(k+1)==0
if rn(k+2)==0
if rn(k+3)==0 %检测是否连续4个码元都是0
rn(k+3)=2*m; %用2表示书上的V
end
end
end
end
end
rn ; %插入V(2)后 checked
l=1; %l=1表示两个V之间有偶数个非零码,0是偶数,所以初始为1,l=-1表示两个V之间有奇数个非零码
for s=1:a
if abs(rn(s))==2
for d=s+1:a
if abs(rn(d))==1 %V之间的非零码只有+1,-1遇到一个一使l变一次号,表示偶数或奇数
l=-l;
end
if abs(rn(d))==2
if l~=1
l=1; %不需要插入B时若检测到V也应把计数器清零
%最初版本的升级处1
else %检测到下一个V时,若为偶数个,则插入B
rn(d-3)=3*(-(rn(d-4))/(abs(rn(d-4)))); %3代表B,插入不带符号的B
rn(d:a)=-rn(d:a);
end %V后的符号再交替
end
end
end
end
rn %到此处完成了插入不带符号的B
%for s=1:a
% if abs(rn(s))==3 %找到B
%rn(s)=rn(s)*(-(rn(s-1))/(abs(rn(s-1)))); %B(3)与前一个位置的带符号的归一值相乘再取反,实现符号B(3)的极性与前一非符号的相反
%B后面第三个就是接下来的V,从它开始非零码正负号交替变化
%end
%end
HDB=rn; %给B(3)添加了符号,并且实现了V后的符号再交替
HDB
%以上便实现了HDB3的编码
%下面进行解码
for k=1:a
if abs(rn(k))==2
rn(k-3)=0;rn(k)=0; %每个V(2)都变成0,V前面第三个有可能是B(3)有可能是0也恢复为0
end
if abs(rn(k))==1
rn(k)=1;
end
end
rn %解码后的恢复序列
rn-ori %解码与原码比较全为0则解码正确
s=menu('通信原理','2ASK','2PSK','2FSK','2DPSK')
switch s
case 1,scolor='2ASK';
n=8;N=100;K=4;
a=randint(1,n);
bita=[];sl=[];
bitRate=1e3;fc=1e3;%载频1KHZ
t=linspace(0,1/bitRate,N);
for i=1:length(a)
if a(i)==0
bit1=zeros(1,N);
else
bit1=ones(1,N);
end
bita=[bita,bit1];
c=sin(2*pi*t*fc);
sl=[sl c];
end
figure(1);
subplot(K,1,1);plot(bita,'LineWidth',1.5),title('基带信号'),grid on;axis([0,N*length(a),-2.5,2.5]);
tz=bita*6.*sl;
subplot(K,1,2);plot(tz,'LineWidth',1.5);title('ASK调制后信号');grid on;
signal=awgn(tz,80,'measured');
subplot(K,1,3);plot(signal,'LineWidth',1.5),grid on;title('信号+噪声')
Fs=3e3;
[b,a]=ellip(4,0.1,40,[999.9,1000.1]*2/Fs);%设计IIR带通滤波器,阶数为4,通带纹波0.1,阻带衰减40DB
sf=filter(b,a,signal);%信号通过该滤波器
figure(2);
K1=4;
subplot(K1,1,1);plot(sf,'LineWidth',1.5),grid on;title('BPF')
signal2=abs(sf); %乘同频同相sin
subplot(K1,1,2);plot(signal2,'LineWidth',1.5),grid on;title('全波整流器');
Fs=3e3;%抽样频率400HZ
[b,a]=ellip(4,0.1,40,[50]*2/Fs);%设计IIR低通滤波器
sf1=filter(b,a,signal2);%信号通过该滤波器,输出信号sf
subplot(K1,1,3);plot(sf1,'LineWidth',1.5),grid on;title('LPF');
sf2=[];
LL=fc/bitRate*N;
i=LL/2;
bitb=[];
while (i<=length(sf1)) %判决
sf2=[sf2,sf1(i)>=0.001];
i=i+LL;
end
for i=1:length(sf2)
if sf2(i)==0
bit1=zeros(1,N);
else
bit1=ones(1,N);
end
bitb=[bitb,bit1];
end
figure(1);
subplot(K,1,4); plot(bitb,'LineWidth',1.5),grid on;title('解调后信号'); axis([0,N*length(sf2),-2.5,2.5]);
case 2,scolor='2PSK';
l=linspace(0,pi,50);% 数据初始化
t=linspace(0,9*pi,450);
b=1:1:9;
out=1:1:450;
f=1:1:450;
g=1:1:450;
w1=2 %正弦波f1的频率,可以根据自己想要的频率在此改写
%正弦波f2的频率,可以根据自己想要的频率在此改写
f1=sin(w1*l);
figure(1);
f2=sin(w1*l+pi);
figure(1);
subplot(2,1,1),plot(l,f1),axis([0 pi -1.2 1.2]),xlabel('t'),ylabel('f1');%画出f1信号波形
subplot(2,1,2),plot(l,f2),axis([0 pi -1.2 1.2]),xlabel('t'),ylabel('f2');%画出f2信号波形
a=[0 1 0 0 0 1 1 0 1]
for i=1:9 %2pSK编码
if a(i)==0
for k=1:50 %如果二进制原码为0则输出f1波形
out(k+50*(i-1))=f1(k);
end
else
for j=1:50
out(j+50*(i-1))=f2(j); %r如果二进制原码为1则输出f2波形
end
end
end
for i=1:9 %2PSK解码
n=0;m=0;
for j=1:50
if out(j+50*(i-1))-f1(j)==0
n=n+1;
else if out(j+50*(i-1))-f2(j)==0
m=m+1;
end
end
end
if n>m
b(i)=0;
else b(i)=1;
end
end
b
for i=1:9 %画出解码后的波形 ,包括原码和解码出的码,进行对比
for j=1+50*(i-1):50*i
f(j)=a(i);
g(j)=b(i);
end
end
figure(2);
subplot(3,1,1),plot(t,f),axis([0 9*pi -0.2 1.2]),xlabel('t'),ylabel('数字基带调制原码');
subplot(3,1,2),plot(t,out),axis([0 9*pi -1.2 1.2]),xlabel('t'),ylabel('调制好的波形');
subplot(3,1,3),plot(t,g),axis([0 9*pi -0.2 1.2]),xlabel('t'),ylabel('解码得到的码');
[Num,Rat]=biterr(f,g)
case 3,scolor='2FSK';
%==生成随机码元、基带信号、调制================%
n=8;%随机码元个数
N=100;%模拟一个码元的点数
K=4;%figure1画四个小图
a=randint(1,n)%码元生成
bita=[];%定义空数组,存放基带信号
for i=1:length(a)
if a(i)==0
bit1=zeros(1,N);
else
bit1=ones(1,N);
end
bita=[bita,bit1];%基带信号
end
figure(1);
subplot(K,1,1);plot(bita,'LineWidth',1.5),title('基带信号'),grid on;axis([0,N*length(a),-2.5,2.5]);
bitRate=1e3;%每一个码元中采样点的间隔宽度0.001s
fc=1e3;%载频1KHZ
t=linspace(0,1/bitRate,N);
tz=[];
c1=sin(2*pi*t*fc);%载波
c2=sin(2*pi*t*fc*2);%载波
for i=1:length(a)
if a(i)==1
tz=[tz,c1];
else
tz=[tz,c2];
end
end
subplot(K,1,2);plot(tz,'LineWidth',1.5);title('2FSK已调信号');grid on;
signal=awgn(tz,20,'measured');%加噪
subplot(K,1,3);plot(signal,'LineWidth',1.5),grid on;title('信号+噪声')
%===========解调============%
Fs=5e3;%采样频率
[b1,a1]=ellip(4,0.1,40,[999.9,1000.1]*2/Fs);%设计IIR带通滤波器,阶数为4,通带纹波0.1,阻带衰减40DB
[b2,a2]=ellip(4,0.1,40,[1999.9,2000.1]*2/Fs);
sa=filter(b1,a1,signal);%信号通过该滤波器
sb=filter(b2,a2,signal);
figure(2);
K1=3;%figure2画(3*2)幅图表示解调过程
subplot(K1,2,1);plot(sa,'LineWidth',1.5),grid on;title('BPF')
subplot(K1,2,2);plot(sb,'LineWidth',1.5),grid on;title('BPF')
%======相乘器=============%
t=linspace(0,1/bitRate,N);
c1=sin(2*pi*t*fc);
c2=sin(2*pi*t*fc*2);
sia=[];
sib=[];
for i=1:n
sia=[sia,c1];
sib=[sib,c2];
end
siga=sa.*sia;%乘同频同相sia
sigb=sb.*sib;%乘同频同相sib
subplot(K1,2,3);plot(siga,'LineWidth',1.5),grid on;title('相乘器');
subplot(K1,2,4);plot(sigb,'LineWidth',1.5),grid on;title('相乘器');
%========LPF================%
Fs=5e3;%抽样频率400HZ
[b1,a1]=ellip(4,0.1,40,[50]*2/Fs);%设计IIR低通滤波器
[b2,a2]=ellip(4,0.1,40,[50]*2/Fs);%设计IIR低通滤波器
sfa=filter(b1,a1,siga);%信号通过该滤波器,输出信号sfa
sfb=filter(b2,a2,sigb);%信号通过该滤波器,输出信号sfb
subplot(K1,2,5);plot(sfa,'LineWidth',1.5),grid on;title('LPF');
subplot(K1,2,6);plot(sfb,'LineWidth',1.5),grid on;title('LPF');
%===========抽样判决==================%
s2a=[];s2b=[];
LL=fc/bitRate*N;
i1=LL/2;i2=LL;
bitb=[];
while (i1<=length(sfa)) %判决过程
s2a=[s2a,sfa(i1)>=0];
i1=i1+LL;
end
while (i2<=length(sfb))
s2b=[s2b,sfb(i2)<=0];
i2=i2+LL;
end
for i=1:n
if s2a(i)>s2b(i)
bit1=zeros(1,N);
else
bit1=ones(1,N);
end
bitb=[bitb,bit1];
end
figure(1);
subplot(K,1,4); plot(bitb,'LineWidth',1.5),grid on;title('解调后信号'); axis([0,length(bitb),-2.5,2.5]);
case 4,scolor='2DPSK';
%- 2DPSK 调制与解调
%---------------------------------------------------
%>>>>>>>>>>>>>>>>>>Initial_Part>>>>>>>>>>>>>>>>>>>>>
%---------------------------------------------------
fs = 30000;
Time_Hold_On = 0.1;
Num_Unit = fs * Time_Hold_On;
High_Level = ones ( 1, Num_Unit );
Low_Level = zeros ( 1, Num_Unit );
w = 300;
A = 1;
%---------------------------------------------------
%>>>>>>>>>>>>>>>>>>Initial_The_Signal>>>>>>>>>>>>>>>
%---------------------------------------------------
Sign_Set = [0,1,1,0,1,0,0,1]
Lenth_Of_Sign = length ( Sign_Set );
st = zeros ( 1, Num_Unit * Lenth_Of_Sign );
sign_orign = zeros ( 1, Num_Unit * Lenth_Of_Sign );
sign_result = zeros ( 1, Num_Unit * Lenth_Of_Sign );
t = 0 : 1/fs : Time_Hold_On * Lenth_Of_Sign - 1/fs;
%---------------------------------------------------
%>>>>>>>>>>>产生基带信号>>>>>>>>>>>>
%---------------------------------------------------
for I = 1 : Lenth_Of_Sign
if Sign_Set(I) == 1
sign_orign( (I-1)*Num_Unit + 1 : I*Num_Unit) = High_Level;
else
sign_orign( (I-1)*Num_Unit + 1 : I*Num_Unit) = Low_Level;
end
end
%---------------------------------------------------
%>>>>>>>>>>>>>>>>>>调制部分>>>>>>>>>>>>>>>>>>
%---------------------------------------------------
for I = 1 : Lenth_Of_Sign
if Sign_Set(I) == 1
st( (I-1)*Num_Unit + 1 : I*Num_Unit) = A * cos ( 2 * pi * w * t( (I-1)*Num_Unit + 1 : I*Num_Unit ) + ( pi / 2 ) );
else
st( (I-1)*Num_Unit + 1 : I*Num_Unit) = A * cos ( 2 * pi * w * t( (I-1)*Num_Unit + 1 : I*Num_Unit ) );
end
end
figure
subplot ( 2,1,1 )
plot(t, sign_orign);
axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - (A / 2), A + (A / 2) ] );
title ( '原始信号' );
grid
subplot ( 2, 1, 2 );
plot ( t, st );
axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );
title ( '调制后的信号' );
grid
%---------------------------------------------------
%>>>>>>>>>>>>>>>>>>相乘>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
%---------------------------------------------------
dt = st .* cos ( 2 * pi * w * t );
figure
plot ( t, dt );
axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );
title ( '相乘后的波形' );
grid
%---------------------------------------------------
%>>>>>>>>>>>>>>>>>>>低通滤波部分>>>>>>>>>>>>>>>>>>>>
%---------------------------------------------------
[N,Wn] = buttord( 2*pi*50, 2*pi*150,3,25,'s'); %临界频率采用角频率表示
[b,a]=butter(N,Wn,'s');
[bz,az]=impinvar(b,a,fs); %映射为数字的
dt = filter(bz,az,dt);
figure
plot ( t, dt );
axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );
title ( '低通滤波后的波形' );
grid
%---------------------------------------------------
%>>>>>>>>>>>>>抽样判决 & 逆码变换部分>>>>>>>>>>>>>>>
%---------------------------------------------------
for I = 1 : Lenth_Of_Sign
if dt((2*I-1)*Num_Unit/2) < 0.25
sign_result( (I-1)*Num_Unit + 1 : I*Num_Unit) = High_Level;
else
sign_result( (I-1)*Num_Unit + 1 : I*Num_Unit) = Low_Level;
end
end
figure
plot ( t, sign_result );
axis( [ 0 , Time_Hold_On *( Lenth_Of_Sign + 1), - 3*(A / 2), 3*(A / 2) ] );
title ( '解调后信号' );
grid
end
四、测试数据
运行程序
命令窗口会显示随进产生的二进制码,对此二进制码进行HDB3编码之后得码元,解码之后得码元以及解码之后得码元与原基带码进行比较得结果 如下图:
还会出现调制解调得选择窗口,来进行选择调制解调方式 如下
在选择窗口中可以看到有四种调制解调方式
选择2ASK进行调制解调
可以看到随机得基带信号,2ASK调制后的信号以及2ASK解调后的信号
进入菜单 从新选择2PSK
可以看到随机产生得2PSK基带信号,2PSK调制后的信号以及2PSK解调后的信号
进入菜单栏重新选择2FSK调制解调
可以看到随机产生得基带信号,使用2FSK调制后的信号以及使用2FSK解调后的信号
进入菜单栏从新选择2DPSK调制解调
以上为随机产生得二进制原始信号以及2DPSK调制之后得信号
使用2DPSK解调之后的信号
五、调试分析
1、调试方法:运行程序,按要求测试各功能能否实现,如果不能实现,则寻找问题原因,修改程序后再次运行,再次测试功能能否实现,直到成功实现所有功能。
2、问题分析与解决措施.
在调试过程中遇到了
(1)输出数据出错.
错误:有时运行程序,在产生随机二进制码时由于程序的不稳定,在产生1的时候却产生了2,进行程序修改之后是之变得稳定。
(2)输出提示语句未显示
错误:提示语与程序中设置显示语言发生冲突。
(3)使用menu模块时未能成功连接
错误:连接语使用不一致
六、用户使用手册
《通信原理(第六版)》
樊昌信 曹丽娜编
国防工业出版社
《MATLAB程序设计与应用(第二版)》
刘卫国主编
高等教育出版社
七、心得体会
通过这两周的通信原理课程设计实践,我复习了MATLAB编程语言的基本概念、语法、语义和数据类型的使用特点,加深了对课堂所学理论知识的理解,掌握了运用结构化程序设计的基本思想和方法,更重要的是培养了自己的自学能力。
因为这是我们第二次接触MATLAB编程语言,在编写程序以及调试的过程中遇到了很多困难,但是我通过去图书馆查找资料,请教同学老师,再自己一点点改善程序,最终编写出一个比较完善的程序,实现了所有要求功能,这是最值得我欣慰的一点。
以下是我的几点切身感受:
(一)编写程序需要一个清醒的头脑,明确的思路,同时也要有耐心毅力。
刚拿到程序设计课题时,我感觉一片茫然,因为在之前的信号处理学习中,只是在一些例题中接触过MATLAB语言,甚至没有看过一些基础的书籍,更没有上过课,所以初次遇到一个实际问题,感觉无从下手。这是由于自己对MATLAB的模块设计不够理解,同时对MATLAB的基本语句一无所知,不过通过请教老师懂得了首先要设计guide目录,再根据用户输入,执行swtich语句,在每个case后调用一个函数,来实现要求的功能,这样一下子豁然开朗,掌握了基本设计思路之后,后面的编程就顺利多了。至此,我真真体会到清晰地思路对成功编写一个程序的重要性。
当然成功编写一个程序绝非易事,之前,我总以为程序能够正常运行,就代表着编程成功,后来我才发现我大错特错了。我用了三天时间,完成了程序的编写、改错,但我立刻发现尽管程序能够正常运行,部分功能却不完善,甚至不能实现。经过一次又一次调试、修改又修改,一点一点发现问题并改正,我才真正发现编程远没有想象中的简单。它需要的不仅是清晰地编程思路、编程技巧,还需要有耐心有毅力,不要放弃。
(二)我们在大学需要学习的不仅是基础知识、专业知识,更重要的是一种学习能力。
正如老师所说学习是终生的,因此学习能力也就能让我们受益终生。由于课堂时间有限,MATLAB课程只能靠我们自学,然而guide画图功能我们必须用到,因此只能通过自习,实践也证明我们是有自学的潜能的,通过自学课本,不理解的知识,通过查找资料,请教老师,最终掌握知识,因此,这次课程设计时间培养了我们的自学能力。
(三)要学会向他人请教,与他人合作。
在编程过程中,我遇到了许多问题,通过查找资料也未能找到原因,每次我想老师请教,老师总能不厌其烦地一点点讲解。有时,老师为了帮我在那几百行的程序中找到问题,花上一个多小时,这让我非常感动。大学中的老师是每个大学生的好资源,他的博学、重教,向他们请教会有很大收获。
在编程过程中,我与我组成员共同讨论,为对方查找错误,提示建议,在这个过程中我收获甚多,也培养了自己的合作精神。
(四)要学会总结,提高。
在编程过程中,我发现自己的程序还有很多地方可以完善。程序的界面可以做得更加人性化,这样使用户使用更加方便,画图函数也还可以改进,例如:在使用figure分图显示的时候,我尽量选择部分图,都在一个figure中显示,这样既符合了,老师的要求——尽量在一个图中完成设计,同时也使整个设计的显得干净利落。下载本文