16QAM和16PSK信号的MATLAB仿真及性能对比于丹,李亚儒一.16QAM信号M进制正交幅度调制信号(MPSK)是由两个正交载波的多电平振幅键控信号叠加而成的,它与MPSK信号的不同之处在于两个支路的多电平幅度序列是相互独立的。发送机原理图:接收机原理图:16QAM信号的仿真过程:1.产生一个随机的二进制的比特流。利用randint函数产生代表原始信号的二进制比特序列,此处比特流的长度设为100000,并画出前50个比特的信号图:2.将二进制比特流转换成对应的十六进制信号MATLAB中的16QAM调制器要求输入的信号为0-15这16个值,因此需要将原始的二进制比特流每4个比特转换为相应的16个值,这一步中用到的函数主要包括reshape和bi2de。3.用16QAM调制器对信号进行调制并画出信号的星座图利用modem.qammod函数生成16QAM调制器,并对上一步生成的信号进行调制。4.在16QAM信号中加入高斯白噪声信号通过awgn信道之后相当于在信号上加入了高斯白噪声,这一步假设Eb/No=15db。5.画出通过信道之后接收信号的星座图利用scatterplot函数画出信号的星座图。6.生成信号眼图利用eyediagram函数画出经过信道之后接收信号的眼图。7.16QAM信号的解调利用demodulate和modem.qamdemod函数生成解调器,对接收到的信号进行解调,并将16进制信号转化成二进制比特流信息。8.计算误码率将最终得到的比特流信息和原始发送的比特流信息进行对比,最终计算出误码率。相应的MATLAB程序代码如下M=16;k=log2(M);n=100000;%比特序列长度samp=1;%过采样率x=randint(n,1);%生成随机二进制比特流stem(x(1:50),'filled');%画出相应的二进制比特流信号title('二进制随机比特流');xlabel('比特序列');ylabel('信号幅度');x4=reshape(x,k,length(x)/k);%将原始的二进制比特序列每4个一组分组,并排列成k行length(x)/k列的矩阵xsym=bi2de(x4,'left-msb');%将矩阵转化为相应的16进制信号序列figure;stem(xsym(1:50));%画出相应的16进制信号序列title('16进制随机信号');xlabel('信号序列');ylabel('信号幅度');y=modulate(modem.qammod(M),xsym);%用16QAM调制器对信号进行调制scatterplot(y);%画出16QAM信号的星座图text(real(y)+0.1,imag(y),dec2bin(xsym));axis([-55-55]);EbNo=15;%假设Eb/No=15db;snr=EbNo+10*log10(k)-10*log10(nsamp);%信噪比yn=awgn(y,snr,'measured');%加入高斯白噪声h=scatterplot(yn,nsamp,0,'b.');%经过信道后接收到的含白噪声的信号星座图holdon;scatterplot(y,1,0,'k+',h);%加入不含白噪声的信号星座图title('接收信号星座图');legend('含噪声接收信号','不含噪声信号');axis([-55-55]);holdoff;eyediagram(yn,2);%眼图yd=demodulate(modem.qamdemod(M),yn);%此时解调出来的是16进制信号z=de2bi(yd,'left-msb');%转化为对应的二进制比特流z=reshape(z.',numel(z),1);[number_of_errors,bit_error_rate]=biterr(x,z)%计算误码率程序运行结果如下:number_of_errors=0bit_error_rate=0图1-1图1-2图1-3图1-4图1-5二.16PSK信号多进制相位键控MPSK是利用载波的相位变化来传递信息的调制方式。发送机原理图:16PSK接收机原理图:16PSK信号的仿真:16PSK信号的仿真过程与16QAM类似,基本流程是相同的,如下所述:1.产生一个随机的二进制的比特流。2.将二进制比特流转换成对应的十六进制信号。3.用16PSK调制器对信号进行调制并画出信号的星座图。4.在16PSK信号中加入高斯白噪声。5.画出通过信道之后接收信号的星座图。6.生成信号眼图。7.16PSK信号的解调。8.计算误码率。仿真过程中所使用的为16PSK调制器和16PSK解调器,并且为了更好的与16QAM信号的调制解调进行对比,在用MATLAB代码实现仿真的时候最好是利用16QAM仿真过程中生成的二进制比特流。这样,使用相同的信号源进行仿真得出的结果更具有对比性。相应的MATLAB程序代码如下:stem(x(1:50),'filled');%随机二进制比特流直接采用16QAM中生成的比特流title('二进制随机比特流');xlabel('比特序列');ylabel('信号幅度');x4=reshape(x,k,length(x)/k);%将原始的二进制比特序列每4个一组分组,并排列成k行length(x)/k列的矩阵xsym=bi2de(x4.’,'left-msb');%将矩阵转化为相应的16进制信号序列figure;stem(xsym(1:50));%画出相应的16进制信号序列title('16进制随机信号');xlabel('信号序列');ylabel('信号幅度');y=modulate(modem.pskmod(M),xsym);%用16PSK调制器对信号进行调制scatterplot(y);%画出16PSK信号的星座图text(real(y)+0.1,imag(y),dec2bin(xsym));axis([-55-55]);EbNo=15;%假设Eb/No=15db;snr=EbNo+10*log10(k)-10*log10(nsamp);%信噪比yn=awgn(y,snr,'measured');%加入高斯白噪声h=scatterplot(yn,nsamp,0,'b.');%经过信道后接收到的含白噪声的信号星座图holdon;scatterplot(y,1,0,'k+',h);%加入不含白噪声的信号星座图title('接收信号星座图');legend('含噪声接收信号','不含噪声信号');axis([-55-55]);holdoff;eyediagram(yn,2);%眼图yd=demodulate(modem.pskdemod(M),yn);%此时解调出来的是16进制信号z=de2bi(yd,'left-msb');%转化为对应的二进制比特流z=reshape(z.',numel(z),1);[number_of_errors,bit_error_rate]=biterr(x,z)%计算误码率程序运行结果如下:number_of_errors=121bit_error_rate=0.0012图2-1图2-2图2-3图2-4图2-5三.综合分析:在对相同的二进制信息比特流进行调制解调仿真的过程中,我们设定两种调制方式下都有Eb/No=15db,在这两个前提条件下,我们来比较16QAM和16PSK调制方式的性能优劣。首先看仿真的误码率结果,16QAM的误码率为0,而16PSK的误码率为0.0012,显然16QAM的误码性能优于16PSK调制信号。而事实上在我们仿真的过程中当设定Eb/No=13db时16QAM的误码率已经为零了。其次看两种调制方式仿真的星座图,图1-4和图2-4,从图中明显可以看出16QAM信号相邻两个信号的距离大于16PSK相邻两信号之间的距离。再次看两种调制方式的眼图,由仿真图1-5和图2-5明显可以看出16QAM信号的眼图优于16PSK的眼图,在图中可以看出当Eb/No=15db时16QAM信号的眼图还比较清晰,性能比较好。而16PSK信号的眼图基本闭合,性能不良。带宽利用率方面,在相同的二进制信息比特流的情况下,16QAM和16PSK信号的带宽利用率相同,均为2/)(log2M。综上所述,16QAM信号的总体性能明显优于16PSK信号。补充:本组成员包括于丹和李亚儒,本实验是我们两个人共同合作完成的结果。我们两人之前基本没有使用过MATLAB,从学习MATLAB到查找通信资料,到查找以及使用相关的通信工具函数,最终能完成本次实验与我们良好的沟通与合作是分不开的。MATLAB代码的编写是两人讨论完成的,其中16QAM部分主要由于丹编写,16PSK部分主要由李亚儒编写,并且于丹负责完成本次实验报告的初稿,李亚儒负责最后的修订补充。