量,根据最大后验概率(MAP)准则(由于各个信号的先验概率相等,所以页可以认为是最大似然准则),得到了最小距离检测。具体在本仿真系统中,判断为各个信号的门限如表2所示。判决后得到的数据再按照格雷码的规则还原成0、1信号,最终将两路0、1信号合成一路0、1信号,用来同最初的信号一起决定误码率。
表2 判决电平对应表
判决前的信号的幅度 对应的判决后的幅度 -3 -1 1 3 A??2 ?2?A?0 0?A?2 A?2 源代码如下
function y=demodulate_sig(x1,x2) %对x1路信号进行判决 xx1(find(x1>=2))=3;
xx1(find((x1<2)&(x1>=0)))=1; xx1(find((x1>=-2)&(x1<0)))=-1; xx1(find(x1<-2))=-3; %对x2路信号进行判决 xx2(find(x2>=2))=3;
xx2(find((x2<2)&(x2>=0)))=1; xx2(find((x2>=-2)&(x2<0)))=-1; xx2(find(x2<-2))=-3;
%将x1路信号按格雷码规则还原成0、1信号 temp1=zeros(1,length(xx1)*2); temp1(find(xx1==-1)*2)=1; temp1(find(xx1==1)*2-1)=1; temp1(find(xx1==1)*2)=1; temp1(find(xx1==3)*2-1)=1;
%将x2路信号按格雷码规则还原成0、1信号 temp2=zeros(1,length(xx2)*2); temp2(find(xx2==-1)*2)=1; temp2(find(xx2==1)*2-1)=1; temp2(find(xx2==1)*2)=1; temp2(find(xx2==3)*2-1)=1; %将两路0、1信号合成一路 y=zeros(1,length(temp1)*2); y(1:2:length(y))=temp1; y(2:2:length(y))=temp2;
误码率曲线
将解调后的数据同原始数据相比较,得到该信噪比下所对应的误码率。为了得到误码率曲线,需要得到在不同的信噪比下的误码率。在仿真的过程中,假设要得到一个值得信赖的误码率数据点,至少需要在最后的数据比较的过程中得到100个错误,那么参与仿真的数据点就应该是误码率的倒数乘以100,为了提高程序的效率,首先计算出某个信噪比对应的理论的误码率,然后估计出待仿真的点数。
对于16QAM信号星座图等效为在两个正交载波上的两个PAM信号,其中每一个具有4个信号点。因为在解调器中可以将相位正交的两个信号分量完全分开,所以QAM的错误概率可以由PAM的错误概率求得。16QAM系统的正确判决概率是
Pc?(1?P4)2
式中,P4是4元PAM的错误概率,在等效QAM系统的每一个正交信号中,4元PAM具有一半的平均功率,通过适当的修改4元PAM的错误概率,可以得到
13P4?2(1?)Q(SNRs)
415其中SNRs是平均符号SNR。因此,16QAM的错误概率是
Pe?1?(1?P4)2
具体的源代码如下:
clear;
%用来仿真QAM的误bit率 snr=1:1:11;
%先来计算理论误bit率
error_theory=(1-(1-(2*(1-1/sqrt(16))*1/2*erfc(1/sqrt(2)*sqrt(3*4*10.^(snr/10)/(16-1))))).^2)/4; %用理论的误bit率来决定需要仿真的点数 N=floor(1./error_theory)*1000+100; N(find(N<5000))=5000; %开始仿真 global p;
for i=1:length(N);
%首先产生随机二进制序列
source=randsrc(1,N(i),[1,0;p,1-p]);
%对产生的二进制序列进行QAM调制
[source1,source2]=Qam_modulation(source); %插值
sig_insert1=insert_value(source1,8); sig_insert2=insert_value(source2,8);
[source1,source2]=rise_cos(sig_insert1,sig_insert2,0.25,2); %====将滤波后的信号加入高斯白噪声
[x1,x2]=generate_noise(source1',source2',snr(i)); %[x1,x2]=generate_noise(source1,source2,snr(i)); sig_noise1=x1'; sig_noise2=x2';
[sig_noise1,sig_noise2]=rise_cos(sig_noise1,sig_noise2,0.25,2); [x1,x2]=pick_sig(sig_noise1,sig_noise2,8); sig_noise1=x1; sig_noise2=x2; %解调
signal=demodulate_sig(sig_noise1,sig_noise2); %计算误bit率
error_bit(i)=length(find(signal-source)~=0)/N(i); end;
%画出图形
semilogy(snr,error_bit,'-b'); hold on
semilogy(snr,error_theory,'-r')
误码率曲线图如图 所示。从图上可以看到当信噪比小的情况下,仿真曲线和理论曲线差距略大,而随着信噪比的增大,仿真曲线越来越逼进理论曲线。简单分析不难看出,由于理论误码率曲线是建立在误符号率除以4的基础上的,而这一条件的前提是出现误符号的时候,
一个符号中只有一个bit位发生了错误,这表明误码率比较低,也就是说明信噪比比较大。所以,当信噪比比较小的时候,理论计算的误码率的值要小于仿真得到的值。
10016QAM误码率曲线仿真曲线理论曲线10-1误码率10-210-310-4123456信噪比7891011 图13 误码率曲线图
整体程序构架
前面给出的分别是每一个模块对应的函数,下面的程序表示如何将上边的各个模块连接起来。
clear;
%====定义待仿真序列的维数 N global N N=320;
%====定义产生‘1’的概率为 p global p p=0.5;
%============================== %首先产生随机二进制序列 source=randsrc(1,N,[1,0;p,1-p]);
%============================== %对产生的二进制序列进行QAM调制 [source1,source2]=Qam_modulation(source); %=============================== %画出星座图 figure(1);
plot_astrology(source1,source2);
%=============================== %两路信号进行插值
sig_insert1=insert_value(source1,8); sig_insert2=insert_value(source2,8);
%=============================== %画出两路信号的波形图 figure(2);
plot_2way(sig_insert1,sig_insert2,length(sig_insert1),0.5); title('两路信号的波形图');
%=============================== %通过低通滤波器
[sig_rcos1,sig_rcos2]=rise_cos(sig_insert1,sig_insert2,0.25,2); %=============================== %画出两路信号的波形图
figure(3);
plot_2way(sig_rcos1,sig_rcos2,length(sig_rcos1)/4,0.5); title('通过低通滤波器后两路信号波形图');
%stem_2way(sig_insert1,sig_insert2,length(sig_insert1)/4,0.5); %=============================== %====将基带信号调制到高频上
[t,sig_modulate]=modulate_to_high(sig_rcos1,sig_rcos2,0.25,2.5); figure(4);
plot(t(1:500),sig_modulate(1:500));
%=============================== %====将滤波后的信号加入高斯白噪声 snr=10;
[x1,x2]=generate_noise(sig_rcos1,sig_rcos2,snr); sig_noise1=x1'; sig_noise2=x2'; end; figure(5)
plot_2way(sig_noise1,sig_noise2,length(sig_noise1)/4,0.5); %=============================== %====经过匹配滤波器
% [x1,x2]=match_flt(sig_noise1,sig_noise2,0.25,2); % sig_match1=x1'; % sig_match2=x2';
[sig_match1,sig_match2]=rise_cos(sig_noise1,sig_noise2,0.25,2); figure(6);
plot_2way(sig_match1,sig_match2,length(sig_match1)/4,0.5); %=============================== %采样
[x1,x2]=pick_sig(sig_match1,sig_match2,8); sig_pick1=x1; sig_pick2=x2; %画出星座图 figure(7)
plot_astrology(sig_pick1,sig_pick2); %解调
signal=demodulate_sig(sig_pick1,sig_pick2); %画出误码率曲线图 figure(8) plot_snr;
讨论 信噪比修正
前边提到了在加入高斯白噪声时,需要对信噪比(SNR)进行修正。由于接收滤波器是线性的,根据随即过程理论的知识,高斯随机过程的线性变换仍然是高斯随机过程,因此滤波器的输出噪声也是高斯的。下面来计算通过平方根升余弦滤波器后的高斯噪声的方差:
?N????N0|H(f)|2df 其中|H(f)|2是升余弦滤波器的频域响应。
?有升余弦滤波器的定义可以知道
???H0(f)df?1,所以N?N0。
也就是通过平方根升余弦滤波器后的高斯白噪声的平均功率保持不变。
仿真曲线
在仿真的过程中,首先不考虑两个滤波器的影响,直接在映射到星座图上的信号加入高
10016QAM误码率曲线仿真曲线理论曲线蒙特卡罗曲线10-1误码率10-210-310-4123456信噪比7891011 图14
3条曲线比较
斯白噪声,然后解调,同发送端进行比较,最后得到误码率曲线,在图 中用绿色表示。这条曲线同理论公式推导的条件一致,因此它应当同理论曲线(图中用红色表示)吻合。而如图 所示,在信噪比较小的情况下,二者的差距比较大。这是由于理论公式中近似的认为在采用格雷码编码的前提下,误符号率和误bit率之间满足4:1的关系,而在信噪比较小的情况下,一个符号可能错误会超过1个,这样误符号率和误bit率之间的比值将会小于4:1,所以理论计算的误bit率的值要偏小。这也说明,在后边加入两个滤波器的系统中,我们判断误码率曲线是否正确的依据应该是这条绿色的曲线,而不应该是“理论曲线”。 而加入滤波器的系统经过信噪比修正后得到的误码率曲线同蒙特卡罗曲线基本吻合,也说明了仿真的正确和引入修正的必要。
仿真终止条件
在做仿真的时候,考虑到不同的信噪比对应不同的误码率,因此需要仿真的点数也应该相应的变化。由于16QAM系统已经有了比较精确的理论误码率公式,所以可以先由给定的信噪比得到理论的误码率,然后再由这个误码率得到需要仿真的点数。在点数少于一定域值的情况下,直接用域值代替。这样在很大程度上节省了时间,同时也保证了仿真得到的误码率的可靠性。