1、基于Matlab的通信系统仿真 目 录基于Matlab的通信系统仿真3数字通信大作业3系统综述3结构框图3系统实现4随机信号的生成4星座图映射4插值6波形成形(平方根升余弦滤波器)710倍载波调制8加入高斯白噪声11匹配滤波器12采样15判决解调16误码率曲线17整体程序构架19讨论21信噪比修正21仿真曲线21仿真终止条件22升余弦滤波器22图 表图1 待构建系统的框图3图2 0、1等概分布的随机信号波形图4图3 16QAM星座图5图4 经过插值后的两路信号波形图6图5 平方根升余弦滤波器的冲激响应曲线7图6 通过平方根升余弦滤波器后的两路信号8图7 载波调制信号展开图9图8 载波调制信号整
2、体图10图9 加入高斯白噪声的两路信号波形11图10经过匹配滤波器后的波形13图11 高斯白噪声经过匹配滤波器后的波形14图12 信噪比为10db时的星座图15图13 误码率曲线图18图14 3条曲线比较20基于Matlab的通信系统仿真数字通信大作业系统综述利用Matlab仿真软件,完成如图1所示的一个基本的数字通信系统。信号源产生0、1等概分布的随机信号,映射到16QAM的星座图上,同时一路信号已经被分成了实部和虚部,后边的处理建立在这两路信号的基础上。实部、虚部信号分别经过平方根升余弦滤波器,再加入高斯白噪声,然后通过匹配滤波器(平方根升余弦滤波器)。最后经过采样,判决,得到0、1信号,
3、同原信号进行比较,给出16QAM数字系统的误码。结构框图图1待构建系统的框图系统实现随机信号的生成利用Matlab中自带的函数randsrc来产生0、1等概分布的随机信号。源代码如下所示:%=定义待仿真序列的维数 Nglobal NN=320;%=定义产生1的概率为 pglobal pp=0.5;%=%首先产生随机二进制序列source=randsrc(1,N,1,0;p,1-p);0、1等概分布的随机信号如图2所示。图20、1等概分布的随机信号波形图星座图映射将等概分布的0、1信号映射到16QAM星座图上。每四个bit构成一个码子,具体实现的方法是,将输入的信号进行串并转换分成两路,分别叫做
4、I路和Q路。再把每一路的信号分别按照两位格雷码的规则进行映射,这样实际上最终得到了四位格雷码。为了清楚说明,参看表1:表1两位格雷码的映射规律两位0、1码映射后(按格雷码)0 0-30 1-11 111 03源代码如下所示:function y1,y2=Qam_modulation(x)%QAM_modulation%=%对产生的二进制序列进行QAM调制 %=首先进行串并转换,将原二进制序列转换成两路信号N=length(x);a=1:2:N;y1=x(a);y2=x(a+1); %=分别对两路信号进行QPSK调制 %=对两路信号分别进行24电平变换a=1:2:N/2;temp1=y1(a);
5、temp2=y1(a+1);y11=temp1*2+temp2;temp1=y2(a);temp2=y2(a+1);y22=temp1*2+temp2; %=对两路信号分别进行相位调制a=1:N/4;y1=(y11*2-1-4)*1.*cos(2*pi*a);y2=(y22*2-1-4)*1.*cos(2*pi*a);%=按照格雷码的规则进行映射y1(find(y11=0)=-3;y1(find(y11=1)=-1;y1(find(y11=3)=1;y1(find(y11=2)=3;y2(find(y22=0)=-3;y2(find(y22=1)=-1;y2(find(y22=3)=1;y2(
6、find(y22=2)=3;得到的星座图如图3所示,图上注明了每一个点对应的01序列。图316QAM星座图从上边的星座图上可以清楚的看到,任意相邻的两个点之间它们对应的4个bit中只有一个有差别,也就是格雷码的特点。而采用格雷码主要目的是当信噪比较大时,也就是系统的误码率比较低的情况下,当出现一个符号错误的情况下,往往只是这个符号中的一个bit位出现了误码,因此这个情况下误码率和误bit率是4:1,这一特性在后边的误码率计算的过程中会有应用。插值为了能够模拟高斯白噪声的宽频谱特性,以及为了能够显示波形生成器(平方根升余弦滤波器)的效果,所以在原始信号中间添加一些0点。具体实现是分别在信号的I路
7、和Q路中,任意相邻的两个码字之间添加7个0。源代码如下所示:function y=insert_value(x,ratio)%=x是待插值的序列,ratio是插值的比例。%两路信号进行插值首先产生一个长度等于ratio倍原信号长度的零向量y=zeros(1,ratio*length(x);再把原信号放在对应的位置a=1:ratio:length(y);y(a)=x;对I路和Q路信号进行插值后的波形图如图4所示。图4经过插值后的两路信号波形图波形成形(平方根升余弦滤波器)为了避免相邻传输信号之间的串扰,多元符号需要有合适的信号波形。图1中的方波是在本地数字信号处理时常见的波形,但在实际传输时这种
8、方波并不合适。根据奈奎斯特第一准则,在实际通信系统中一般均使接收波形为升余弦滚降信号。这一过程由发送端的基带成形滤波器和接收端的匹配滤波器两个环节共同实现,因此每个环节均为平方根升余弦滚降滤波,两个环节合成就实现了一个升余弦滚降滤波。实现平方根升余弦滚降信号的过程称为“波形成形”,通过采用合适的滤波器对多元码流进行滤波实现,由于生成的是基带信号,因此这一过程又称“基带成形滤波”。平方根升余弦滤波器的冲激响应基带平方根升余弦滤波器具有以下定义的理论函数 其中:是奈奎斯特平率,是滚降系数。下面给出平方根升余弦滤波器的冲激响应曲线,如图5所示。图5平方根升余弦滤波器的冲激响应曲线从上图上不难看出来,
9、平方根升余弦滤波器的冲激响应很显然的引入了符号间干扰(ISI)即它的冲激响应在相邻的抽样点上的值并不象升余弦滤波器那样恒为0。然而造成这一后果的原因在于,当我们引入平方根升余弦滤波器的时候,就是认为整个信道,也就是说,包括信号发送端的滤波器和信号接收端的滤波器,总体的效果是避免了符号间干扰(ISI),所以,单独看这每一个滤波器,勿庸置疑,它们都是存在着符号间干扰(ISI)的。经过平方根升余弦滤波器后的信号I路和Q路信号经过平方根升余弦滤波器后,成形后的波形如图6所示。源代码如下%x1、x2是两路输入信号,fd是信号信息位的频率,fs是信号的采样频率function y1,y2=rise_cos
10、(x1,x2,fd,fs)%生成平方根升余弦滤波器yf, tf=rcosine(fd,fs, fir/sqrt);%对两路信号进行滤波y1, to1=rcosflt(x1, fd,fs,filter/Fs, yf);y2, to2=rcosflt(x2, fd,fs,filter/Fs, yf);10倍载波调制将通过成形滤波器后的信号调制到10倍于原频率的载波上。由于在仿真的过程中,只图6通过平方根升余弦滤波器后的两路信号能用离散的点来模拟连续信号,因而为了能够显示出一个正弦曲线,至少需要在一个正弦周期内采样到4个以上的点,这里,我们在一个周期内采10个点。假设最初的0、1信号的频率是1Hz,
11、那么I路和Q路符号传输的频率是1/4Hz,而10倍频是建立在I路或Q路符号频率的基础上,也就是说,载频的频率是2.5Hz。按照前面的假设,那么相邻两个采样点之间的时间间隔是0.04s。而一个完整周期内的正弦波形的幅值是相同的,都是对应的这个周期内的I路和Q路线性叠加,调制后的信号为, 其中,为载波频率。源代码如下%载波调制%x1,x2代表两路输入信号,f是输入信号的频率,hf是载波的频率function t,y=modulate_to_high(x1,x2,f,hf)%产生两个中间变量,用来存储插值后的输入信号yo1=zeros(1,length(x1)*hf/f*10);yo2=zeros(
12、1,length(x2)*hf/f*10);n=1:length(yo1);%对输入信号分别进行插值,相邻的两个点之间加入9个点,且这9个点的值同第0个点的值相同yo1(n)=x1(floor(n-1)/(hf/f*10)+1);yo2(n)=x1(floor(n-1)/(hf/f*10)+1);%生成输出输出信号的时间向量t=(1:length(yo1)/hf*f/10;%生成载波调制信号y=yo1.*cos(2*pi*hf*t)-yo2.*sin(2*pi*hf*t);得到的调制到载频的信号波形如图7和图8所示,其中图7主要为了显示一个脉宽周期内的调制信号波形,图8则是显示载波信号的整体情
13、况。图7 载波调制信号展开图图8 载波调制信号整体图加入高斯白噪声将通过成形滤波器后的信号送到具有高斯白噪声特征的加性信道中,相当于在原信号上加入高斯白噪声。由于高斯白噪声加在了通过插值和滤波后的点上,因此在计算信噪比的时候存在一个信噪比换算的问题。当我们把仿真得到的误码率曲线同理论的误码率曲线相比较的时候,两者的信噪比的定义必须是一致的。一致包括两个方面,一是二者均为每bit符号上的信号功率和噪声功率的比值,另一个是信号的功率是指那些信息点上的平均功率,噪声也是指信息点上所对应的噪声的平均功率,但由于噪声的功率谱密度是一个定值,所以噪声的平均功率实际上就是噪声的功率谱密度。对于第二点,由于所
14、有信号的平均功率和信息点上的信号的平均功率不同,所以需要在加入高斯噪声的时候进行纠正,具体的公式推导如下。设是最后理论计算中的信噪比,是加入高斯白噪声后的整体信号(包括插值后的点)的信噪比,是每bit信息点的平均能量,是每bit信号的平均能量,是噪声的平均功率,现在需要推导出与的关系。 即两个信噪比的比值就是平均能量的比值。源程序如下%对输入的两路信号加高斯白噪声,返回处理后的两路信号,信息点等效bit信噪比为snr的值function y1,y2=generate_noise(x1,x2,snr)%snr1代表snr对应的符号信噪比snr1=snr+10*log10(4); %算出所有信号的
15、平均功率ss=var(x1+i*x2,1); %加入高斯白噪声y=awgn(x1+j*x2,snr1+10*log10(ss/10),measured);y1=real(y);y2=imag(y);给出加入高斯白噪声的两路信号波形。图9加入高斯白噪声的两路信号波形匹配滤波器在数字传输系统中,滤波器是不可缺少的。滤波器的一个作用是使基带信号频谱成形,例如为了满足奈奎斯特第一准则,基带信号频谱通常采用升余弦滚降形状,这一点在波形成形部分已经有了较详细的介绍。而滤波器的另一个重要作用是在接收端限制白噪声,将信号频带外的噪声滤掉,减少它对信号正确判决的影响。为了能够使滤波器输出信噪比在信息抽样时刻的信
16、噪比最大,所以引入了匹配滤波器。假设匹配滤波器的频率传递函数为,时域冲激响应为。滤波器输入为发送信号与噪声的叠加,即这里,为信号,它的频谱函数为。为白色高斯噪声,其双边功率谱密度为。滤波器的输出为其中信号部分为在时刻输出的信号抽样值为滤波器输出噪声的功率谱密度为平均功率为因此,时刻的输出信噪比为匹配滤波器的传递函数使达到最大。在这里利用Schwartz不等式求解,最后得到传递函数的表达式为即传递函数与信号频谱的复共轭成正比。传递函数的时域响应为匹配滤波器的最大输出信噪比为其中,为观察间隔内的信号能量。具体到这个通信系统中,由于信号的时域响应为其中是平方根升余弦滤波器的冲激响应。结合上式可以得到
17、匹配滤波器实质上是一个具有与发射端的基带成形滤波器相同的滚降系数的平方根升余弦滤波器。接收端的“匹配滤波”是针对发射端的成形滤波而言,与成形滤波相匹配实现了数字通信系统的最佳接收。它与基带成形滤波器共同构成了一个奈奎斯特滤波器。源代码同平方根升余弦滤波器的源代码相同。信号通过匹配滤波器后的波形如图10所示图10经过匹配滤波器后的波形从上边的波形可以看出来,经过匹配滤波器后的信号明显很平滑,这正好反映了低通滤波器的特性,滤掉了高频分量,为了明显的反映这一特点,将一段高斯白噪声经过匹配滤波器。波形对比如图11所示。图11高斯白噪声经过匹配滤波器后的波形经过仿真,发现高斯白噪声经过一个平方根滤波器后
18、方差保持不变。因此在加入高斯噪声时给定的信噪比需要有一定的修正,即要保证在信息点上的信噪比为给定的值。我们知道,当给定snr时,需要加入的高斯噪声的功率谱密度,其中,在具体使用AWGN函数时,snr值是建立在当前输入信号的平均功率的基础上的,所以。采样由于从匹配滤波器出来的信号的点数8倍于原来信息的点数,为了恢复出原信号,所以需要对该信号进行采样。从匹配滤波器出来时,首先要剔除卷积过程中冗余的点,接着抽取现在信号中的第1个,第9个,第8k1个点,源代码如下:function y1,y2=pick_sig(x1,x2,ratio)y1=x1(ratio*3*2+1:ratio:length(x1
19、);y2=x2(ratio*3*2+1:ratio:length(x1);将这时的数据画到星座图上。图12信噪比为10db时的星座图判决解调经过前边的匹配滤波器解调或者称为相关解调产生了一组向量,在这里就是一个一维的向量,根据最大后验概率(MAP)准则(由于各个信号的先验概率相等,所以页可以认为是最大似然准则),得到了最小距离检测。具体在本仿真系统中,判断为各个信号的门限如表2所示。判决后得到的数据再按照格雷码的规则还原成0、1信号,最终将两路0、1信号合成一路0、1信号,用来同最初的信号一起决定误码率。表2判决电平对应表判决前的信号的幅度对应的判决后的幅度3113源代码如下function
20、y=demodulate_sig(x1,x2)%对x1路信号进行判决xx1(find(x1=2)=3;xx1(find(x1=0)=1;xx1(find(x1=-2)&(x10)=-1;xx1(find(x1=2)=3;xx2(find(x2=0)=1;xx2(find(x2=-2)&(x20)=-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(fi
21、nd(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;误码率曲线将解调后的数据同原始数据相比较,得到该信噪比下所对应的误码率。为了得到误码率曲线,需要得到在不
22、同的信噪比下的误码率。在仿真的过程中,假设要得到一个值得信赖的误码率数据点,至少需要在最后的数据比较的过程中得到100个错误,那么参与仿真的数据点就应该是误码率的倒数乘以100,为了提高程序的效率,首先计算出某个信噪比对应的理论的误码率,然后估计出待仿真的点数。对于16QAM信号星座图等效为在两个正交载波上的两个PAM信号,其中每一个具有4个信号点。因为在解调器中可以将相位正交的两个信号分量完全分开,所以QAM的错误概率可以由PAM的错误概率求得。16QAM系统的正确判决概率是式中,是4元PAM的错误概率,在等效QAM系统的每一个正交信号中,4元PAM具有一半的平均功率,通过适当的修改4元PA
23、M的错误概率,可以得到其中是平均符号SNR。因此,16QAM的错误概率是具体的源代码如下: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(N5000)=5000;%开始仿真global p;for i=1:length(N); %首先产生随机二进制序列 sourc
24、e=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
25、_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)
26、;end;%画出图形semilogy(snr,error_bit,-b);hold onsemilogy(snr,error_theory,-r)误码率曲线图如图 所示。从图上可以看到当信噪比小的情况下,仿真曲线和理论曲线差距略大,而随着信噪比的增大,仿真曲线越来越逼进理论曲线。简单分析不难看出,由于理论误码率曲线是建立在误符号率除以4的基础上的,而这一条件的前提是出现误符号的时候,一个符号中只有一个bit位发生了错误,这表明误码率比较低,也就是说明信噪比比较大。所以,当信噪比比较小的时候,理论计算的误码率的值要小于仿真得到的值。图13 误码率曲线图整体程序构架前面给出的分别是每一个模块对应的
27、函数,下面的程序表示如何将上边的各个模块连接起来。clear;%=定义待仿真序列的维数 Nglobal NN=320;%=定义产生1的概率为 pglobal pp=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=ins
28、ert_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_2wa
29、y(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_
30、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_m
31、atch2,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)进行修正。由于接收滤波器是线性的,根据随即过程理论的知识,高斯随机过程的线性变换仍然是高斯随机过程,因此滤波器的输出噪声也是高斯的。下面来计算通过平方根升余弦滤波器后的高斯噪声的方差: 其中是升余弦滤波器的频域响应。
32、有升余弦滤波器的定义可以知道,所以。也就是通过平方根升余弦滤波器后的高斯白噪声的平均功率保持不变。仿真曲线在仿真的过程中,首先不考虑两个滤波器的影响,直接在映射到星座图上的信号加入高图14 3条曲线比较斯白噪声,然后解调,同发送端进行比较,最后得到误码率曲线,在图 中用绿色表示。这条曲线同理论公式推导的条件一致,因此它应当同理论曲线(图中用红色表示)吻合。而如图 所示,在信噪比较小的情况下,二者的差距比较大。这是由于理论公式中近似的认为在采用格雷码编码的前提下,误符号率和误bit率之间满足4:1的关系,而在信噪比较小的情况下,一个符号可能错误会超过1个,这样误符号率和误bit率之间的比值将会小
33、于4:1,所以理论计算的误bit率的值要偏小。这也说明,在后边加入两个滤波器的系统中,我们判断误码率曲线是否正确的依据应该是这条绿色的曲线,而不应该是“理论曲线”。而加入滤波器的系统经过信噪比修正后得到的误码率曲线同蒙特卡罗曲线基本吻合,也说明了仿真的正确和引入修正的必要。仿真终止条件在做仿真的时候,考虑到不同的信噪比对应不同的误码率,因此需要仿真的点数也应该相应的变化。由于16QAM系统已经有了比较精确的理论误码率公式,所以可以先由给定的信噪比得到理论的误码率,然后再由这个误码率得到需要仿真的点数。在点数少于一定域值的情况下,直接用域值代替。这样在很大程度上节省了时间,同时也保证了仿真得到的
34、误码率的可靠性。升余弦滤波器由于在本系统中直接采用了Matlab中communication工具箱中的rcosine和rcosflt两个函数来实现平方根升余弦滤波器,所以对这两个函数的一些属性也有必要讨论一下。其中rcosine函数是用来产生数字滤波器的参数,而rcosflt函数调用rcosine函数产生的结果对序列进行滤波。这里需要注意的是,在rcosflt函数的输入参数中如不特别声明,它将默认的对输入信号进行过采样(Upsampling),过采样率由输入参数中的信号频率(Fd)和采样频率(Fs)决定。在经过成型滤波器(第一个平方根升余弦滤波器)时,需要对原信号进行过采样,这时可以通过rcosflt函数在完成波形生成的同时进行8倍过采样,当然也可以先进行过采样后,再将得到的结果送入到rcosflt函数中,同时声明不需要进行过采样。而在经过匹配滤波器的时候,rcosflt函数不要再过采样。另外还有一点,在rcosine函数中,有一个参数是延时(Delay),这个参数的值就是平方根升余弦滤波器时域响应中边瓣的个数。默认值是3,同时滚降系数是0.5。当滚降系数不是0.5的情况下,延时(Delay)的值需要适当的变化。例如当滚降系数小于0.5时,Delay的值应该大于3,以保证能尽可能多的将旁瓣的效果加入的滤波器中,当然随着Delay的变大,数据处理的工作量也会增大。21