Ch3nyang's blog

home

home

person

about

hive

project

collections_bookmark

mindclip

rss_feed

rss

星座图解释与应用

calendar_month 2022-02
archive 通信
tag constellation

什么是星座图?

直观理解星座图

我们知道,信号的调制可以分为两类:模拟调制和数字调制。其中,模拟调制包含 AM、FM、PM 等;数字调制包含 PSK、FSK、MSK、QAM 等。

不论哪种调制方式,改变的无非是信号的三个变量:幅度、频率、相位。AM 会改变幅度,而 FM 和 PM 会改变相位角(FM 度量的是相位变化率)。因此,我们可以使用幅度和相位角来描述一种调制方式。极坐标图就是查看幅度和相位角的一种方式。

constellation1

对于坐标系中的一点,相位角即为该点与水平轴所成的角度,幅度为该点与原点的距离。

在实际处理时,我们会使用 I/Q 图。

constellation2

I 值即为该点横坐标,Q 值即为该点纵坐标。发送信号时,分别产生 I 信号和 Q 信号,将 Q 信号旋转 90 度后(使得两信号正交),合成发送。解调时,同样是把合成的信号分解为 I 信号和 Q 信号。如图所示(仅供示意)。

constellation3

由上述内容我们可以总结出,对于任意编码方式,每种码元都是星座图上的一个点。发送时,根据码元的内容发送相应的点(也就是这个点表示的信号);接收时,根据收到的点得到码元。

为了在接收时更好的区分每个点的位置,我们需要使得任意两个点之间离得尽可能远。例如对于 BPSK,

constellation4

而对于有 4 个点的 QPSK,则为

constellation5

当然,由于干扰、噪声的存在,接收端收到的点并不总是在理想位置。下面三幅图是 6 bit 码元不同状态下的图,白色圆圈为理想位置,而红色点为接收到的位置。

来自 AN-005-Constellation-Diagrams-and-How-They-Are-Used

因此,判断时会使用最大似然判决准则判断。换句话说,就是找距离最近的理想点。通常,我们使用划分决策边界的方法去寻找最近的理想点。例如,对于 2PSK,图中淡蓝色的区域即为 1 的决策区域。

constellation7

再如上面提到的 QPSK,图中淡蓝色的区域即为 10 的决策区域。

constellation8

然而,实际接收到的位置和理想位置不完全相同同,因此产生了角度误差和幅度误差。

constellation9

数学理解星座图

设有 \(M\) 个定义在 \([0,T)\) 上的有限能量实信号 \(S=\left\{s_1(t),\cdots,s_M(t)\right\}\)。通过 Gram-Schmidt orthogonalization procedure,表示为 \(N\leq M\) 个 real orthonormal basis functions \(\left\{\phi_1(t),\cdots,\phi_N(t)\right\}\)。我们令这些 basis functions 组成的集合为 \(S\)。则有对于任意 \(s_i(t)\in S\),其可以写成

\[s_i(t)=\sum\limits_{j=1}^{N}s_{ij}\phi_j(t),0\leq t<T\]

其中,

\[s_{ij}=\int_{0}^{T}s_i(t)\phi_j(t)\mathrm{d}t\]

是将 \(s_i(t)\) 投影到 \(\phi_j(t)\) 上得到的实系数。

令 \(s_i=(s_{i1},\cdots,s_{iN})\in\mathbb{R}^N\),称其为 signal constellation point(信号星座点)。\(M\) 个信号星座点 \(\left\{s_1,\cdots,s_M\right\}\) 构成 signal constellation(信号星座图)。

显然,如果我们确定了所有的 \(\phi_j(t)\),那么就可以将 \(s_i(t)\) 和 \(s_i\) 互相转换。\(s_i(t)\) 用 \(s_i\) 表示被称为 signal space presentation,包含信号星座图的向量空间被称为 signal space。

换句人话说,就是把原来的一组向量用另外一组向量去表示。

我们在前文的所有星座图均为 \(s_i\in\mathbb{R}^2\) 上的星座图——通常的星座图也几乎都是二维的,也就是将所有的信号都用另外的两个信号去表示,这样可以使得发送和接收更加容易。

IQ 调制解调原理

前文提到,信号的收发是通过 IQ 信号合成再拆解来进行的。具体是怎样的过程呢?

constellation10

如图所示。在调制时,I 信号和 Q 信号合成为 \(I\cos{\omega_0t}-Q\sin{\omega_0t}\)。为了方便计算,I 信号和 Q 信号通常表示为复信号 \(I+jQ\)。于是,调制的过程相当于该信号乘以 \(e^{j\omega_0t}\) 得到的实部。即,

