1.2 设计任务
本设计是基于MATLAB的模拟相位(PM)调制与解调仿真,主要设计思想是利用MATLAB这个强大的数学软件工具,其中的通信仿真模块通信工具箱以及M檔等,方便快捷灵活的功能实现仿真通信的调制解调设计。还借助MATLAB可视化交互式的操作,对调制解调处理,降低噪声干扰,提高仿真的准确度和可靠性。要求基于MATLAB的模拟调制与解调仿真,主要设计思想是利用MATLAB、simulink檔、M檔等,方便快捷的实现模拟通信的多种调制解调设计。基于simulink对数字通信系统的调制和解调建模。并编写相应的m檔,得出调试及仿真结果并进行分析。
2.通信系统与MATLAB软件
2.1模拟通信系统简介
通信系统是为了有效可靠的传输信息,信息由信源发出,以语言、图像、数据为媒体,通过电(光)信号将信息传输,由信宿接收。通信系统又可分为数字通信与模拟通信。基于课程设计的要求,下面简要介绍模拟通信系统。
信源是模拟信号,信道中传输的也是模拟信号的系统为模拟通信。模拟通信系统的模型如图1所示。
图1 模拟通信系统模型
调制器: 使信号与信道相匹配, 便于频分复用等。发滤波器: 滤除调制器输出的无用信号。收滤波器: 滤除信号频带以外的噪声,一般设N(t)为高斯白噪声,则Ni(t)为窄带白噪声。
2.2 相位调制与解调
调制在通信系统中具有重要作用。通过调制,不仅可以进行频谱搬移,把调制信号的频谱搬移到所希望的位置上,从而将调制信号转换成适合于信道传输或便于信道多任务的已调信号,而且它对系统的传输有效性和传输可靠性有着很大的影响。调制方式往往决定了一个通信系统的性能。
在无线电通信中,角度调制(简称角调)是一种重要的调制方式,它包括频率调制和相位调制。频率调制简称调频用FM表示,它是使高频振荡信号的频率按调制信号的规律变化,而振幅保持不变的一种调制方式。我们称调频信号的解调为鉴频或频率检波。相位调制简称调相,用PM表示,它是使高频振荡信号的相位按调制信号的规律变化,其振幅也保持不变。调相信号的解调,称为鉴相或相位检波。角度调制属于频谱的非线性变换,即已调信号的频谱结构不再保持原调制信号频谱的内部结构,且调制后的信号带宽比原调制信号的贷款要大得多。虽然角度调制信号的频带利用率不高,但其抗干扰和噪声的能力较强。
由于从消息变换过来的原始信号具有频率较低的频谱分量,这种信号在许多信道中不适宜直接进行传输。因此,在通信系统的发送端通常需要有调制过程,而在接收端则需要有反调制过程——解调过程。
所谓载波调制,就是按调制信号(基带信号)的变化规律去改变载波某些参数过程。调制的载波可以分为两类:用正弦型信号作为载波;用脉冲串或一组数字信号作为载波。通常,调制可以分为模拟(连续)调制和数字元调制两种方式。在模拟调制中,调制信号的取值是连续的,而数字调制中的调制信号的取值则为离散的。目前常见的模—数变换可以看成是一种用脉冲串作为载波的数位调制,它又称为脉冲编码调制(PCM)。
2.3 SIMULINK
SIMULINK是MATLAB软件的扩展,它是实现动态系统建模和仿真的一个软件包,它与MATLAB语言的主要区别在于,其与用户交互接口是基于Windows的模型化图形输入,其结果是使得用户可以把更多的精力投入到系统模型的构建,而非语言的编程上。在simulink环境中,利用鼠标就可以在模型窗口中直观地“画”出系统模型,然后直接进行仿真。它为用户提供了方框图进行建模的图形接口,采用这种结构画模型就像你用手和纸来画一样容易。
而所谓模型化图形输入是指SIMULINK提供了一些按功能分类的基本的系统模块,用户只需要知道这些模块的输入输出及模块的功能,而不必考察模块内部是如何实现的,通过对这些基本模块的调用,再将它们连接起来就可以构成所需要的系统模型(以.mdl檔进行存取),进而进行仿真与分析。SIMILINK 模块库按功能进行分类,包括以下8类子库: Continuous(连续模块),Discrete(离散模块),Function&Tables(函数和平台模块),Math(数学模块),Nonlinear(非线性模块),Signals&Systems(信号和系统模块),Sinks(接收器模块),Sources(输入源模块)。
3.原理分析
3.1调相信号
在模拟调制中,一个连续波有三个参数可以用来携带信息而构成已调信号。当幅度和频率保持不变时,改变载波的相位使之随未调信号的大小而改变,这就是调相的概念。
角度调制信号的一般表示形式为:
S (t)=Acos[ωt+φ(t)]
式中,A是载波的恒定振幅;[ωt+φ(t)]是信号的瞬时相位,而φ(t)称为瞬时相位偏移;d[ωt+φ(t)]/dt为信号的瞬时频率,而dφ(t)/dt称为瞬时频率偏移,即相对于ω的瞬时频率偏移。
设高频载波为u=Ucosωt,调制信号为UΩ(t),则调相信号的瞬时相位
φ(t)=ω+KUΩ(t)
瞬时角频率 ω(t)==ω+K
调相信号 u=Ucos[ωt+KuΩ(t)]
将信号的信息加在载波的相位上则形成调相信号,调相的表达式为:
S(t)=Acos[ωt+Kf(t)+φ]
这里K称为相移指数,这种调制方式,载波的幅度和角频率不变,而瞬时相位偏移是调制信号f(t)的线性函数,称为相位调制。
调相与调频有着相当密切的关系,我们知道相位与频率有如下关系式:
ω==ω+Kf(t)
φ(t)=ωt+K
所以在调相时可以先将调制信号进行微分后在进行频率调制,这样等效于调相,此方法称为间接调相,与此相对应,上述方法称为直接调相。调相信号的产生如图2所示:
图2 PM调相信号的产生
3.2 调制原理
实现相位调制的基本原理是使角频率为ω的高频载波u(t)通过一个可控相移网络, 此网络产生的相移Δφ受调制电压uΩ(t)控制, 满足Δφ=KuΩ(t)的关系, 所以网络输出就是调相信号,可控相移网络调相原理图如图3所示:
图3 可控相移网络调相原理图
3.3 解调原理
已调波的解调电路称为检波器,调相波的解调电路称为相位检波器或鉴相器。采用乘积鉴相是最常用的方法。若调相信号为
u=Ucos[ωt+Δφ(t)] 其中Δφ(t)=KΩ(t)
同步信号与载波信号相差
u =sinΔφ(t)-sin[2ωt+Δφ(t)] 式中k为乘法器增益, 低通滤波器增益为1,可以看到乘积鉴相的线性鉴相范围较小,只能解调M≦的调相信号。乘积鉴相器的原理图如图4所示,由于相乘的两个信号有90的固定相位差,故这种方法又称为正交乘积鉴相。
图4 正交乘积鉴相原理图
4.M函数实现的仿真
4.1源代码
首先任意给定一个已知调制信号m(t)=sin(100*t)
进行相位调制时要用到傅里叶变换,因此先编写傅里叶变换的m文件用作主函数调用,其m文件代码如下:
%求傅里叶变换的子函数
function [M,m,df]=fftseq(m,ts,df)
fs=1/ts;
if nargin==2 n1=0; %nargin为输入参量的个数
else n1=fs/df;
end
n2=length(m);
n=2^(max(nextpow2(n1),nextpow2(n2))); %nextpow2(n)取n最接近的较大2次幂
M=fft(m,n); %M为信号m的傅里叶变换,n为快速傅里叶变换的点数,及基n-FFT变换
m=[m,zeros(1,n-n2)]; %构建新的m信号
df=fs/n; %重新定义频率分辨率
上述m文件以“fftseq.m”保存。
在实现相位解调时要调用两个子函数,分述如下:
%求信号相角的子函数,这是调频、调相都要用到的方法
function [v,phi]=env_phas(x,ts,f0)
if nargout==2 %nargout为输出变数的个数
z=loweq(x,ts,f0); %产生调制信号的正交分量
phi=angle(z); %angle是对一个复数求相角的函数
end
v=abs(hilbert(x)); %abs用来求复数hilbert(x)的模
上述m文件以“env_phas.m”保存。
%产生调制信号的正交分量
function x1=loweq(x,ts,f0)
t=[0:ts:ts*(length(x)-1)];
z=hilbert(x); %希尔伯特变换对的利用---通过实部来求虚部
x1=z.*exp(-j*2*pi*f0*t); %产生信号z的正交分量,
%并将z信号与它的正交分量加在一起
上述m文件以“loweq.m”保存
%主程序
t0=0.2; %信号的持续时间,用来定义时间向量
ts=0.001; %抽样间隔
fs=1/ts; %抽样频率
fc=300; %载波频率,fc可以任意改变
t=[-t0/2:ts:t0/2]; %时间向量
kf=100; %偏差常数
df=0.25; %所需的频率分辨率,用在求傅里叶变换时,它表示FFT的最小频率间隔
m=sin(100*t); %调制信号,m(t)可以任意更改
int_m(1)=0; %求信号m(t)的积分
for i=1:length(t)-1
int_m(i+1)=int_m(i)+m(i)*ts;
end
[M,m,df1]=fftseq(m,ts,df); %对调制信号m(t)求傅里叶变换
M=M/fs; %缩放,便于在频谱图上整体观察
f=[0:df1:df1*(length(m)-1)]-fs/2; %时间向量对应的频率向量
u=cos(2*pi*fc*t+2*pi*kf*int_m); %调制后的信号
[U,u,df1]=fftseq(u,ts,df); %对调制后的信号u求傅里叶变换
U=U/fs; %缩放
%通过调用子程序env_phas和loweq来实现解调功能
[v,phase]=env_phas(u,ts,fc); %解调,求出u的相位
phi=unwrap(phase); %校正相位角,使相位在整体上连续,便于后面对该相位角求导
dem=(1/(2*pi*kf))*(diff(phi)*fs); %对校正后的相位求导
%再经一些线性变换来恢复原调制信号
%乘以fs是为了恢复原信号,因为前面使用了缩放
subplot(3,2,1) %子图形式显示结果
plot(t,m(1:length(t))) %现在的m信号是重新构建的信号,
%因为在对m求傅里叶变换时m=[m,zeros(1,n-n2)]
axis([-0.1 0.1 -1 1]) %定义两轴的刻度
xlabel('时间t')
title('原调制信号的时域图')
subplot(3,2,2)
plot(t,u(1:length(t)))
axis([-0.1 0.1 -1 1])
xlabel('时间t')
title('已调信号的时域图')
subplot(3,2,3)
plot(f,abs(fftshift(M))) %fftshift:将FFT中的DC分量移到频谱中心
axis([-600 600 0 0.04])
xlabel('频率f')
title('原调制信号的频谱图')
subplot(3,2,4)
plot(f,abs(fftshift(U)))
axis([-600 600 0 0.04])
xlabel('频率f')
title('已调信号的频谱图')
subplot(3,2,5)
plot(t,m(1:length(t)))
axis([-0.1 0.1 -1 1])
xlabel('时间t')
title('原调制信号的时域图')
subplot(3,2,6)
plot(t,dem(1:length(t)))
axis([-0.1 0.1 -1 1])
xlabel('时间t')
title('解调后信号的时域波形')
4.2结果显示
将源代码输入MATLAB命令窗口,运行就可以得到结果,如图5所示: