QPSK调制解调
QPSK即正交相移调制。
在看QPSK之前,先看一下通信系统的调制解调的过程
为了方便分析,先假设这里是理想信道,没有噪声,接收端已经载波同步,位同步。
调制后的信号数学模型为:
上述的x(t)被调制到了A,ϕ上。
如果调制信息在A上,就是调幅,如果调制信息在 上,就是调相。
QPSK正是通过调整 的变化,来传输信息。 分别取 4个相位表示00,01,10,11表示4个信息。
调制后的信号数学模型为:
上述的x(t)被调制到了A,ϕ上。
如果调制信息在A上,就是调幅,如果调制信息在 上,就是调相。
QPSK正是通过调整 的变化,来传输信息。 分别取 4个相位表示00,01,10,11表示4个信息,调制后的信号表达式为:
这样的话,我们调制任何一个信号,都可以转化为调制在同一时刻的两路上的幅度调制后再相加合并为一路输出,而调制模型 中任意的A和 ,根据正交分解的原理,又可以分解到两个相互正交个坐标轴上,这就是星座映射、IQ分路的本质原理。又由于 ,所有我们又经常把需要IQ分路的调制用 这样的复数来表示,也经常说IQ分别是实部,虚部。当然这么说是不准确的,IQ两路就是同相和正交,而且默认的调制模型是 ,以上才成立。
就拿发送10这个信号来说,最后推导出要发送这个信号调制后的信号为
调制过程就是先进行星座映射,10映射为(-1-j)/sqrt(2),映射到IQ两路为I路
-1/sqrt(2),Q路为-1/sqrt(2),然后I路乘以cos(wct),Q路乘以sin(wct),然后相加。
当然这里在乘以载波前,要先进行信道成形,比如1在一个码元周期内用cos(wct)来表示,在数字信号里,是一个矩形信号rect(t-nT)与cos(wct)相乘,这里的rect(t-nT)其实就是信道成形,但通常不用rect(t-nTs)来做成形,因为rect在符号的改变点,波形会发生突变,且考虑到发送端的成形滤波要和接收端的匹配滤波要配合使用,常用根升余弦滤波器来做发送端成形滤波。
由于采用的成型滤波器是线性相位移动的FIR滤波器,卷积后,原信号发生了线性相位移动,且长度增加,所以要进行截取,截取的方法为:
y_temp=conv(x,h);
x_len=length(x);
h_len=length(h);
y_temp_len=x_len+h_len-1;
y_len=x_len;
y_len_start=floor(y_temp_len/2)+1;
y_len_end=y_len_start+y_len-1;
y=y_temp(y_len_start:y_len_end);
其实实际的通信数据是有帧头,不需这样截位。
在信道是理想信道,即没有噪声,且载波、位同步的情况下,接收到已调信号 ,解调就是接收的混频信号经过下变频到基带信号后,从基带信号中提取A和 这两个信息的过程。从数学的角度来看,我们把解调后的基带信号表示成是一个复数信号,a+jb,他就同时含有幅度A和相位 两个信息了,其幅度 ,相位 ,那么我们只要得到解调信号的实部和虚部就可以了。按照前面发送端分析的结果,在接收端要提取实部和虚部,就是要进行IQ两路信号,而IQ两路信号的提取,可以按照发送端生成的逆过程来做,即I路乘以cos,经过LPF,Q路乘以sin,经过LPF
解调的框图为:
其中下变频的低通滤波器和匹配滤波器可以合并为一个滤波器,由于发送端的成形滤波用的是根升余弦滤波器,那么接收端的合并的滤波器也可以用和发送端相同的根升余弦滤波器。
接收端接收到的 信号,分别乘以cos和sin
I路:
Q路:
然后在经过LPF,就是
I路:
Q路:
QPSK调制解调仿真的各个参数:
码速率:1MHz
成形滤波器类型:平方根升余弦滤波器
成形滚降因子:0.8
采样频率:8MHz
载波频率:2MHz
仿真长度:4000
调制方式:QPSK
仿真代码:
clear all;
clc;
fid=fopen('data\\data.txt','r');
x=fscanf(fid,'%d');
fclose(fid);
x=conj(x');
len=length(x);
if mod(len,2)==1
x=[x 0];
len=len+1;
end
len0=len/2;
for i=1:len0
if x(2*i-1)==0 && x(2*i)==0
I(i)=1/sqrt(2);
Q(i)=1/sqrt(2);
elseif x(2*i-1)==0 && x(2*i)==1
I(i)=-1/sqrt(2);
Q(i)=1/sqrt(2);
elseif x(2*i-1)==1 && x(2*i)==0
I(i)=-1/sqrt(2);
Q(i)=-1/sqrt(2);
else
I(i)=1/sqrt(2);
Q(i)=-1/sqrt(2);
end
end
ps=1e6;
fs=8e6;
a=0.8;
fc=2e6;
rate=fs/ps;
n_T=2;
T=1;
h=rcosfir(a,n_T,rate,T,'sqrt');
for i1=1:len0
for i2=1:rate
if i2==1
I_fs(rate*i1-rate+1)=I(i1);
Q_fs(rate*i1-rate+1)=Q(i1);
else
I_fs(rate*i1-rate+i2)=0;
Q_fs(rate*i1-rate+i2)=0;
end
end
end
IQ_len=len0*rate;
h_len0=length(h);
h_len=floor(h_len0/2)+1;
IQ_len1=IQ_len+h_len-1;
s0_I=conv(I_fs,h);
s0_Q=conv(Q_fs,h);
s1_I=s0_I(h_len:IQ_len1);
s1_Q=s0_Q(h_len:IQ_len1);
t=0:1/fs:(IQ_len-1)/fs;
sc_I=cos(2*pi*fc*t);
sc_Q=sin(2*pi*fc*t);
s_I=s1_I.*sc_I;
s_Q=s1_Q.*sc_Q;
s=s_I+s_Q;
r=s;
r0_I=r.*sc_I;
r0_Q=r.*sc_Q;
r1_I=conv(r0_I,h);
r1_Q=conv(r0_Q,h);
r2_I=r1_I(h_len:IQ_len1);
r2_Q=r1_Q(h_len:IQ_len1);
r2=r2_I+j*r2_Q;
scatterplot(r2,rate,rate,'b.');
|