写在前面:本博文是《深入浅出通信原理》的学习笔记,仅供个人学习记录使用
文章目录
一、从频域角度理解调制过程
先回顾一下用实数运算实现BPSK调制的框图:

还记得我们讲BPSK调制的时候,都是假的与 c o s ω 0 t cosω_0t cosω0t相乘的都是直流分量+1或-1,但是真实传输过程中往往没有那么简单,经常会是一些非周期信号。我们假设 x ( t ) x(t) x(t)的频谱如下所示:

我们通过上篇博文学习到的傅里叶变换,看看这个非周期的复杂信号
x
(
t
)
x(t)
x(t)和余弦载波
c
o
s
ω
0
t
cosω_0t
cosω0t相乘之后的频谱有什么特征:
X
′
(
ω
)
=
∫
−
∞
+
∞
x
(
t
)
c
o
s
ω
0
t
e
−
j
ω
t
d
t
=
∫
−
∞
+
∞
x
(
t
)
1
2
(
e
j
ω
0
t
+
e
−
j
ω
0
t
)
e
j
ω
t
d
t
=
1
2
∫
−
∞
+
∞
x
(
t
)
e
j
(
ω
0
−
ω
)
t
d
t
+
1
2
∫
−
∞
+
∞
x
(
t
)
e
−
j
(
ω
+
ω
0
)
t
d
t
=
1
2
∫
−
∞
+
∞
x
(
t
)
e
−
j
(
ω
−
ω
0
)
t
d
t
+
1
2
∫
−
∞
+
∞
x
(
t
)
e
−
j
(
ω
+
ω
0
)
t
d
t
=
1
2
X
(
ω
−
ω
0
)
+
1
2
X
(
ω
+
ω
0
)
\begin{aligned} X'(ω) &= \int_{-∞}^{+∞}x(t)cosω_0te^{-jωt}dt\\ &=\int_{-∞}^{+∞}x(t)\frac{1}{2}(e^{jω_0t} + e^{-jω_0t})e^{jωt}dt\\ &=\frac{1}{2}\int_{-∞}^{+∞}x(t)e^{j(ω_0 - ω)t}dt + \frac{1}{2}\int_{-∞}^{+∞}x(t)e^{-j(ω + ω_0)t}dt\\ &=\frac{1}{2}\int_{-∞}^{+∞}x(t)e^{-j(ω - ω_0)t}dt + \frac{1}{2}\int_{-∞}^{+∞}x(t)e^{-j(ω + ω_0)t}dt\\ &=\frac{1}{2}X(ω - ω_0) + \frac{1}{2}X(ω + ω_0) \end{aligned}
X′(ω)=∫−∞+∞x(t)cosω0te−jωtdt=∫−∞+∞x(t)21(ejω0t+e−jω0t)ejωtdt=21∫−∞+∞x(t)ej(ω0−ω)tdt+21∫−∞+∞x(t)e−j(ω+ω0)tdt=21∫−∞+∞x(t)e−j(ω−ω0)tdt+21∫−∞+∞x(t)e−j(ω+ω0)tdt=21X(ω−ω0)+21X(ω+ω0)
通过对
x
(
t
)
c
o
s
ω
0
t
x(t)cosω_0t
x(t)cosω0t的傅里叶变换,我们发现:当信号
x
(
t
)
x(t)
x(t)与
c
o
s
ω
0
t
cosω_0t
cosω0t相乘之后,相当于将
x
(
t
)
x(t)
x(t)的频谱
X
(
ω
)
X(ω)
X(ω)一分为二,分别向左和向右移动
ω
0
ω_0
ω0(也要注意幅度的变换:二分之一!)
【注意:如果频谱用的是 X ( f ) X(f) X(f)表示,那么就相当于 X ( f ) X(f) X(f)一分为二,分别向左和向右移动f】!
那么乘上了载波 c o s ω 0 t cosω_0t cosω0t之后的频谱变为:

