matlab大作业

更新时间:2023-10-19 07:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于MATLAB的通信系统仿真

专业:电子与通信工程

学号: 姓名: 成绩:

日期:

目录

基于Matlab的通信系统仿真 ······································································································ 3 系统综述 ······················································································································ 3

结构框图 ······················································································ 错误!未定义书签。 系统实现 ······························································································ 错误!未定义书签。

随机信号的生成 ··········································································································· 3 星座图映射 ··················································································································· 4 插值 ······························································································································ 6 波形成形(平方根升余弦滤波器) ············································································· 6 10倍载波调制 ·············································································································· 8 加入高斯白噪声 ··········································································································· 9 匹配滤波器 ················································································································· 10 采样 ···························································································································· 13 判决解调 ···················································································································· 14 误码率曲线 ················································································································· 15 整体程序构架 ············································································································· 17 讨论 ···································································································································· 18

信噪比修正 ················································································································· 18 仿真曲线 ···················································································································· 18 仿真终止条件 ············································································································· 19 升余弦滤波器 ············································································································· 19

主要代码------------------------------------------------------------------------------------------------23

基于matlab的通信系统仿真

系统综述

利用Matlab仿真软件,完成如图1所示的一个基本的数字通信系统。信号源产生0、1等概分布的随机信号,映射到16QAM的星座图上,同时一路信号已经被分成了实部和虚部,后边的处理建立在这两路信号的基础上。实部、虚部信号分别经过平方根升余弦滤波器,再加入高斯白噪声,然后通过匹配滤波器(平方根升余弦滤波器)。最后经过采样,判决,得到0、1信号,同原信号进行比较,给出16QAM数字系统的误码。

结构框图

图1 待构建系统的框图

系统实现

随机信号的生成

利用Matlab中自带的函数randsrc来产生0、1等概分布的随机信号。 源代码如下所示:

%====定义待仿真序列的维数 N global N N=320;

%====定义产生‘1’的概率为 p global p p=0.5;

%============================== %首先产生随机二进制序列 source=randsrc(1,N,[1,0;p,1-p]);

0、1等概分布的随机信号如图2所示。

0 1等概分布的信号1.51 信号幅度0.50-0.505101520253035404550 图2 0、1等概分布的随机信号波形图

星座图映射

将等概分布的0、1信号映射到16QAM星座图上。每四个bit构成一个码子,具体实现的方法是,将输入的信号进行串并转换分成两路,分别叫做I路和Q路。再把每一路的信号分别按照两位格雷码的规则进行映射,这样实际上最终得到了四位格雷码。为了清楚说明,参看表1:

表1 两位格雷码的映射规律 两位0、1码 映射后(按格雷码) 0 0 0 1 1 1 1 0 源代码如下所示:

function [y1,y2]=Qam_modulation(x) %QAM_modulation

%==============================

-3 -1 1 3 %对产生的二进制序列进行QAM调制

%=====首先进行串并转换,将原二进制序列转换成两路信号 N=length(x); a=1:2:N; y1=x(a); y2=x(a+1);

%=====分别对两路信号进行QPSK调制

%======对两路信号分别进行2-4电平变换 a=1:2:N/2; temp1=y1(a); 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(find(y22==2))=3;

得到的星座图如图3所示,图上注明了每一个点对应的01序列。

16 QAM星座图54(1 1 1 1) 3(0 1 0 0) (0 1 1 0) (1 1 1 0) 2(0 1 0 1) (0 1 1 1) (1 1 1 0) (1 1 0 1) 10(1 0 1 1) -1(0 0 0 1) (0 0 1 1) (1 0 0 1) -2(0 0 0 0) (0 0 1 0) (1 0 1 0) -3(1 0 0 0) -4-5-5-4-3-2-1012345 图3 16QAM星座图

从上边的星座图上可以清楚的看到,任意相邻的两个点之间它们对应的4个bit中只有一个有差别,也就是格雷码的特点。而采用格雷码主要目的是当信噪比较大时,也就是系统的误码率比较低的情况下,当出现一个符号错误的情况下,往往只是这个符号中的一个bit位出现了误码,因此这个情况下误码率和误bit率是4:1,这一特性在后边的误码率计算的过程中会有应用。

插值

为了能够模拟高斯白噪声的宽频谱特性,以及为了能够显示波形生成器(平方根升余弦滤波器)的效果,所以在原始信号中间添加一些0点。具体实现是分别在信号的I路和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所示。