\[\Re{(I+jQ)e^{j\omega_0t}}=I\cos{\omega_0t}-Q\sin{\omega_0t}\]

解调时,由于收到的信号是连续的,而我们需要的是离散的值,因此我们需要对一个周期内的信号积分求平均值。例如对于 I 信号。

\[I=\frac{2}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}s(t)\cos{\omega_0t}\mathrm{d}t\]

其中,\(T\) 为周期。Q 信号的接收同理。

下面,我们利用 IQ 调制解调原理来考察 QPSK。我们分别考虑下面四种四种码元所对应的 IQ 坐标,计算信号的相位:

码元 I Q \(s(t)\) 相位
00 +A +A \(\frac{\pi}{4}\)
01 -A +A \(\frac{3\pi}{4}\)
11 -A -A \(\frac{5\pi}{4}\)
10 +A -A \(\frac{7\pi}{4}\)

观察这四个 IQ 坐标和相位,这正好是我们之前 QBSK 星座图的四个点的角度。

constellation11

有一个问题是:为什么 11 对应 (-A,-A)10 对应 (+A,-A),而不是按照顺序的 10 对应 (-A,-A)11 对应 (+A,-A) 呢?这其实是格雷码在起作用。我们知道,对于一个码元,如果其传输过程中发生错误,那么最可能被误判为相邻的两个决策区域。例如对于上图的 11,其更可能被误判为 01 或者 10。在上图的情况下,无论哪一个码元传输出现错误,都只会影响到 1 个 bit。

然而,如果 10 对应 (-A,-A)11 对应 (+A,-A),则如下图所示:

constellation12

如果 11 错误的传为 00,或者 01 错误的传为了 10,则一下子要错 2 个 bit!

现在 QPSK 搞清楚了,那 BPSK 只有 2 个状态怎么办呢?很简单,只要 I 取 +A-A,而 Q 置零就可以了。由此得到了 2 个点 (+A,0)(-A,0)

constellation13

还有一个要解决的问题是,A 取值多少。我们前面说过,对于星座图,传输的其实是点的角度、到原点的距离。为了方便处理,我们通常会使距离设为整数。例如在 BPSK 中,A=1;在 QPSK 中,我们使四个点落在单位圆上,得到 \(A=\frac{\sqrt{2}}{2}\)。

同理,对于 8PSK,我们使得 8 个点均匀分布在单位圆上即可:

constellation14

如果点更多了,比如 16QAM 呢?如下图所示。

constellation15

我们依然使用格雷码减小错误传输带来的影响。同时,为了使每个点尽可能隔开,其坐标取 -3A、-A、+A、+3A。

如果你仔细思考过,16QAM 还可以在原点放一点、周围围两个环,这样也可以满足每个点尽量隔开的要求。然而,这样做会产生一个问题:量化困难——即,无法很好地表示理想点坐标,造成运算处理的问题。

最后,我们考虑 MASK 的星座图。MASK 载波频率和相位为一常数,我们默认相位为 0。则点将会分布在 I 轴上。如图所示。

constellation16

Matlab 模拟星座图

对于 QAM,我们以 64QAM 为例:

A = randi([0, 63], 1, 1000); % 16 进制,100 个码元
stem(A);
B = qammod(A, 64); % 64QAM 调制
scatterplot(B);

constellation17

我们生成一张带有高斯白噪音的 64QAM 星座图:

M = 64;
k = log2(M);
data = randi([0 1],1000*k,1);
txSig = qammod(data,M,'InputType','bit','UnitAveragePower',true);
rxSig = awgn(txSig,25);
cd = comm.ConstellationDiagram('ShowReferenceConstellation',false);
cd(rxSig)

constellation18

也可以进行解调

M = 64;
bitsPerSym = log2(M);
data = randi([0 1],1000*bitsPerSym,1);
txSig = qammod(data,M,'bin','InputType','bit','OutputDataType',numerictype(1,16,10));
z = qamdemod(txSig,M,'bin','OutputType','bit');
s = isequal(data,double(z))

同理,对于 PSK,我们以 4PSK 为例:

A = randi([0, 3], 1, 100); % 4 进制, 100 个码元
stem(A);
B = pskmod(A, 4, pi / 4); % 8PSK 调制, 初始相位为 pi / 4
scatterplot(B);

constellation19

Comments

Share This Post