多径衰落信道下不同调制方式的误码率性能.docx
《多径衰落信道下不同调制方式的误码率性能.docx》由会员分享,可在线阅读,更多相关《多径衰落信道下不同调制方式的误码率性能.docx(10页珍藏版)》请在冰点文库上搜索。
多径衰落信道下不同调制方式的误码率性能
多径衰落信道下
不同调制方式的BER性能
学院:
专业:
姓名:
学号:
一、原理
本次仿真内容为基于平坦瑞利衰落信道下QPSK及DQPSK的误比特率性能分析,下面简单介绍一下瑞利衰落信道及两种调制方式的原理。
瑞利衰落信道是一种无线电信号传播环境的统计模型。
这种模型假设信号通过无线信道之后,其信号幅度是随机的,表现为“衰落”特性,并且多径衰落的信号包络服从瑞利分布。
由此,这种多径衰落也称为瑞利衰落。
这一信道模型能够描述由电离层和对流层反射的短波信道,以及建筑物密集的城市环境。
另外,瑞利衰落只适用于从发射机到接收机不存在视距信号的情况。
QPSK是利用载波的四种不同相位差来表征输入的数字信息,是四进制相移键控。
它规定了四种载波相位,分别为45°,135°,225°,275°,调制器输入的数据是二进制数字序列,为了能和四进制的载波相位配合起来,则需要把二进制数据变换为四进制数据,这就是说需要把二进制数字序列中每两个比特分成一组,共有四种组合,即00,01,10,11,其中每一组称为双比特码元。
每一个双比特码元是由两位二进制信息比特组成,它们分别代表四进制四个符号中的一个符号。
QPSK中每次调制可传输2个信息比特,这些信息比特是通过载波的四种相位来传递的。
解调器根据星座图及接收到的载波信号的相位来判断发送端发送的信息比特。
DQPSK调制将信息插入到发送信号的相位差中,若以前一码元相位作为参考,并令△φ为本码元与前一码元的初相差,则信息编码与载波相位变化仍可用QPSK信号相位编码逻辑关系表来表示。
不过,φ应变为△φ。
对于DQPSK而言,可先将输入的双比特码经码型变换,再用码型变换器输出的双比特码进行四相绝对移相,则所得到的输出信号便是四相相对移相信号。
在多径信道下,QPSK的理论误比特率为
DQPSK的理论误比特率为
二、仿真程序设计说明
上图为平坦瑞利衰落信道下QPSK的误码率仿真原理图。
首先使用rand函数产生0到1的随机数,根据随机数的大小,将数据映射为QPSK复包络信号,复包络信号分别对应着不同的相位信息。
使用raylrnd()函数产生服从瑞利分布的随机数,由于在平坦衰落情况下,多径衰落模型可以用乘性失真来表示,因此将信号与瑞利随机数相乘。
根据所输入的归一化信噪比信息,计算出噪声的功率谱密度,产生相对应的高斯随机噪声。
将噪声与信号相加。
然后将经过平坦衰落及高斯信道的信号进行判决,恢复复包络信号,并与加噪声之前信号相比对,统计误比特个数,计算出误码率。
在仿真程序中,为保证数据的准确性,加入while循环语句,使之产生一定数量的错误比特。
下图为平坦瑞利衰落信道下DQPSK的误码率仿真原理图。
相对于QPSK,DQPSK中多了编码部分,后半部分大体一致。
在仿真程序中,与QPSK不同的是,先产生二进制随机序列,然后使用xor函数,将产生的随机数列编码,将编码后的数据按进行奇偶位串并转换,将转换后的数据按一定的规则映射为复包络信号,后面经过瑞利衰落以及加噪声、判决与QPSK一致,最后再使用xor译码恢复原随机序列,然后比对统计误比特个数,计算出误码率。
三、仿真结果
上图为在平坦瑞利衰落信道下两种调制方式的仿真信噪比及理论信噪比。
从图中可以看出,在相同误码率情况下,DQPSK所需Eb/No比QPSK要高2dB左右。
附录:
%RayleighFading.m
clearall;
EbNo1=0:
1:
16;
EbNo2=0:
0.5:
16;
%QPSK调制
fori=1:
length(EbNo1),
pb=qpsk(EbNo1(i));
sim_qpsk_err_bit(i)=pb;
disp(pb);
echooff;
end;
%DQPSK调试
echoon;
fori=1:
length(EbNo1),
pb=dqpsk(EbNo1(i));
sim_dqpsk_err_bit(i)=pb;
disp(pb);
echooff;
end;
%理论曲线
echoon;
fori=1:
length(EbNo2),
EbN0=exp(EbNo2(i)*log(10)/10);
theo_qpsk_err_bit(i)=0.5*(1-1/sqrt(1+1/EbN0));
theo_dqpsk_err_bit(i)=0.5*(1-EbN0/sqrt(EbN0^2+2*EbN0+0.5));
echooff;
end;
semilogy(EbNo2,theo_dqpsk_err_bit,'r'),title('平坦瑞利衰落信道下误码率曲线');holdon;
semilogy(EbNo1,sim_dqpsk_err_bit,'r*-');holdon;
semilogy(EbNo2,theo_qpsk_err_bit,'b');holdon;
semilogy(EbNo1,sim_qpsk_err_bit,'b*-');
xlabel('Eb/No');ylabel('BER');
legend('理论DQPSK','仿真DQPSK','理论QPSK','仿真QPSK');
%qpsk.m
function[pb]=qpsk(EbNo_dB)
N=100;%符号数
Eb=1;
num_err_bit=0;
counter=0;
EbNo=10^(EbNo_dB/10);
sgma=sqrt(Eb/EbNo)/2;
s00=[10];s01=[01];s11=[-10];s10=[0-1];
while(num_err_bit<80)
fori=1:
N,
temp=rand;
if(temp<0.25),
dsource1(i)=0;dsource2(i)=0;
elseif(temp<0.5),
dsource1(i)=0;dsource2(i)=1;
elseif(temp<0.75),
dsource1(i)=1;dsource2(i)=0;
else
dsource1(i)=1;dsource2(i)=1;
end;
end;
fori=1:
N,
ray=raylrnd(0.7);
n=sgma*randn(1,2);
if((dsource1(i)==0)&(dsource2(i)==0)),
r=ray*s00+n;
elseif((dsource1(i)==0)&(dsource2(i)==1)),
r=ray*s01+n;
elseif((dsource1(i)==1)&(dsource2(i)==0)),
r=s10*ray+n;
else
r=s11*ray+n;
end;
c00=dot(r,s00);c01=dot(r,s01);c10=dot(r,s10);c11=dot(r,s11);
c_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;
elsedecis1=1;decis2=1;
end;
if(decis1~=dsource1(i)),num_err_bit=num_err_bit+1;
end;
if(decis2~=dsource2(i)),num_err_bit=num_err_bit+1;
end;
end
counter=counter+1;
end
pb=num_err_bit/(2*N*counter);
%dqpsk.m
function[pb]=dqpsk(EbNo_dB)
N=100;%符号数
Eb=1;
num_err_bit=0;
counter=0;
EbNo=10^(EbNo_dB/10);
sgma=sqrt(Eb/EbNo)/2;
s00=[10];s01=[01];s11=[-10];s10=[0-1];
while(num_err_bit<80)
data_pr=round(rand(1,2*N));
data_com=zeros(1,2*N);
data_mod1=zeros(1,N);
data_mod2=zeros(1,N);
data_demod1=zeros(1,N);
data_demod2=zeros(1,N);
s_rece1=zeros(1,N);
s_rece2=zeros(1,N);
datab_rece=zeros(1,2*N);
dataa_rece=zeros(1,2*N);
data_com
(1)=xor(0,data_pr
(1));
forl=2:
(2*N)
data_com(l)=xor(data_pr(l),data_com(l-1));
end
fori=1:
N
ifdata_com(2*i-1)==0&&data_com(2*i)==0
data_mod1(i)=1,data_mod2(i)=0;
elseifdata_com(2*i-1)==0&&data_com(2*i)==1
data_mod1(i)=0,data_mod2(i)=1;
elseifdata_com(2*i-1)==1&&data_com(2*i)==0
data_mod1(i)=0,data_mod2(i)=-1;
elseifdata_com(2*i-1)==1&&data_com(2*i)==1
data_mod1(i)=-1,data_mod2(i)=0;
end
end
ray=raylrnd(0.7,1,length(data_mod1));
n=sgma*randn(1,length(data_mod1));
s_rece1=data_mod1.*ray+n;
s_rece2=data_mod2.*ray+n;
fork=1:
N
c00=dot([s_rece1(k),s_rece2(k)],s00);
c01=dot([s_rece1(k),s_rece2(k)],s01);
c10=dot([s_rece1(k),s_rece2(k)],s10);
c11=dot([s_rece1(k),s_rece2(k)],s11);
c_max=max([c00,c01,c10,c11]);
if(c00==c_max)
data_demod1(k)=0;data_demod2(k)=0;
elseif(c01==c_max)
data_demod1(k)=0;data_demod2(k)=1;
elseif(c10==c_max)
data_demod1(k)=1;data_demod2(k)=0;
elsedata_demod1(k)=1;data_demod2(k)=1;
end;
datab_rece(2*k-1)=data_demod1(k);
datab_rece(2*k)=data_demod2(k);
end
dataa_rece
(1)=xor(0,datab_rece
(1));
forn=2:
(2*N)
dataa_rece(n)=xor(datab_rece(n),datab_rece(n-1));
end
form=1:
(2*N)
if(dataa_rece(m)~=data_pr(m))
num_err_bit=num_err_bit+1;
end
end
counter=counter+1;
end
pb=num_err_bit/(2*N*counter);