1.1 调制过程中频谱变化的Matlab展示
我们先来看看一个脉冲宽度为1的矩形波和频率 f c f_c fc = 5Hz的载波相乘的频谱变化:
%%%下面先从时域上来看看x(t)与余弦载波相乘的结果:%%%
subplot(3,1,1);
t = -1.5:0.01:1.5;
y = rectpuls(t, 1);
plot(t, y);
axis([-1.5 1.5 -0.5 1.5]);
grid on;
subplot(3,1,2);
carrier = cos(2*pi*5*t); %fc = 5;
plot(t, carrier);
grid on;
axis([-1.5 1.5 -1.5 1.5]);
subplot(3,1,3);
st = y.*carrier;
plot(t, st);
grid on;
axis([-1.5 1.5 -1.5 1.5]);

从之前的学习中我们知道:矩形波信号的频谱是:
X
(
f
)
=
τ
s
i
n
c
(
τ
f
)
X(f) = τsinc(τf)
X(f)=τsinc(τf)
其中,
τ
τ
τ是脉冲宽度,那么对于上面这个脉冲宽度为1的矩形波
x
(
t
)
x(t)
x(t),它的频谱就可以表示为:
s
i
n
c
(
f
)
sinc(f)
sinc(f),代码如下:
figure(2);
k = -12:0.001:12;
xf = sinc(k);
plot(k, xf);
axis([-12,12,-0.3,1]);
grid on;

它与载波相乘之后, X ′ ( f ) X'(f) X′(f)相当于原频谱一分为二,分别向左和向右移动f的过程,因此,有:
figure(3);
xf_new = 0.5.*sinc(k - 5) + 0.5*sinc(k + 5);
plot(k, xf_new);
axis([-12,12,-0.3,1]);
grid on;

为了便于对比,我们将这两个频谱放到一起:

1.2从频域角度看x(t)与余弦载波相乘
关于从时域上理解BPSK调制解调,可以参考:
【通信原理 入坑之路】 —— 深入理解BPSK调制和解调的全过程及其Matlab实现
时域上,将
x
(
t
)
x(t)
x(t)信号和余弦载波
c
o
s
ω
0
t
cosω_0t
cosω0t相乘的时域波形是这样的:

下面,我们从三维空间看看正负脉冲和余弦载波相乘的频谱:
%下面是正脉冲的情况%
f = -9:0.001:-1;
x = 0.5*sinc(f+5);
fill3(x,f,0*f,'r');
hold on;
f = 1:0.001:9;
x = 0.5*sinc(f - 5);
xlabel('x'); ylabel('f'); zlabel('y')
grid on;
fill3(x,f,0*f,'r');
set(gca, 'YDir', 'reverse');

%下面是负脉冲的情况%
f = -9:0.001:-1;
x = -0.5*sinc(f+5);
fill3(x,f,0*f,'r');
hold on;
f = 1:0.001:9;
x = -0.5*sinc(f - 5);
xlabel('x'); ylabel('f'); zlabel('y')
grid on;
fill3(x,f,0*f,'r');
set(gca, 'YDir', 'reverse');

1.3 从频域角度看x(t)与正弦载波相乘
我们看看Q路信号与正弦载波 s i n ( ω 0 t ) sin(ω_0t) sin(ω0t)相乘的频谱变化:

