1、基于 MATLAB 的 QPSK 仿真设计与实现一.前言1.1QPSK系统的应用背景简介QPSK是英文 Quadrature Phase Shift Keying的缩略语简称,意为正交相移键控,是一种数字调制方式。在 19世纪 80年代初期,人们选用恒定包络数字调制。这类数字调制技术的优点是已调信号具有相对窄的功率谱和对放大设备没有线性要求,不足之处是其频谱利用率低于线性调制技术。19 世纪 80年代中期以后,四相绝对移相键控(QPSK)技术以其抗干扰性能强、误码性能好、频谱利用率高等优点,广泛应用于数字微波通信系统、数字卫星通信系统、宽带接入、移动通信及有线电视系统之中。1.2 QPSK实验
2、仿真的意义通过完成设计内容, 复习QPSK调制解调的基本原理,同时也要复习通信系统的主要组成部分,了解调制解调方式中最基础的方法。了解QPSK的实现方法及数学原理。并对“通信”这个概念有个整体的理解,学习数字调制中误码率测试的标准及计算方法。同时还要复习随机信号中时域用自相关函数,频域用功率谱密度来描述平稳随机过程的特性等基础知识,来理解高斯信道中噪声的表示方法,以便在编程中使用。 理解QPSK调制解调的基本原理,并使用MATLAB编程实现QPSK信号在高斯信道和瑞利衰落信道下传输,以及该方式的误码率测试。复习MATLAB编程的基础知识和编程的常用算法以及使用MATLAB仿真系统的注意事项,并
3、锻炼自己的编程能力,通过编程完成QPSK调制解调系统的仿真,以及误码率测试,并得出响应波形。在完成要求任务的条件下,尝试优化程序。通过本次实验,除了和队友培养了默契学到了知识之外,还可以将次实验作为一种推广,让更多的学生来深入一层的了解QPSK以至其他调制方式的原理和实现方法。可以方便学生进行测试和对比。足不出户便可以做实验。1.3 实验平台和实验内容1.3.1实验平台本实验是基于 Matlab的软件仿真,只需 PC机上安装 MATLAB 6.0或者以上版本即可。(本实验附带基于 Matlab Simulink (模块化)仿真,如需使用必须安装simulink 模块)1.3.2实验内容1.构建
4、一个理想信道基本 QPSK仿真系统,要求仿真结果有a.基带输入波形及其功率谱 b.QPSK信号及其功率谱 c.QPSK信号星座图 2.构建一个在 AWGN(高斯白噪声)信道条件下的 QPSK仿真系统,要求仿真结果有a.QPSK信号及其功率谱 b.QPSK信号星座图c.高斯白噪声信道条件下的误码性能以及高斯白噪声的理论曲线,要求所有误码性能曲线在同一坐标比例下绘制3验可选做扩展内容要求:构建一个先经过 Rayleigh(瑞利衰落信道) ,再通过 AWGN(高斯白噪声)信道条件下的条件下的 QPSK仿真系统,要求仿真结果有a.QPSK信号及其功率谱 b.通过瑞利衰落信道之前和之后的信号星座图,前后
5、进行比较c.在瑞利衰落信道和在高斯白噪声条件下的误码性能曲线,并和二.2.c 中所要求的误码性能曲线在同一坐标比例下绘制二、系统实现框图和分析2.1、QPSK 调制部分,原理框图如图 1 所示1(t)2cos()cftT极性 NRZ电平编码器分离器 2(t) sin(2)cftT图 1原理分析:基本原理及系统结构QPSK与二进制 PSK一样,传输信号包含的信息都存在于相位中。的别的载波相位取四个等间隔值之一,如 /4, 3/4,5/4,和 7/4。相应的,可将发射信号定义为0tT2/cos2(1)/4Etfti二进制数据序列QPSK信号s(t)Si(t) 0。 , 其他其中,i1,2,2,4;
6、E 为发射信号的每个符号的能量,T 为符号持续时间,载波频率 f等于 nc/T,nc 为固定整数。每一个可能的相位值对应于一个特定的二位组。例如,可用前述的一组相位值来表示格雷码的一组二位组:10,00,01,11。下面介绍 QPSK信号的产生和检测。如果 a为典型的 QPSK发射机框图。输入的二进制数据序列首先被不归零(NRZ)电平编码转换器转换为极性形式,即负号1和 0分别用 和 表示。接着,该二进制波形被分接器分成两个分别bEb由输入序列的奇数位偶数位组成的彼此独立的二进制波形,这两个二进制波形分别用 a1(t) ,和 a2(t)表示。容易注意到,在任何一信号时间间隔内a1(t) ,和
7、a2(t)的幅度恰好分别等于 Si1和 Si2,即由发送的二位组决定。这两个二进制波形 a1(t) ,和 a2(t)被用来调制一对正交载波或者说正交基本函数: 1(t) , 2(t) 。这样就得到2cos()cfTsin(2)cftT一对二进制 PSK信号。 1(t)和 2(t)的正交性使这两个信号可以被独立地检测。最后,将这两个二进制 PSK信号相加,从而得期望的 QPSK。2.2、QPSK 解调部分,原理框图如图 2所示:1(t) 同相信道 门限0判决门限低通 filrer 判决门限复接器接收信 号x(t)低通 filrer2(t) 正交信道 门限0 图 2原理分析:发送二进制序列的估计Q
8、PSK接收机由一对共输入地相关器组成。这两个相关器分别提供本地产生地相干参考信号 1(t)和 2(t) 。相关器接收信号 x(t) ,相关器输出地 x1和 x2被用来与门限值 0进行比较。如果 x10,则判决同相信道地输出为符号1;如果 x10.5; % 调用一个随机函数(0 or 1) ,输出到一个 1*100 的矩阵datanrz=data.*2-1; % 变成极性码data1=zeros(1,nb/delta_T); % 创建一个 1*nb/delta_T 的零矩阵for q=1:nbdata1(q-1)/delta_T+1:q/delta_T)=datanrz(q); % 将极性码变成
9、对应的波形信号end % 将基带信号变换成对应波形信号data0=zeros(1,nb/delta_T); % 创建一个 1*nb/delta_T 的零矩阵for q=1:nbdata0(q-1)/delta_T+1:q/delta_T)=data(q); % 将极性码变成对应的波形信号end % 发射的信号data2=abs(fft(data1);% 串并转换,将奇偶位数据分开idata=datanrz(1:ml:(nb-1); % 将奇偶位分开,因此间隔 m1 为 2 qdata=datanrz(2:ml:nb);% QPSK 信号的调制ich=zeros(1,nb/delta_T/2);
10、 % 创建一个 1*nb/delta_T/2 的零矩阵,以便后面存放奇偶位数据for i=1:nb/2ich(i-1)/delta_T+1:i/delta_T)=idata(i);endfor ii=1:N/2a(ii)=sqrt(2/T)*cos(2*pi*fc*t(ii); endidata1=ich.*a; % 奇数位数据与余弦函数相乘,得到一路的调制信号qch=zeros(1,nb/2/delta_T);for j1=1:nb/2qch(j1-1)/delta_T+1:j1/delta_T)=qdata(j1);endfor jj=1:N/2b(jj)=sqrt(2/T)*sin(2*
11、pi*fc*t(jj);endqdata1=qch.*b; % 偶数位数据与余弦函数相乘,得到另一路的调制信号s=idata1+qdata1; % 将奇偶位数据合并,s 即为 QPSK 调制信号ss=abs(fft(s); % 快速傅里叶变换得到频谱% 瑞利衰落信道和高斯信道% 瑞利衰落信道ray_ich=raylrnd(0.8,1,nb/2/delta_T);ray_qch=raylrnd(0.8,1,nb/2/delta_T);Ray_idata=idata1.*ray_ich;Ray_qdata=qdata1.*ray_qch;Ray_s=Ray_idata+Ray_qdata;% 高斯
12、信道 s1=awgn(s,SNR); % 通过高斯信道之后的信号s11=abs(fft(s1); % 快速傅里叶变换得到频谱 s111=s1-s; % 高斯噪声曲线%Awgn_s=awgn(Ray_s,SNR); % 通过高斯信道再通过瑞利衰落信道% QPSK 解调部分% 解调部分(高斯信道)idata2=s1.*a; % 这里面其实隐藏了一个串并转换的过程qdata2=s1.*b; % 对应的信号与正余弦信号相乘idata3=zeros(1,nb/2); % 建立 1*nb 数组,以存放解调之后的信号qdata3=zeros(1,nb/2);% 抽样判决的过程,与 0 作比较, data=0
13、,则置 1,否则置 0for n=1:nb/2% A1(n)=sum(idata2(n-1)/delta_T+1:n/delta_T);if sum(idata2(n-1)/delta_T+1:n/delta_T)=0idata3(n)=1;else idata3(n)=0; end% A2(n)=sum(qdata2(n-1)/delta_T+1:n/delta_T);if sum(qdata2(n-1)/delta_T+1:n/delta_T)=0qdata3(n)=1;else qdata3(n)=0;endend % 为了显示星座图,将信号进行处理idata4=zeros(1,nb/2
14、);qdata4=zeros(1,nb/2);for n=1:nb/2Awgn_ichsum(n)=sum(idata2(n-1)/delta_T+1:n/delta_T)*delta_T;if Awgn_ichsum(n)=0idata4(n)=1;else idata4(n)=0;endAwgn_qchsum(n)=sum(qdata2(n-1)/delta_T+1:n/delta_T)*delta_T;if Awgn_qchsum(n)=0qdata4(n)=1;else qdata4(n)=0;endend% 将判决之后的数据存放进数组demodata=zeros(1,nb);demo
15、data(1:ml:(nb-1)=idata3; % 存放奇数位demodata(2:ml:nb)=qdata3; % 存放偶数位%为了显示,将它变成波形信号(即传输一个 1 代表单位宽度的高电平)demodata1=zeros(1,nb/delta_T); % 创建一个 1*nb/delta_T 的零矩阵for q=1:nbdemodata1(q-1)/delta_T+1:q/delta_T)=demodata(q); % 将极性码变成对应的波形信号end % 累计误码数% abs(demodata-data)求接收端和发射端% 数据差的绝对值,累计之后就是误码个数Awgn_num_BER=
16、sum(abs(demodata-data) % 解调部分(瑞利+高斯)Ray_idata2=Ray_s.*a; % 这里面其实隐藏了一个串并转换的过程Ray_qdata2=Ray_s.*b; % 对应的信号与正余弦信号相乘% Ray_idata3=zeros(1,nb/2); % 建立 1*nb 数组,以存放解调之后的信号% Ray_qdata3=zeros(1,nb/2);% 抽样判决的过程,与 0 作比较, data=0,则置 1,否则置 0% for n=1:nb/2% if Ray_sum(Ray_idata2(n-1)/delta_T+1:n/delta_T)=0% Ray_ida
17、ta3(n)=1;% else Ray_idata3(n)=0; % end% if Ray_sum(Ray_qdata2(n-1)/delta_T+1:n/delta_T)=0% Ray_qdata3(n)=1;% else Ray_qdata3(n)=0;% end% end % 为了显示星座图,将信号进行处理Ray_idata4=zeros(1,nb/2);Ray_qdata4=zeros(1,nb/2);for n=1:nb/2Ray_ichsum(n)=sum(idata2(n-1)/delta_T+1:n/delta_T)*delta_T;if Ray_ichsum(n)=0Ray
18、_idata4(n)=1;else Ray_idata4(n)=0;endRay_qchsum(n)=sum(qdata2(n-1)/delta_T+1:n/delta_T)*delta_T;if Ray_qchsum(n)=0Ray_qdata4(n)=1;else Ray_qdata4(n)=0;endend % 将判决之后的数据存放进数组Ray_demodata=zeros(1,nb);Ray_demodata(1:ml:(nb-1)=Ray_idata4; % 存放奇数位Ray_demodata(2:ml:nb)=Ray_qdata4; % 存放偶数位%为了显示,将它变成波形信号(即传
19、输一个 1 代表单位宽度的高电平)Ray_demodata1=zeros(1,nb/delta_T); % 创建一个 1*nb/delta_T 的零矩阵for q=1:nbRay_demodata1(q-1)/delta_T+1:q/delta_T)=Ray_demodata(q); % 将极性码变成对应的波形信号end % 累计误码数% abs(demodata-data)求接收端和发射端% 数据差的绝对值,累计之后就是误码个数Ray_num_BER=sum(abs(Ray_demodata-data) % % 误码率计算% 调用了 cm_sm32();和 cm_sm33()函数%声明: 函
20、数声明在另外俩个 M 文件中%作用: cm_sm32()用于瑞利信道误码率的计算% cm_sm33()用于高斯信道误码率的计算% ecoh on/off 作用在于决定是否显示指令内容%SNRindB1=0:1:6;SNRindB2=0:0.1:6;% 瑞利衰落信道 for i=1:length(SNRindB1),pb,ps=cm_sm32(SNRindB1(i); % 比特误码率smld_bit_ray_err_prb(i)=pb;smld_symbol_ray_err_prb(i)=ps;disp(ps,pb);echo off; end;% 高斯信道 echo on;for i=1:le
21、ngth(SNRindB1),pb1,ps1=cm_sm33(SNRindB1(i); smld_bit_awgn_err_prb(i)=pb1;smld_symbol_awgn_err_prb(i)=ps1;disp(ps1,pb1);echo off;end;% 理论曲线echo on;for i=1:length(SNRindB2),SNR=exp(SNRindB2(i)*log(10)/10); % 信噪比theo_err_awgn_prb(i)=0.5*erfc(sqrt(SNR); % 高斯噪声理论误码率theo_err_ray_prb(i)=0.5*(1-1/sqrt(1+1/S
22、NR); % 瑞利衰落信道理论误码率echo off;end;%h = spectrum.welch; % 类似于 C 语言的宏定义,方便以下的调用 % 输出显示部分% 第一部分(理想)figure(1)subplot(3,2,1);plot(data0),title(基带信号);axis(0 20000 -2 2);subplot(3,2,2);psd(h,data1,fs,fs),title(基带信号功率谱密度 );subplot(3,2,3);plot(s),title(调制信号);axis(0 500 -3 3);subplot(3,2,4);psd(h,s,fs,fs),title(
23、调制信号功率谱密度 );subplot(3,2,5);plot(demodata1),title(解调输出);axis(0 20000 -2 2);subplot(3,2,6);psd(h,demodata1,fs,fs),title(解调输出功率谱密度);% 通过高斯信道figure(2)subplot(2,2,1);plot(s1),title(调制信号(Awgn);axis(0 500 -5 5);subplot(2,2,2);psd(h,s1,fs,fs),title(调制信号功率谱密度 (Awgn);subplot(2,2,3);plot(s111),title(高斯噪声曲线);ax
24、is(0 2000 -5 5);subplot(2,2,4);for i=1:nb/2plot(idata(i),qdata(i),r+),title(QPSK 信号星座图(Awgn));hold on;axis(-2 2 -2 2);plot(Awgn_ichsum(i),Awgn_qchsum(i),*);hold on;legend(理论值(发射端), 实际值(接收端));end%通过高斯信道再通过瑞利衰落信道figure(3) subplot(2,2,1)plot(Ray_s),title(调制信号(Ray+Awgn);axis(0 500 -5 5);subplot(2,2,2);p
25、sd(h,Ray_s,fs,fs),title(调制信号功率谱密度(Ray);subplot(2,2,3);for i=1:nb/2plot(idata(i),qdata(i),r+),title(QPSK 信号星座图(Awgn+Ray));hold on;axis(-2 2 -2 2);plot(Ray_ichsum(i),Ray_qchsum(i),*);hold on;legend(理论值(发射端), 实际值(接收端));endsubplot(2,2,4)semilogy(SNRindB2,theo_err_awgn_prb,r),title(误码率曲线);hold on;semilog
26、y(SNRindB1,smld_bit_awgn_err_prb,r*);hold on;semilogy(SNRindB2,theo_err_ray_prb);hold on;semilogy(SNRindB1,smld_bit_ray_err_prb,*);xlabel(Eb/No);ylabel(BER);legend(理论 AWGN,仿真 AWGN,理论 Rayleigh,仿真 Rayleigh);%文件 2function pb,ps=cm_sm32(snr_in_dB)% pb,ps=cm_sm32(snr_in_dB)% CM_SM3 finds the probability
27、of bit error and symbol error for % the given value of snr_in_dB, signal to noise ratio in dB.N=100;E=1; % energy per symbolnumofsymbolerror=0;numofbiterror=0;counter=0;snr=10(snr_in_dB/10); % signal to noise ratiosgma=sqrt(E/snr)/2; % noise variances00=1 0; s01=0 1; s11=-1 0; s10=0 -1; % signal map
28、ping% generation of the data sourcewhile(numofbiterror100)for i=1:N,temp=rand; % a uniform random variable between 0 and 1if (temp0.25), % with probability 1/4, source output is “00“dsource1(i)=0; dsource2(i)=0;elseif (temp0.5), % with probability 1/4, source output is “01“dsource1(i)=0; dsource2(i)
29、=1;elseif (temp0.75), % with probability 1/4, source output is “10“dsource1(i)=1; dsource2(i)=0;else % with probability 1/4, source output is “11“dsource1(i)=1; dsource2(i)=1;end;end;% detection and the probability of error calculationfor i=1:N,ray=raylrnd(0.8);n=sgma*randn(1,2); % 2 normal distribu
30、ted r.v with 0, variance sgmaif (dsource1(i)=0) elseif (dsource1(i)=0) elseif (dsource1(i)=1) else r=s11*ray+n;end;% The correlation metrics are computed belowc00=dot(r,s00); c01=dot(r,s01); c10=dot(r,s10); c11=dot(r,s11);% The decision on the ith symbol is made nextc_max=max(c00,c01,c10,c11);if (c0
31、0=c_max), decis1=0; decis2=0;elseif (c01=c_max), decis1=0; decis2=1;elseif (c10=c_max), decis1=1; decis2=0;else decis1=1; decis2=1;end;% Increment the error counter, if the decision is not correctsymbolerror=0;if (decis1=dsource1(i), numofbiterror=numofbiterror+1; symbolerror=1; end;if (decis2=dsour
32、ce2(i), numofbiterror=numofbiterror+1; symbolerror=1; end;if (symbolerror=1), numofsymbolerror=numofsymbolerror+1; end;endcounter=counter+1;endps=numofsymbolerror/(N*counter); % since there are totally N symbolspb=numofbiterror/(2*N*counter); % since 2N bits are transmitted %文件 3function pb1,ps1=cm_
33、sm32(snr_in_dB)% pb,ps=cm_sm32(snr_in_dB)% CM_SM3 finds the probability of bit error and symbol error for % the given value of snr_in_dB, signal to noise ratio in dB.N=100;E=1; % energy per symbolsnr=10(snr_in_dB/10); % signal to noise ratiosgma=sqrt(E/snr)/2; % noise variances00=1 0; s01=0 1; s11=-
34、1 0; s10=0 -1; % signal mapping% generation of the data sourcenumofsymbolerror=0;numofbiterror=0;counter=0;while(numofbiterror100)for i=1:N,temp=rand; % a uniform random variable between 0 and 1if (temp0.25), % with probability 1/4, source output is “00“dsource1(i)=0; dsource2(i)=0;elseif (temp0.5),
35、 % with probability 1/4, source output is “01“dsource1(i)=0; dsource2(i)=1;elseif (temp0.75), % with probability 1/4, source output is “10“dsource1(i)=1; dsource2(i)=0;else % with probability 1/4, source output is “11“dsource1(i)=1; dsource2(i)=1;end;end;% detection and the probability of error calc
36、ulationfor i=1:N,% the received signal at the detection, for the ith symbol,is:n=sgma*randn(1,2); % 2 normal distributed r.v with 0, variance sgmaif (dsource1(i)=0) elseif (dsource1(i)=0) elseif (dsource1(i)=1) else r=s11+n;end;% The correlation metrics are computed belowc00=dot(r,s00); c01=dot(r,s0
37、1); c10=dot(r,s10); c11=dot(r,s11);% The decision on the ith symbol is made nextc_max=max(c00,c01,c10,c11);if (c00=c_max), decis1=0; decis2=0;elseif (c01=c_max), decis1=0; decis2=1;elseif (c10=c_max), decis1=1; decis2=0;else decis1=1; decis2=1;end;% Increment the error counter, if the decision is no
38、t correctsymbolerror=0;if (decis1=dsource1(i), numofbiterror=numofbiterror+1; symbolerror=1; end;if (decis2=dsource2(i), numofbiterror=numofbiterror+1; symbolerror=1; end;if (symbolerror=1), numofsymbolerror=numofsymbolerror+1; end;endcounter=counter+1;endps1=numofsymbolerror/(N*counter); % since there are totally N symbolspb1=numofbiterror/(2*N*counter); % since 2N bits are transmitted