两路信号的波形图420-2-4010203040实部信号50607080420-2-4010203040虚部信号50607080 图4 经过插值后的两路信号波形图

波形成形(平方根升余弦滤波器)

为了避免相邻传输信号之间的串扰,多元符号需要有合适的信号波形。图1中的方波是在本地数字信号处理时常见的波形,但在实际传输时这种方波并不合适。根据奈奎斯特第一准则,在实际通信系统中一般均使接收波形为升余弦滚降信号。这一过程由发送端的基带成形滤波器和接收端的匹配滤波器两个环节共同实现,因此每个环节均为平方根升余弦滚降滤波,两个环节合成就实现了一个升余弦滚降滤波。实现平方根升余弦滚降信号的过程称为“波形成

形”,通过采用合适的滤波器对多元码流进行滤波实现,由于生成的是基带信号,因此这一过程又称“基带成形滤波”。 平方根升余弦滤波器的冲激响应

基带平方根升余弦滤波器具有以下定义的理论函数

H(f)?1?1?当|f|?f(1??)2??11?fN?|f|?()? 当f(1??)?|f|?f(1??) ?H(f)???sin2fN??22??当|f|?f(1??)H(f)?0??其中:fN?R1?s是奈奎斯特平率,?是滚降系数。 2Ts2下面给出平方根升余弦滤波器的冲激响应曲线,如图5所示。

平方根升余弦滤波器的冲激响应0.60.50.4Amplitude0.30.20.10-0.10510152025n (samples)30354045 图5 平方根升余弦滤波器的冲激响应曲线

从上图上不难看出来,平方根升余弦滤波器的冲激响应很显然的引入了符号间干扰(ISI)即它的冲激响应在相邻的抽样点上的值并不象升余弦滤波器那样恒为0。然而造成这一后果的原因在于,当我们引入平方根升余弦滤波器的时候,就是认为整个信道,也就是说,包括信号发送端的滤波器和信号接收端的滤波器,总体的效果是避免了符号间干扰(ISI),所以,单独看这每一个滤波器,勿庸置疑,它们都是存在着符号间干扰(ISI)的。

经过平方根升余弦滤波器后的信号I路和Q路信号经过平方根升余弦滤波器后,成形后的波形如图6所示。 源代码如下