X
′
(
ω
)
=
∫
−
∞
+
∞
x
(
t
)
s
i
n
ω
0
t
e
−
j
ω
t
d
t
=
∫
−
∞
+
∞
x
(
t
)
(
−
j
2
)
(
e
j
ω
0
t
−
e
−
j
ω
0
t
)
e
−
j
ω
t
d
t
=
∫
−
∞
+
∞
x
(
t
)
(
−
j
2
)
e
j
(
ω
0
−
ω
)
t
d
t
+
∫
−
∞
+
∞
x
(
t
)
j
2
e
−
j
(
ω
0
+
ω
)
t
d
t
=
∫
−
∞
+
∞
x
(
t
)
(
−
j
2
)
e
−
j
(
ω
−
ω
0
)
t
d
t
+
∫
−
∞
+
∞
x
(
t
)
j
2
e
−
j
(
ω
0
+
ω
)
t
d
t
=
−
j
2
X
(
ω
−
ω
0
)
+
j
2
X
(
ω
+
ω
0
)
\begin{aligned} X'(ω) &= \int_{-∞}^{+∞}x(t)sinω_0te^{-jωt}dt\\ &=\int_{-∞}^{+∞}x(t)(-\frac{j}{2})(e^{jω_0t} - e^{-jω_0t})e^{-jωt}dt\\ &=\int_{-∞}^{+∞}x(t)(-\frac{j}{2})e^{j(ω_0 - ω)t}dt + \int_{-∞}^{+∞}x(t)\frac{j}{2}e^{-j(ω_0 + ω)t}dt\\ &=\int_{-∞}^{+∞}x(t)(-\frac{j}{2})e^{-j(ω - ω_0)t}dt + \int_{-∞}^{+∞}x(t)\frac{j}{2}e^{-j(ω_0 + ω)t}dt\\ &=-\frac{j}{2}X(ω - ω_0) + \frac{j}{2}X(ω + ω_0) \end{aligned}
X′(ω)=∫−∞+∞x(t)sinω0te−jωtdt=∫−∞+∞x(t)(−2j)(ejω0t−e−jω0t)e−jωtdt=∫−∞+∞x(t)(−2j)ej(ω0−ω)tdt+∫−∞+∞x(t)2je−j(ω0+ω)tdt=∫−∞+∞x(t)(−2j)e−j(ω−ω0)tdt+∫−∞+∞x(t)2je−j(ω0+ω)tdt=−2jX(ω−ω0)+2jX(ω+ω0)
我们发现,信号与正弦载波
s
i
n
(
ω
0
t
)
sin(ω_0t)
sin(ω0t)相乘,频谱的变化有两个:
- 原频谱 X ( f ) X(f) X(f)一分为二,分别向左和向右平移f个单位
- 向右平移的频谱需要在徐虚轴平面顺时针旋转90°;向左平移的频谱需要在虚轴平面逆时针旋转90°
下面我们从三维角度看看信号与正弦载波相乘的频谱:
%下面是正脉冲的情况%
f = -9:0.001:-1;
st1 = 0.5*sinc(f+5);
fill3(0*f,f,st1, 'b');
grid on;
hold on;
f = 1:0.001:9;
st2 = -0.5*sinc(f-5);
fill3(0*f,f,st2,'b');
grid on;
set(gca,'YDir','reverse');

下面,我们将I路信号与余弦载波 c o s ω 0 t cosω_0t cosω0t相乘的频谱、Q路信号与 s i n ( ω 0 t ) sin(ω_0t) sin(ω0t)相乘的频谱画在一起:

