基于Matlab的QPSK调制解调仿真设计与研究.docx
《基于Matlab的QPSK调制解调仿真设计与研究.docx》由会员分享,可在线阅读,更多相关《基于Matlab的QPSK调制解调仿真设计与研究.docx(24页珍藏版)》请在冰豆网上搜索。
基于Matlab的QPSK调制解调仿真设计与研究
天津理工大学计算机与通信工程学院
通信工程专业设计说明书
基于Matlab/Simulink
的QPSK调制解调仿真设计与研究
姓名韩双年
学号20092226
班级09通信3班
指导老师白媛
日期2012-12-16
摘要
正交相移键控(QPSK),是一种数字调制方式。
QPSK技术具有抗干扰能力好、误码率低、频谱利用效率高等一系列优点。
论文主要介绍了正交相移键控(QPSK)的概况,以及正交相移键控QPSK的调制解调概念和原理,利用Matlab中M文件和Simulink模块对QPSK的调制解调系统进行了仿真,对QPSK在高斯白噪声信道中的性能进行了,分析了解Simulink中涉及到QPSK的各种模块的功能。
【关键词】MatlabQPSKSimulnk仿真
第一章前言
1.1专业设计任务及要求
1了解并掌握QPSK调制与解调的基本原理;
2在通信原理课程的基础上设计与分析简单的通信系统;
3学会利用MATLAB7.0编写程序进行仿真,根据实验结果能分析所设计系统的性能。
4学习MATLAB的基本知识,熟悉MATLAB集成环境下的Simulink的仿真平台。
5利用通信原理相关知识在仿真平台中设计QPSK调制与解调仿真系统并用示波器观察解调后的波形
6在指导老师的指导下,独立完成课程设计的全部内容,能正确的阐述和分析设计和实验结果。
1.2Matlab简介
MATLAB是MATrixLABoratory的缩写,是一款由美国MathWorks公司出品的商业数学软件。
MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。
除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其它语言(包括C,C++和FORTRAN)编写的程序。
尽管MATLAB主要用于数值计算,但是因为大量的额外的工具箱它也适合于不同领域的应用,如控制系统设计与分析、图像处理和信号处理和通信、金融建模和分析等。
除了一个完整的Simulink包,提供了一个可视化的开发环境,通常用于系统仿真、动态/嵌入式系统开发等。
1.3Matlab下的simulink简介
Simulink是MATLAB最重要的组件之一,它提供一个动态系统建模、仿真和综合分析的集成环境。
在该环境中只要通过简单的鼠标操作,就可以构造出复杂的系统。
Simulink提供了一个建立模型方块图的图形用户接口,这个创建过程只需单击和拖动鼠标操作就能完成,它提供了一种更快捷、直接明了的方式,而且用户可以立即看到系统的仿真结果。
Simulink具有适应面广、结构和流程清晰及仿真精细、效率高、贴近实际、等优点,基于以上优点Simulink已被广泛应用于控制理论和数字信号处理的复杂仿真和设计。
同时有大量的第三方软件和硬件应用于Simulink。
1.4通信系统模型
通信系统就是传递信息所需要的一切技术设备和传输媒质的总和,包括信息源、发送设备、信道、接收设备和信宿(受信者),它的一般模型如图1.4.1所示。
图1.4.1通信系统一般模型
模拟通信系统是利用模拟信号来传递消息的通信系统,其模型如图1.4.2所示。
图1.4.2模拟通信系统模型
第二章QPSK调制
2.1QPSK介绍
QuadraturePhaseShiftKeying通过使用载波的四个各不相同的相位差来表示输入的信息,是具有四进制的相移键控。
QPSK是在M=4时的数字的调相技术,它通过约定的四种载波相位,分别为45°,135°,225°,275°,输入数据为二进制的数字序列,因为载波相位是四进制的,所有我们需要把二进制的数据变为四进制的,即把二进制序列中每两个比特分成一组,四种排列组合,即00,01,10,11,双比特码元即为一组。
每两位二进制信息比特构成每一组,它们分别表示着着四个符号中的某一个符号。
2.2QPSK调制原理
QPSK的调制有两种产生方法相乘电路法和选择法。
2.2.1相乘法
输入信号是二进制不归零的双极性码元,它通过“串并变换”电路变成了两路码元。
变成并行码元后,每个码元的持续时间是输入码元的两倍。
用两路正交载波去调制并行码元。
图2.2.1选择法
QPSK的调制中,QPSK信号可以看成是两个载波正交的2PSK信号调制器构成。
原理分析如下:
基本原理和系统结构QPSK与二进制PSK一样,传输信号包含的信息都存在于相位中。
个别的载波相位取四个等间隔值之一,如л/4、3л/4、5л/4、7л/4。
相应的,可将发射信号定义为:
其中,i=1,2,3,4;E是发射信号的每个符号的能量,T为符号的持续时间,载波频率f等于nc/T,nc为固定整数。
每一个可能的相位值对应于一个特定的二位组。
下面介绍QPSK信号的产生和检测。
如图为典型的QPSK发射机框图。
输入的二进制数据序列首先被不归零(NRZ)电平编码转换器转换为极性形式,即负号1和0分别用
和-
表示。
该二进制波形被分接器分成两个分别由输入序列的奇数位偶数位组成的彼此独立的二进制波形,这两个二进制波形分别用a1(t)和a2(t)表示。
此时,在任何一信号时间间隔内a1(t),和a2(t)的幅度恰好分别等于Si1和Si2,即由发送的二位组决定。
这两个二进制波形a1(t)和a2(t)被用来调制一对正交载波:
。
这样就得到一对二进制PSK信号。
和
的正交性使这两个信号可以被独立地检测。
最后,将这两个二进制PSK信号相加,从而得期望的QPSK。
2.2.2选择法
输入基带信号经过串并变换后用于控制一个相位选择电路,按照当时的输入双比特ab,决定选择哪个相位的载波输出。
图2.2.2选择法
2.3QPSK调制原理框图
图2.3调制原理框图
2.4QPSK调制方式的Matlab仿真
I路信号是用余弦载波,由2进制数据流的奇数序列组成;Q路信号用正弦载波,由2进制数据流的偶数序列组成。
下面的a是Idata,b就是Qdata,它们分布与各自的载波相乘分别输出I路信号和Q路信号。
I路信号加上Q路信号就是QPSK输出信号。
当I路载波信号是0相位时为1,是180°相位时为0;当Q路载波信号是0相位时为1,是180°相位时为0。
2.4matlab调制仿真图
2.5QPSK调制方式Matlab-simulink仿真
2.5.1simulink调制建模
图2.5.1调制框图
(1)产生需要的信号源
在搭建QPSK调制解调系统中使用伯努力信号发生器产生随机的01比特序列,每两比特代表就一个符号。
BernoulliBinaryGenerator模块利用伯努利分布的原理,相应得到参数为p的伯努利分布。
伯努利分布的均值1-p和方差p(1–p)的。
一个零概率参数指定p。
本次实验中的p设置为0.5,即0和1等概。
采样时间可根据需要进行设置,例如测误码率时采样时间设为0.01s。
图2.5.2信号源参数设置
(2)串并变换
我们先通过使用buffer这个模块来实现将信号源信号转变为两路信号。
Buffer模块可以重新分配缓冲区块的输入样本,用到了Demux,可以将一个复合输入转化为多个单一输出,即可以输出多个采样率较低的帧信号。
但会产生与缓冲区容量相同的时延。
所以,我们可以设置buffer的参数容量为2。
图2.5.3Buffer的参数设置
(3)单极性信号转化为双极性信号
因为QPSK的调制信号要求的是双极性信号,所以用伯努利随机生成二进制Generator模块产生的信号必须经过转化才能够被使用。
利用加法模块和常数产生模块将1和0的序列各自减去1/2,再利用比例运算模块乘以2,就得到了1和-1的双极性序列。
(4)调制模块
分别将两路信号乘以相位相差的载波,然后相加。
载波由正弦信号发生器产生。
正弦波模块的参数设置为可基于时间的模式,时间设为使用仿真时间,我们设载波信号的幅度为1,载波频率可根据需要来进行设置,两路载波同频正交,相位相差л/2。
我们设上支路的相位为0,下支路的相位为。
图2.5.4上支路载波参数
图2.5.5下支路载波参数
2.5.2simulink调制仿真结果
图2.5.6信号源和转变后的双极性信号
图2.5.7上支路载波
图2.5.8下支路载波
图2.5.9调制信号
第三章QPSK解调
3.1QPSK解调原理
QPSK接收机由一对共输入地相关器组成。
这两个相关器分别提供本地产生地相干参考信号
和
。
相关器接收信号x(t),相关器输出地x1和x2被用来与门限值0进行比较。
如果x1>0,则判决同相信道地输出为符号1;如果x1<0,则判决同相信道的输出为符号0。
如果正交通道也是如此判决输出。
最后同相信道和正交信道输出这两个二进制数据序列被复加器合并,重新得到原始的二进制序列。
在AWGN信道中,判决结果具有最小的负号差错概率。
用两路具有相互正交特性的载波来解调信号,可以分离这两路正交的2PSK信号。
相干解调后,并行码元经过并/串变换后,最终得到串行的数据流。
3.2QPSK解调原理框图
图3.2相干解调原理框图
3.3QPSK解调方式Matlab仿真
正交支路和同相支路分别设置两个相关器(或匹配滤波器),得到I(t)和Q(t),经电平判决和并/串变换后即可恢复原始信息。
I_demo=QPSK_rc_n0.*cos(2*pi*f1*t1);%解调(相干解调,与载波相乘)
Q_demo=QPSK_rc_n0.*sin(2*pi*f1*t1);
I_recover=conv(I_demo,xrc);%低通滤波
Q_recover=conv(Q_demo,xrc);
图3.3matlab解调仿真图
3.4QPSK解调方式的Matlab-simulink仿真
3.4.1QPSK解调建模
首先将从高斯信道送过来的信号分别乘以与调制时的载波同频的载波,且相位相差为л/2的载波。
解调可以使用相关器或者匹配滤波器进行解调,本次实验使用的是相关器,这时信号需要通过设置的积分器。
因为积分器设置为使用积分器时,需要在时间t=T时使得积分器复位,所以需要设置积分模块续设置在时钟下降沿时复位。
并需要设置参数为使用外部信号,此时,时钟设置为与该支路码元时间相同,即是发送信号码元时间的两倍输入。
然后积分后的信号经过采样并保持模块,即sampleandhold模块,此时,设置这个模块为触发上升沿,同样使用时钟设置为与该支路码元时间相同,即是发送信号码元时间的两倍输入。
此时各路传输的信号相应地会使一个单位的时延产生。
然后使用autothreshold模块,该模块根据输入的信号数据自动设置出阀值,由此,可对输入信号做出判定,再输出相应的二进制比特序列,并可输出阀值。
最后使用N-sampleswitch模块来实现并串转换,因为我们最后需要的是最原始的信号,将两路信号合二为一,在第一路信号发出一个样本时间后,样本时间设置为发送信号码元时间,开关会自动转换到第二路信号,此时换做第二路信号输入,一个码元时间后模块重置,如此循环。
同样的,此模块也需要两倍的发送信号码元时间输入。
图3.4.1积分器设置
图3.4.2采样和保持设置
图3.4.3解调模块
3.4.2传输信道
本次实验使用的是高斯信道和理想信道。
实验所需的高斯噪声我们可以由高斯信道模块来提供,用到了Zero-OrderHold,和子模块,即SubSystem,通过子模块建立新的封装(Mask)功能模块其中参数设置中信噪比为Es/No,Es/No为信号能量比噪声功率谱密度。
AWGN信道模块可以将加性高斯白噪声加到一个实数的或复数的输入信号。
现在输入信号是实数,这个模块增加了实数的高斯噪声,产生一个实数的输出信号。
此块继承它的输入信号的采样时间。
模块使用信号处理模块随机产生的噪声。
初始种子可以是一个标量或矢量的长度相匹配的输入信号通道数。
种子的详细资料初次,查看随机源模块库文件参考页面中设置的信号处理。
该端口的数据类型都继承自该驱动器的信号块。
注意权力的所有值假设一个1欧姆的标称阻抗。
图3.4.3高斯信道模块
3.4.3仿真结果
图3.4.4信号源和转变后的双极性信号
图3.4.5经过高斯信道后的调制信号
图3.4.6上支路积分和采样后的信号
图3.4.7上支路判决后的信号
图3.4.8下支路积分和采样后的信号
图3.4.9下支路判决后的信号
图3.4.10源信号流和经过调制解调后的信号流对比
3.5仿真结果分析
从上述图中可以看出,因为整个系统模块有引进噪声,以及电路使用了积分、采样保持模块,还原后的信号幅度差异较大,通过判决门限后,得到原来的二进制信号。
我们从仿真结果图中看出,信道噪声功率谱密度越大,信号信噪比越小,误码率越高,这也符合实际情况。
仿真的各种条件都是理想化的,除了噪声之外不会发生任何错误,和实际情况相比,在相同的信噪比之下,比特错误率理应要小的多,但是仿真所得结果的误码率偏大。
第四章QPSK通信系统性能分析
(1)从仿真结果中看出,信号信噪比越小,错误率越高,跟实际情况比较符合。
(2)由于仿真中各种条件都是理想化的,包括数据在传输过程中,除了噪声影响以外不会发生任何错误,所以相对实际情况来说,在相同信噪比下,比特错误率要小的多,但是仿真所得结果与事实规律并不违背。
总结:
第五章结论
在搭建QPSK调制解调系统中首先遇到的问题就是串并转换问题,simulink中没有可以直接解决这个问题的模块,经过网上的搜索与查阅相关资料,最终选取buffer模块,完成可串并转换的功能,但是带人了两个单位的延迟。
之后便是示波器的显示问题,此次产生的信号采样速率设置为1秒,载波频率1HZ,对仿真过程中的波形分析带来很多的方便。
(3)在完成的QPSK系统的simulink仿真中,由于方便起见,载波大小设为1HZ,与实际的调制解调中所用载波相差甚远,但若将载波设置变大,会对实验仿真和分析带来极大的不便。
参考文献
[1]苗长云,沈保锁.现代通信原理及应用(第2版)[M].北京:
电子工业出版社,2009.
[2]樊昌信,曹丽娜.通信原理(第6版)[M].国防工业出版社,2009.1.
[3]刘国华,李二喜.基于FPGA的QPSK调制器的设计与实现[J].电子设计工程,2011(9).
[4]高博,杨燕,胡建军.基于Matlab的QPSK系统设计仿真[J].科学技术与工程,2010(5)
[5]谢斌,蔡虔,钟文涛.基于MATLAB/SIMULINK的QPSK通信系统仿真[J].科技广场,2006
(1).
附录
(1)QPSK调制M文件程序
clearall
closeall
%x1是类似[11-1-1-1-111]的分布,作用是控制相位的180°反转。
%由于仿真中载波的频率是f=1Hz,所以1s的间隔内有一个完整周期的正弦波。
t=[-1:
0.01:
7-0.01];%t共800个数据,-1~7s
t1=[0:
0.01:
8-0.01];%t1也是800个数据点,0~8s
tt=length(t);%tt=800
x1=ones(1,800);
fori=1:
tt
if(t(i)>=-1&t(i)<=1)|(t(i)>=5&t(i)<=7);
x1(i)=1;
elsex1(i)=-1;
end
end
t2=0:
0.01:
7-0.01;%t2是700个数据点,是QPSK_rc绘图的下标
t3=-1:
0.01:
7.1-0.01;%t3有810个数据点,是i_rc的时间变量
t4=0:
0.01:
8.1-0.01;%t4有810个数据点,是q_rc的时间变量
tt1=length(t1);
x2=ones(1,800);%x2是类似于[11-1-11111]的分布,作用是控制相位的180°反转
fori=1:
tt1
if(t1(i)>=0&t1(i)<=2)|(t1(i)>=4&t1(i)<=8);
x2(i)=1;
elsex2(i)=-1;
end
end
f=0:
0.1:
1;
xrc=0.5+0.5*cos(pi*f);%xrc是一个低通特性的传输函数
y1=conv(x1,xrc)/5.5;%y1和x1实际上没什么区别,仅仅是上升沿、下降沿有点过渡带
y2=conv(x2,xrc)/5.5;%y2和x2实际上没什么区别,仅仅是上升沿、下降沿有点过渡带
n0=randn(size(t2));
f1=1;
i=x1.*cos(2*pi*f1*t);%x1就是Idata
q=x2.*sin(2*pi*f1*t1);%x2就是Qdata
I=i(101:
800);
Q=q(1:
700);
QPSK=sqrt(1/2).*I+sqrt(1/2).*Q;
QPSK_n=(sqrt(1/2).*I+sqrt(1/2).*Q)+n0;
n1=randn(size(t2));
i_rc=y1.*cos(2*pi*f1*t3);%y1就是Idata,i_rc可能是贴近实际的波形,i则是理想波形
q_rc=y2.*sin(2*pi*f1*t4);%y2就是Qdata,q_rc可能是贴近实际的波形,q则是理想波形
I_rc=i_rc(101:
800);
Q_rc=q_rc(1:
700);
QPSK_rc=(sqrt(1/2).*I_rc+sqrt(1/2).*Q_rc);
QPSK_rc_n1=QPSK_rc+n1;
figure
(1)
subplot(3,1,1);plot(t3,i_rc);axis([-18-11]);ylabel('a序列');
subplot(3,1,2);plot(t4,q_rc);axis([-18-11]);ylabel('b序列');
subplot(3,1,3);plot(t2,QPSK_rc);axis([-18-11]);ylabel('合成序列');
(2)QPSK解调M文件程序
clearall
closeall
bit_in=randint(1e3,1,[01]);
bit_I=bit_in(1:
2:
1e3);%bit_I为”奇数序列”,奇数序列是同相分量,以cos为载波
bit_Q=bit_in(2:
2:
1e3);%bit_Q是bit_in的所有偶数下标组成的”偶数序列”,以sin为载波
data_I=-2*bit_I+1;%将bit_I中的1变成-1,0变成1;注意data_I是500点
data_Q=-2*bit_Q+1;%将bit_Q中的1变成-1,0变成1
data_I1=repmat(data_I',20,1);%将500行的列向量data_I的共轭转置data_I’复制为20*500的矩阵,20行数据是相同的。
data_Q1=repmat(data_Q',20,1);
fori=1:
1e4%data_I2是将data_I1这个20*500的矩阵拉长为1*10000的行向量
data_I2(i)=data_I1(i);
data_Q2(i)=data_Q1(i);
end;
f=0:
0.1:
1;
xrc=0.5+0.5*cos(pi*f);
data_I2_rc=conv(data_I2,xrc)/5.5;%data_I2_rc就是Idata
data_Q2_rc=conv(data_Q2,xrc)/5.5;%data_Q2_rc就是Qdata
f1=1;
t1=0:
0.1:
1e3+0.9;%10010个数据,长度和data_I2_rc以及data_Q2_rc相同
n0=rand(size(t1));%n0是1*10010的均匀分布的噪声
I_rc=data_I2_rc.*cos(2*pi*f1*t1);
Q_rc=data_Q2_rc.*sin(2*pi*f1*t1);
QPSK_rc=(sqrt(1/2).*I_rc+sqrt(1/2).*Q_rc);
QPSK_rc_n0=QPSK_rc+n0;
I_demo=QPSK_rc_n0.*cos(2*pi*f1*t1);%解调(相干解调,与载波相乘)
Q_demo=QPSK_rc_n0.*sin(2*pi*f1*t1);
I_recover=conv(I_demo,xrc);%低通滤波
Q_recover=conv(Q_demo,xrc);
I=I_recover(11:
10010);
Q=Q_recover(11:
10010);
t2=0:
0.05:
1e3-0.05;%t2有20000个点
t3=0:
0.1:
1e3-0.1;%t3有10000个点
data_recover=[];%抽样判决
fori=1:
20:
10000%data_recover是待判决的20000点
data_recover=[data_recoverI(i:
1:
i+19)Q(i:
1:
i+19)];
end;
bit_recover=[];
fori=1:
20:
20000
ifsum(data_recover(i:
i+19))>0%20点为同一个值,20点数据叠加后与阈值0比较
data_recover_a(i:
i+19)=1;%data_recover_a是并/串转换后的20000点
bit_recover=[bit_recover1];%bit_recover是1000点数据
else
data_recover_a(i:
i+19)=-1;
bit_recover=[bit_recover-1];
end
end
error=0;
dd=-2*bit_in+1;%将bit_in中的1变成-1,0变成1
ddd=[dd'];%ddd是1表示0,-1表示1的原始序列,1000个点
ddd1=repmat(ddd,20,1);%ddd1是20*1000的矩阵
fori=1:
2e4
ddd2(i)=ddd1(i);%将ddd1拉直为1*20000的行向量ddd2
end
fori=1:
1e3
ifbit_recover(i)~=ddd(i)
error=error+1;
end
end
p=error/1000;
figure
(1)
subplot(4,1,1);plot(t2,ddd2);axis([0100-22]);title('原序列');
subplot(4,1,2);plot(t1,I_demo);axis([0100-22]);title('I支路解调');
subplot(4,1,3);plot(t1,Q_demo);axis([0100-22]);title('Q支路解调');
subplot(4,1,4);plot(t2,data_recover_a);axis([0100-22]);title('解调后序列');