%x1、x2是两路输入信号,fd是信号信息位的频率,fs是信号的采样频率 function [y1,y2]=rise_cos(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倍于原频率的载波上。由于在仿真的过程中,只

4 滤波后的信号原始信号 20-2-401020304050实部信号6070804 滤波后的信号原始信号 20-2-401020304050虚部信号607080 图6 通过平方根升余弦滤波器后的两路信号

能用离散的点来模拟连续信号,因而为了能够显示出一个正弦曲线,至少需要在一个正弦周期内采样到4个以上的点,这里,我们在一个周期内采10个点。假设最初的0、1信号的频率是1Hz,那么I路和Q路符号传输的频率是1/4Hz,而10倍频是建立在I路或Q路符号频率的基础上,也就是说,载频的频率是2.5Hz。按照前面的假设,那么相邻两个采样点之间的时间间隔是0.04s。而一个完整周期内的正弦波形的幅值是相同的,都是对应的这个周期内的I路和Q路线性叠加,调制后的信号为,

y(t)?I(t)cos2?fct?Q(t)sin2?fct 其中,fc为载波频率。

源代码如下

%载波调制

%x1,x2代表两路输入信号,f是输入信号的频率,hf是载波的频率 function [t,y]=modulate_to_high(x1,x2,f,hf)

%产生两个中间变量,用来存储插值后的输入信号 yo1=zeros(1,length(x1)*hf/f*10); yo2=zeros(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则是显示载波信号的整体情况。

载波调制信号波形21.510.5幅度0-0.5-1-1.5-2101112131415时间1617181920 图7 载波调制信号展开图

载波调制信号波形2.521.510.5幅度0-0.5-1-1.5-2-2.50100200300时间400500600700 图8 载波调制信号整体图

加入高斯白噪声

将通过成形滤波器后的信号送到具有高斯白噪声特征的加性信道中,相当于在原信号上加入高斯白噪声。由于高斯白噪声加在了通过插值和滤波后的点上,因此在计算信噪比的时候存在一个信噪比换算的问题。当我们把仿真得到的误码率曲线同理论的误码率曲线相比较的时

候,两者的信噪比的定义必须是一致的。一致包括两个方面,一是二者均为每bit符号上的信号功率和噪声功率的比值,另一个是信号的功率是指那些信息点上的平均功率,噪声也是指信息点上所对应的噪声的平均功率,但由于噪声的功率谱密度是一个定值,所以噪声的平均功率实际上就是噪声的功率谱密度。对于第二点,由于所有信号的平均功率和信息点上的信号的平均功率不同,所以需要在加入高斯噪声的时候进行纠正,具体的公式推导如下。 设SNR是最后理论计算中的信噪比,SNR'是加入高斯白噪声后的整体信号(包括插值后的点)的信噪比,

Eb是每bit信息点的平均能量,Eb'是每bit信号的平均能量,No是噪

声的平均功率,现在需要推导出SNR与SNR'的关系。

?Eb?No?SNR?Eb'SNR'Eb'??SNR'??NoSNREb ?

即两个信噪比的比值就是平均能量的比值。 源程序如下

%对输入的两路信号加高斯白噪声,返回处理后的两路信号,信息点等效bit信噪比为snr的值 function [y1,y2]=generate_noise(x1,x2,snr) %snr1代表snr对应的符号信噪比 snr1=snr+10*log10(4);

%算出所有信号的平均功率 ss=var(x1+i*x2,1); %加入高斯白噪声

y=awgn([x1+j*x2],snr1+10*log10(ss/10),'measured'); y1=real(y); y2=imag(y);

给出加入高斯白噪声的两路信号波形如下:

加入高斯白噪声后的波形42幅度0-2-4010203040实部信号5060708042幅度0-2-4010203040虚部信号50607080 图9 加入高斯白噪声的两路信号波形

匹配滤波器

在数字传输系统中,滤波器是不可缺少的。滤波器的一个作用是使基带信号频谱成形,例如为了满足奈奎斯特第一准则,基带信号频谱通常采用升余弦滚降形状,这一点在波形成形部分已经有了较详细的介绍。而滤波器的另一个重要作用是在接收端限制白噪声,将信号频带外的噪声滤掉,减少它对信号正确判决的影响。为了能够使滤波器输出信噪比在信息抽样时刻的信噪比最大,所以引入了匹配滤波器。

假设匹配滤波器的频率传递函数为H(f),时域冲激响应为h(t)。滤波器输入为发送信号与噪声的叠加,即

x(t)?S(t)?n(t)

这里,S(t)为信号,它的频谱函数为S(f)。n(t)为白色高斯噪声,其双边功率谱密度为滤波器的输出为

n0。2y(t)?[S(t)?n(t)]?h(t)

其中信号部分为

?yS(t)?S(t)?h(t)??S(f)H(f)ej2?ftdf

??在t?T时刻输出的信号抽样值为

?yS(T)??S(f)H(f)ej2?fTdf

??滤波器输出噪声的功率谱密度为

Fn0(f)?Fn(f)|H(f)|2

平均功率为

?N0??Fn0(f)|H(f)|2df

??因此,t?T时刻的输出信噪比为

?SNR?|?S(f)H(f)ej2?fTdf|???2F(f)|H(f)|dfn?

??匹配滤波器的传递函数使SNR达到最大。在这里利用Schwartz不等式求解,最后得到传递

函数的表达式为

H(f)?KS*(f)e?2?fT

即传递函数与信号频谱的复共轭成正比。 传递函数的时域响应为

h(t)?KS(T?t)

匹配滤波器的最大输出信噪比为

|S(f)|22ESNR??df?s

n0/2n0??其中,Es为观察间隔内的信号能量。

具体到这个通信系统中,由于信号的时域响应为

?S(t)??(T)?h0(t)?h0(T?t)

其中h0(t)是平方根升余弦滤波器的冲激响应。 结合上式可以得到

h(t)?Kh0(t)

匹配滤波器实质上是一个具有与发射端的基带成形滤波器相同的滚降系数的平方根升余弦滤波器。接收端的“匹配滤波”是针对发射端的成形滤波而言,与成形滤波相匹配实现了数字通信系统的最佳接收。它与基带成形滤波器共同构成了一个奈奎斯特滤波器。源代码同平方根升余弦滤波器的源代码相同。

信号通过匹配滤波器后的波形如图10所示:

接收端经过匹配滤波器后的波形42幅度0-2-4010203040实部信号5060708042幅度0-2-4010203040虚部信号50607080 图10

经过匹配滤波器后的波形

从上边的波形可以看出来,经过匹配滤波器后的信号明显很平滑,这正好反映了低通滤波器的特性,滤掉了高频分量,为了明显的反映这一特点,将一段高斯白噪声经过匹配滤波器。波形对比如图11所示。

高斯白噪声通过匹配滤波器3210-1-2-30102030405060708090100高斯白噪声波形3210-1-20102030405060经过滤波器后的波形708090100 图11

高斯白噪声经过匹配滤波器后的波形

经过仿真,发现高斯白噪声经过一个平方根滤波器后方差保持不变。因此在加入高斯噪声时给定的信噪比需要有一定的修正,即要保证在信息点上的信噪比为给定的值。我们知道

?SSNR?10lg(),当给定snr时,需要加入的高斯噪声的功率谱密度n0?1010?S,其

n0snr[(32?32)?(32?12)?(12?32)?(12?12)]?10,在具体使用AWGN函数时,snr中S?4值是建立在当前输入信号的平均功率S'的基础上的,所以

snr'?10lg(S')?10lg(n0S'10?snr10?SS'S')?snr?10lg()?snr?10lg()。

S10采样

由于从匹配滤波器出来的信号的点数8倍于原来信息的点数,为了恢复出原信号,所以需要

对该信号进行采样。从匹配滤波器出来时,首先要剔除卷积过程中冗余的点,接着抽取现在信号中的第1个,第9个,??,第8×k+1个点, 源代码如下:

function [y1,y2]=pick_sig(x1,x2,ratio) y1=x1(ratio*3*2+1:ratio:length(x1)); y2=x2(ratio*3*2+1:ratio:length(x1));

将这时的数据画到星座图上。

QAM星座图543210-1-2-3-4-5-5-4-3-2-1012345

图12

信噪比为10db时的星座图

判决解调

经过前边的匹配滤波器解调或者称为相关解调产生了一组向量,在这里就是一个一维的向量,根据最大后验概率(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???22 其中是升余弦滤波器的频域响应。 |H(f)|N|H(f)|df0??有升余弦滤波器的定义可以知道

???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系统已经有了比较精确的理论误码率公式,所以可以先由给定的信噪比得到理论的误码率,然后再由这个误码率得到需要仿真的点数。在点数少于一定域值的情况下,直接用域值代替。这样在很大程度上节省了时间,同时也保证了仿真得到的误码率的可靠性。

升余弦滤波器

由于在本系统中直接采用了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的变大,数据处理的工作量也会增大。 主要代码如下:

%====定义待仿真序列的维数 N global N N=320;

%====定义产生‘1’的概率为 p global p p=0.5;

%============================== %首先产生随机二进制序列 source=randsrc(1,N,[1,0;p,1-p]);

function [y1,y2]=Qam_modulation(x) %QAM_modulation

%============================== %对产生的二进制序列进行QAM调制

%=====首先进行串并转换,将原二进制序列转换成两路信号 N=length(x); a=1:2:N; y1=x(a); y2=x(a+1);

%=====分别对两路信号进行QPSK调制

%======对两路信号分别进行2-4电平变换 a=1:2:N/2; temp1=y1(a); 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(find(y22==2))=3;

function y=insert_value(x,ratio)

%=============================== %x是待插值的序列,ratio是插值的比例。 %两路信号进行插值

%首先产生一个长度等于ratio倍原信号长度的零向量 y=zeros(1,ratio*length(x));

%再把原信号放在对应的位置

a=1:ratio:length(y); y(a)=x;

%x1、x2是两路输入信号,fd是信号信息位的频率,fs是信号的采样频率 function [y1,y2]=rise_cos(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); %载波调制

%x1,x2代表两路输入信号,f是输入信号的频率,hf是载波的频率 function [t,y]=modulate_to_high(x1,x2,f,hf)

%产生两个中间变量,用来存储插值后的输入信号 yo1=zeros(1,length(x1)*hf/f*10); yo2=zeros(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);

%对输入的两路信号加高斯白噪声,返回处理后的两路信号,信息点等效bit信噪比为snr的值 function [y1,y2]=generate_noise(x1,x2,snr) %snr1代表snr对应的符号信噪比 snr1=snr+10*log10(4);

%算出所有信号的平均功率 ss=var(x1+i*x2,1); %加入高斯白噪声

y=awgn([x1+j*x2],snr1+10*log10(ss/10),'measured'); y1=real(y); y2=imag(y);

function [y1,y2]=pick_sig(x1,x2,ratio) y1=x1(ratio*3*2+1:ratio:length(x1)); y2=x2(ratio*3*2+1:ratio:length(x1)); 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; 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') 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;

本文来源:https://www.bwwdw.com/article/ldof.html

Top