1.4 QPSK调制的频谱
首先对下面的代码进行一些解释:
我们在本博客里面的仿真,比如说BPSK调制解调还是QPSK调制解调的频域分析,我们都默认I路,Q路信号都是脉冲宽度为1的矩形波,因此,I路信号和Q路信号的频谱都可以用sinc函数表示。
因此,下面代码中的xf_cos就表示:
I
c
o
s
(
ω
0
t
)
Icos(ω_0t)
Icos(ω0t)的频谱,xf_sin就表示
Q
s
i
n
(
ω
0
t
)
Qsin(ω_0t)
Qsin(ω0t)的频谱
或者我们这样想:
I
c
o
s
(
ω
0
t
)
Icos(ω_0t)
Icos(ω0t)的频谱就是上图那些红色的图,
Q
s
i
n
(
ω
0
t
)
Qsin(ω_0t)
Qsin(ω0t)的频谱就是上图那些蓝色的图,那么由于
s
(
t
)
=
I
c
o
s
(
ω
0
t
)
+
Q
s
i
n
(
ω
0
t
)
s(t) = Icos(ω_0t) + Qsin(ω_0t)
s(t)=Icos(ω0t)+Qsin(ω0t)因此,频谱也是对应地叠加。(向量相加)
那么,我们只需要将这两个频谱叠加(类似于向量的合成),那么我们就可以得到调制信号的频谱了
%发送数据10
subplot(2,2,1);
a = 1/sqrt(2);
f = -9:0.001:-1;
xf_cos = 0.5*a*sinc(f+5);
xf_sin = 0.5*a*sinc(f+5);
fill3(xf_cos,f,xf_sin,'g');
hold on;
f = 1:0.001:9;
xf_cos = 0.5*a*sinc(f-5);
xf_sin = -0.5*a*sinc(f-5);
fill3(xf_cos,f,xf_sin,'g');
grid on;
set(gca,'YDir','reverse');
title('发送数据10');
%发送数据11
subplot(2,2,2);
f = -9:0.001:-1;
xf_cos = -0.5*a*sinc(f+5);
xf_sin = 0.5*a*sinc(f+5);
fill3(xf_cos,f,xf_sin,'g');
hold on;
f = 1:0.001:9;
xf_cos = -0.5*a*sinc(f-5);
xf_sin = -0.5*a*sinc(f-5);
fill3(xf_cos,f,xf_sin,'g');
grid on;
set(gca,'YDir','reverse');
title('发送数据11');
%发送数据01
subplot(2,2,3);
f = -9:0.001:-1;
xf_cos = -0.5*a*sinc(f+5);
xf_sin = -0.5*a*sinc(f+5);
fill3(xf_cos,f,xf_sin,'g');
hold on;
f = 1:0.001:9;
xf_cos = -0.5*a*sinc(f-5);
xf_sin = 0.5*a*sinc(f-5);
fill3(xf_cos,f,xf_sin,'g');
grid on;
set(gca,'YDir','reverse');
title('发送数据01');
%发送数据00
subplot(2,2,4);
f = -9:0.001:-1;
xf_cos = 0.5*a*sinc(f+5);
xf_sin = -0.5*a*sinc(f+5);
fill3(xf_cos,f,xf_sin,'g');
hold on;
f = 1:0.001:9;
xf_cos = 0.5*a*sinc(f-5);
xf_sin = 0.5*a*sinc(f-5);
fill3(xf_cos,f,xf_sin,'g');
grid on;
set(gca,'YDir','reverse');
title('发送数据00');
【这里还需要特别说明一个问题】:大家现在要记得QPSK的映射关系:
输入二进制信号 | I, Q信号 |
---|---|
00 | + 1 2 \frac{1}{\sqrt{2}} 21, + 1 2 \frac{1}{\sqrt{2}} 21 |
01 | - 1 2 \frac{1}{\sqrt{2}} 21,+ 1 2 \frac{1}{\sqrt{2}} 21 |
11 | - 1 2 \frac{1}{\sqrt{2}} 21,- 1 2 \frac{1}{\sqrt{2}} 21 |
10 | + 1 2 \frac{1}{\sqrt{2}} 21,- 1 2 \frac{1}{\sqrt{2}} 21 |
那么,对于上面的程序,当输入10时,由于我们在和载波 s i n ( ω 0 t ) sin(ω_0t) sin(ω0t)相乘时还需要对Q路信号乘上一个负号,因此,当Q路信号是负数时,相当于一个正的脉冲和 s i n ( ω 0 t ) sin(ω_0t) sin(ω0t),那么问题来了:我们解调的时候,如果接收端Q路信号乘以的本地载波是 s i n ( ω 0 t ) sin(ω_0t) sin(ω0t),那么此时解调出来的应该是-Q!!
这个问题我们一会儿会遇到。
二、从频域角度理解解调
我们从BPSK解调入手,还记得我们在之前的博文中从时域上分析BPSK解调吗:
对接收到的
s
(
t
)
=
x
(
t
)
c
o
s
ω
0
t
s(t) = x(t)cosω_0t
s(t)=x(t)cosω0t,我们对它再乘以个本地载波
c
o
s
ω
0
t
cosω_0t
cosω0t,然后通过一个周期内积分再乘以2就可以解调出信号,那么,用低通滤波器的方法是什么原理呢?

这是 x ( t ) x(t) x(t)经过BPSK调制,乘上了载波信号之后,在解调端再乘上了本地余弦信号之后的结果,仅仅靠乘上 c o s ω 0 t cosω_0t cosω0t,似乎还并不能分离出 x ( t ) x(t) x(t),而低通滤波器,就可以把高频成分滤去,只留下 x ( t ) x(t) x(t)。
因此,调制解调的原理如下:

其中,我们使用的低通滤波器的内部结构如下图所示:

