。
,其他
图2-2载波信号
其中,i二1,2,2,4;E为发射信号的每个符号的能量,T为符号持续时间,载波频率f等于nc/T,nc为固定整数。
每一个可能的相位值对应于一个特定的二位组。
例如,可用前述的一组相位值来表示格雷码的一组二位组:
10,00,01,11。
下面介绍QPSI信号的产生和检测。
如果a为典型的QPSKg射机框图。
输入的二进制数据序列首先被不归零(NRZ电平编码转换器转换为极性形式,即负号1和0分别用.Eb和—.Eb表示。
接着,该二进制波形被分接器分成两个分别由输入序列的奇数位偶数位组成的彼此独立的二进制波形,这两个二进制波形分别用al(t),和a2(t)表示。
容易注意到,在任何一信号时间间隔内al(t),
和a2(t)的幅度恰好分别等于Si1和Si2,即由发送的二位组决定。
这两个二进制波形al(t),和a2(t)被用来调制一对正交载波或者说正交基本函数:
1(t)=.'2tcos(2何),2(t)=2tsin(2何)。
这样就得到一对二进制PSK信号。
1(t)和2(t)的正交性使这两个信号可以被独立地检测。
最后,将这两个二进制PSK信号相加,从而得期望的QPSK
2.2QPSK解调部分
,原理框图如图2所示:
2(t)正交信道门限=0
图2-3QPSK的解调
原理分析:
QPSK接收机由一对共输入地相关器组成。
这两个相关器分别提供本地产生地相干参考信号1(t)和2(t)。
相关器接收信号x(t),相关器输出地x1和x2被用来与门限值0进行比较。
如果x1>0,则判决同相信道地输出为符号1;如
果x1<0,则判决同相信道的输出为符号0。
类似地。
如果正交通道也是如此判决输出。
最后同相信道和正交信道输出这两个二进制数据序列被复加器合并,重
新得到原始的二进制序列。
在AWG信道中,判决结果具有最小的负号差错概率。
3、实验结果及分析
根据图2-1和图2-2的流程框图设计仿真程序,得出结果并且分析如下:
3.1、理想信道下的仿真,实验结果如图3所示
O■60
甚帝信号功率谱密空
100
图3-1理想信道下的仿真
实验结果分析:
如图上结果显示,完成了QPSK信号在理想信道上的调制,传输,解调的过程,由于调制过程中加进了载波,因此调制信号的功率谱密度会发生变化。
并且可以看出调制解调的结果没有误码。
3.2、高斯信道下的仿真,结果如图4所示:
00
5
IJj
GPSK恬号星座图<.^n>
辰斯操岁曲裁
5.,
n
-it-
T—
十理主愷〔址射端)*实尿{接脱端、
-1n
图3-2高斯信道下的仿真
实验结果分析:
由图3-2可以得到高斯信道下的调制信号,高斯噪声,调制输出功率谱密度曲线和QPSK信号的星座图。
在高斯噪声的影响下,调制信号的波形发生了明显的变化,其功率谱密度函
数相对于图1中的调制信号的功率谱密度只发生了微小的变化,原因在于高斯噪
声是一个均值为0的白噪声,在各个频率上其功率是均匀的,因此此结果是真确
的。
星座图反映可接收信号早高斯噪声的影响下发生了误码,但是大部分还是保
持了原来的特性。
3.3、先通过瑞利衰落信道再通过高斯信道的仿真。
实验结果如
图5所示:
010D70G3004CI0600
匚
—TI
L'J
020切6DBD100
润制信号功率谱港度(R钟)
QPSKf^号星座图(期£汁沖昕》r,,.
图3-3先通过瑞利衰落信道再通过高斯信道的仿真实验结果分析:
由图3-3可以得到瑞利衰落信道前后的星座图,调制信号的曲线图及其功率
谱密度。
最后显示的是高斯信道和瑞利衰落信道的误码率对比。
由图可知瑞利衰
落信道下的误码率比高斯信道下的误码率高。
至此,仿真实验就全部完成。
参考文献:
[1]陈杰等.MATLAB宝典.电子工业出版社
[2]刘波,文忠,曾涯编.MATLAB信号处理•北京电子工业出版社
[3]万永革•数字信号处理的MATLAB实现•北京科学出版社
[4]网上资料
附录
MATLAB程序
%调相法
clearall
closeall
t=[-1:
0.01:
7-0.01];
tt=length(t);
x1=ones(1,800);
fori=1:
tt
if(t(i)>=-1&t(i)<=1)|(t(i)>=5&t(i)<=7);x1(i)=1;
elsex1(i)=-1;
end
end
t仁[0:
0.01:
8-0.01];
t2=0:
0.01:
7-0.01;
t3=-1:
0.01:
7.1-0.01;
t4=0:
0.01:
8.1-0.01;
tt1=length(t1);
x2=ones(1,800);
fori=1:
tt1
if(t1(i)>=0&t1(i)<=2)|(t1(i)>=4&t1(i)<=8);x2(i)=1;
elsex2(i)=-1;
end
end
f=0:
0.1:
1;
xrc=0.5+0.5*cos(pi*f);
y1=conv(x1,xrc)/5.5;
y2=conv(x2,xrc)/5.5;
n0=randn(size(t2));
f1=1;
i=x1.*cos(2*pi*f1*t);
q=x2.*sin(2*pi*f1*t1);
l=i(101:
800);
Q=q(1:
700);
QPSK=sqrt(1/2).*l+sqrt(1/2).*Q;
QPSK_n=(sqrt(1/2).*l+sqrt(1/2).*Q)+nO;
n1=randn(size(t2));
i_rc=y1.*cos(2*pi*f1*t3);
q_rc=y2.*sin(2*pi*f1*t4);
I_rc=i_rc(101:
800);
Q_rc=q_rc(1:
700);
QPSK_rc=(sqrt(1/2).*I_rc+sqrt(1/2).*Q_rc);
QPSK_rc_n1=QPSK_rc+n1;figure
(1)subplot(4,1,1);plot(t3,i_rc);axis([-18-11]);ylabel('a序列');subplot(4,1,2);plot(t4,q_rc);axis([-18-11]);ylabel('b序列');subplot(4,1,3);plot(t2,QPSK_rc);axis([-18-11]);ylabel('合成序列');subplot(4,1,4);plot(t2,QPSK_rc_n1);axis([-18-11]);ylabel('加入噪声');
%设定T=1,加入高斯噪声
clearall
closeall
%调制
bit_in=randint(1e3,1,[01]);
bit_I=bit_in(1:
2:
1e3);
bit_Q=bit_in(2:
2:
1e3);
data_I=-2*bit_I+1;
data_Q=-2*bit_Q+1;
data_I1=repmat(data_I',20,1);
data_Q1=repmat(data_Q',20,1);
fori=1:
1e4
data_I2(i)=data_I1(i);
data_Q2(i)=data_Q1(i);
end;
f=0:
0.1:
1;
xrc=0.5+0.5*cos(pi*f);
data」2_rc=conv(data」2,xrc)/5.5;
data_Q2_rc=conv(data_Q2,xrc)/5.5;
f1=1;
t1=0:
0.1:
1e3+0.9;
nO=rand(size(t1));
I_rc=data_l2_rc.*cos(2*pi*f1*t1);
Q_rc=data_Q2_rc.*sin(2*pi*f1*t1);
QPSK_rc=(sqrt(1/2).*I_rc+sqrt(1/2).*Q_rc);
QPSK_rc_nO=QPSK_rc+nO;
%解调
I_demo=QPSK_rc_n0.*cos(2*pi*f1*t1);
Q_demo=QPSK_rc_n0.*sin(2*pi*f1*t1);
%低通滤波
I_recover=conv(I_demo,xrc);
Q_recover=conv(Q_demo,xrc);
I=I_recover(11:
10010);
Q=Q_recover(11:
10010);
t2=0:
0.05:
1e3-0.05;
t3=0:
0.1:
1e3-0.1;
%抽样判决
data_recover=[];
fori=1:
20:
10000
data_recover=[data_recoverI(i:
1:
i+19)Q(i:
1:
i+19)];
end;
bit_recover=[];
fori=1:
20:
20000
ifsum(data_recover(i:
i+19))>0
data_recover_a(i:
i+19)=1;
bit_recover=[bit_recover1];
else
data_recover_a(i:
i+19)=-1;
bit_recover=[bit_recover-1];
end
end
error=0;
dd=-2*bit_in+1;
ddd=[dd'];
ddd仁repmat(ddd,20,1);
fori=1:
2e4
ddd2(i)=ddd1(i);
end
fori=1:
1e3
ifbit_recover(i)~=ddd(i)
error=error+1;
end
end
p=error/1000;
figure
(1)
subplot(2,1,1);plot(t2,ddd2);axis([0100-22]);title('原序列');
解调后序列’);
subplot(2,1,2);plot(t2,data_recover_a);axis([0100-22]);title('
%设定T=1,不加噪声
clearall
closeall
%调制
bit_in=randint(1e3,1,[01]);
bit_I=bit_in(1:
2:
1e3);
bit_Q=bit_in(2:
2:
1e3);
data_I=-2*bit_I+1;
data_Q=-2*bit_Q+1;
data_I1=repmat(data_I',20,1);
data_Q1=repmat(data_Q',20,1);
fori=1:
1e4
data_I2(i)=data_I1(i);
data_Q2(i)=data_Q1(i);
end;
t=0:
0.1:
1e3-0.1;
f=0:
0.1:
1;
xrc=0.5+0.5*cos(pi*f);
data」2_rc=conv(data」2,xrc)/5.5;
data_Q2_rc=conv(data_Q2,xrc)/5.5;
f1=1;
t1=0:
0.1:
1e3+0.9;
I_rc=data_l2_rc.*cos(2*pi*f1*t1);
Q_rc=data_Q2_rc.*sin(2*pi*f1*t1);
QPSK_rc=(sqrt(1/2).*I_rc+sqrt(1/2).*Q_rc);
%解调
I_demo=QPSK_rc.*cos(2*pi*f1*t1);
Q_demo=QPSK_rc.*sin(2*pi*f1*t1);
I_recover=conv(I_demo,xrc);
Q_recover=conv(Q_demo,xrc);
I=I_recover(11:
10010);
Q=Q_recover(11:
10010);
t2=0:
0.05:
1e3-0.05;
t3=0:
0.1:
1e3-0.1;
data_recover=[];
fori=1:
20:
10000
data_recover=[data_recoverI(i:
1:
i+19)Q(i:
1:
i+19)];
end;
ddd=-2*bit_in+1;
ddd1=repmat(ddd',10,1);
fori=1:
1e4
ddd2(i)=ddd1(i);
end
figure
(1)
subplot(4,1,1);plot(t3,l);axis([020-66]);
subplot(4,1,2);plot(t3,Q);axis([020-66]);
subplot(4,1,3);plot(t2,data_recover);axis([020-66]);
subplot(4,1,4);plot(t,ddd2);axis([020-66]);
%QPSK误码率分析
SNRindB仁0:
2:
10;
SNRindB2=0:
0.1:
10;
fori=1:
length(SNRindB1)
[pb,ps]=cm_sm32(SNRindB1(i));smld_bit_err_prb(i)=pb;smld_symbol_err_prb(i)=ps;
end;
fori=1:
length(SNRindB2)
SNR=exp(SNRindB2(i)*log(10)/10);theo_err_prb(i)=Qfunct(sqrt(2*SNR));end;
title('QPSK误码率分析');
semilogy(SNRindB1,smld_bit_err_prb,'*');
axis([01010e-81]);
holdon;
%semilogy(SNRindB1,smld_symbol_err_prb,'o');semilogy(SNRindB2,theo_err_prb);
legend('仿真比特误码率','理论比特误码率');
holdoff;
function[y]=Qfunct(x)
y=(1/2)*erfc(x/sqrt
(2));
function[pb,ps]=cm_sm32(SNRindB)N=10000;
E=1;
SNR=10A(SNRindB/10);
sgma=sqrt(E/SNR)/2;
s00=[10];
s0仁[01];
si仁[-10];
s10=[0-1];
fori=1:
N
dsource1(i)=[1011000101101011];
numofsymbolerror=0;
numofbiterror=0;
fori=1:
N
n=sgma*randn(size(sOO));
if((dsource1(i)==0)&(dsource2(i)==0))
r=sOO+n;
elseif((dsource1(i)==0)&(dsource2(i)==1))
r=s01+n;
elseif((dsource1(i)==1)&(dsource2(i)==0))
r=s10+n;
else
r=s11+n;
end;
cOO=dot(r,sOO);
cO仁dot(r,s01);
c10=dot(r,s10);
c11=dot(r,s11);
c_max=max([cOOc01c10c11]);
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;
symbolerror=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;
end;
ps=numofsymbolerror/N;
pb=numofbiterror/(2*N);