2.1 频域角度理解QPSK解调
还是以发送信号10为例:
我们把
s
(
t
)
s(t)
s(t)分别在接收端乘以
c
o
s
(
ω
0
t
)
cos(ω_0t)
cos(ω0t)和
s
i
n
(
ω
0
t
)
sin(ω_0t)
sin(ω0t),我们来看看解调结果:
我们还是来回顾一下发送信号10时, s ( t ) s(t) s(t)的频谱:
figure(1);
a = 1/sqrt(2);
f = -6:0.001:-4;
xf = 0.5*a*sinc(f+5);
yf = 0.5*a*sinc(f+5);
fill3(xf,f,yf,'b');
hold on;
f = 4:0.001:6;
xf = 0.5*a*sinc(f-5);
yf = -0.5*a*sinc(f-5);
fill3(xf,f,yf,'b');
grid on;
axis([-0.6 0.6 -12 12 -0.6 0.6]);
set(gca,'YDir','reverse');
line([0 0],[-12 12],[0 0]);

对这个 s ( t ) s(t) s(t)信号再乘上 c o s ( ω 0 t ) cos(ω_0t) cos(ω0t),我们可以这样理解,把上图这两个蓝色分量分别乘上 c o s ( ω 0 t ) cos(ω_0t) cos(ω0t),然后进行向量合成,最后效果应该是这样:
f = -11:0.001:-9;
xf = 0.25*a*sinc(f+10);
yf = 0.25*a*sinc(f+10);
fill3(xf,f,yf,'b');
hold on;
f = 9:0.001:11;
xf = 0.25*a*sinc(f-10);
yf = -0.25*a*sinc(f-10);
fill3(xf,f,yf,'b');
hold on;
f = -1:0.001:1;
xf = 0.25*a*sinc(f)+0.25*a*sinc(f);
yf = 0.25*a*sinc(f)-0.25*a*sinc(f);
fill3(xf,f,yf,'b');
grid on;
set(gca,'YDir','reverse');
axis([-0.6 0.6 -12 12 -0.6 0.6]);
line([0 0],[-12 12],[0 0]);

然后,将这个信号经过傅里叶变换得到上面这个频谱,经过低通滤波器就可以得到+I信号了
下面我们来看看
s
(
t
)
s(t)
s(t)乘上
s
i
n
(
ω
0
t
)
sin(ω_0t)
sin(ω0t)的结果:
figure(2);
%下面开始解调
a = 1/sqrt(2);
f = -11:0.001:-9;
xf = 0.25*a*sinc(f+10);
yf = -0.25*a*sinc(f+10);
fill3(xf,f,yf,'b');
hold on;
f = -1:0.001:1;
xf = 0.25*a*sinc(f);
yf = 0.25*a*sinc(f);
fill3(xf,f,yf,'b');
grid on;
axis([-0.6 0.6 -12 12 -0.6 0.6]);
set(gca,'YDir','reverse');
line([0 0],[-12 12],[0 0]);
figure(3);
f = -1:0.001:1;
xf = 0.25*a*sinc(f);
yf = -0.25*a*sinc(f);
fill3(xf,f,yf,'b');
hold on;
f = 9:0.001:11;
xf = -0.25*a*sinc(f-10);
yf = -0.25*a*sinc(f-10);
fill3(xf,f,yf,'b');
grid on;
axis([-0.6 0.6 -12 12 -0.6 0.6]);
set(gca,'YDir','reverse');
line([0 0],[-12 12],[0 0]);
figure(4);
f = -11:0.001:-9;
xf = -0.25*a*sinc(f+10);
yf = 0.25*a*sinc(f+10);
fill3(xf,f,yf,'b');
hold on;
f = 9:0.001:11;
xf = -0.25*a*sinc(f-10);
yf = 0.25*a*sinc(f-10);
fill3(xf,f,yf,'b');
hold on;
f = -1:0.001:1;
xf = 0.25*a*sinc(f)+0.25*a*sinc(f);
yf = 0.25*a*sinc(f)-0.25*a*sinc(f);
fill3(xf,f,yf,'b');
grid on;
set(gca,'YDir','reverse');
axis([-0.6 0.6 -12 12 -0.6 0.6]);
line([0 0],[-12 12],[0 0]);
我们最后得到的频谱是:

再经过低通滤波器滤去高频分量,就可以得到-Q信号了。最后再取个负,我们就正式完成了I, Q的解调了!