4.3 数字调制与星座图


4.3 数字调制与星座图

本节摘要:数字接收机把 I/Q 平面变成"地图":每个符号是地图上的一个点,接收到的样本是一团围绕理想点的云。本节演示如何生成 BPSK 与 QPSK 信号并画出标准星座图,如何用低通滤波加定时抽取让点云收敛,以及如何从点的相位读出比特。星座图从此成为你判断数字链路质量的第一仪表。

目标画像

数字信号在频谱图上是一段近似矩形的平坦谱(第 3.4 节的指纹),但频谱看不出误码率——星座图才看得出。实验分两步:先在合成域造一个已知答案的 QPSK 链路,看"干净"星座长什么样;再加噪声,看点云如何弥散、误码如何产生。有了这个视觉基准,第 8 章观测真实卫星遥测时,你一眼就能判断链路质量。

造一条已知的 QPSK 链路

import numpy as np import matplotlib.pyplot as plt from scipy.signal import firwin, lfilter np.random.seed(7) sps = 8 # 每符号 8 个样本 bits = np.random.randint(0, 2, 2000) sym = 1 - 2 * bits # 比特映射:0 为 +1,1 为 -1 # 相位映射:00/01/10/11 对应四象限(简化版 QPSK,先取 I 支路演示) i_sym = np.repeat(sym[0::2], sps) q_sym = np.repeat(sym[1::2], sps) i_sym = np.r_[i_sym, np.zeros(sps)]; q_sym = np.r_[q_sym, np.zeros(sps)] # 根升余弦成形,滚降 0.35,限制带宽同时压制码间串扰 taps = firwin(81, 0.5 / sps, window=("kaiser", 6)) i_tx = lfilter(taps, 1.0, i_sym) q_tx = lfilter(taps, 1.0, q_sym) # 加噪声,观察星座从"清晰四点"到"弥散云团" for snr_db in (30, 10): noise = 10 ** (-snr_db / 20) rx = i_tx + 1j * q_tx rx = rx + noise * (np.random.randn(len(rx)) + 1j * np.random.randn(len(rx))) plt.figure() plt.plot(rx.real[::3], rx.imag[::3], ".", ms=1.5, alpha=0.4) plt.axis("square"); plt.xlim(-2, 2); plt.ylim(-2, 2) plt.title(f"QPSK 星座,信噪比 {snr_db} dB") plt.show()

两幅图的对比就是数字通信的全部故事:30 dB 时四个象限各有一团致密的点,判决零误差;10 dB 时点云弥散、偶有越过象限边界的"叛逃者",每越界一次就是一个误码。判决规则简单到极致——看点的实部虚部符号,正负即比特。误码率不是玄学,就是"点云越过象限边界的频率"。

从点云到比特:定时恢复的必要性

上面的合成实验里我们偷了个懒:发射端每符号 8 个样本,接收端直接看全部样本——但判决必须落在"符号中心"的样本上,此刻眼图张开最大、噪声影响最小。真实接收机不知道发射端的时钟,必须自己从信号里恢复定时,这一步叫定时恢复或符号同步。入门级做法是立方定时误差检测:对低通后的信号取绝对值立方,在符号中心处误差函数过零,据此微调抽取相位。更工程化的实现是 Gardner 算法,第 5 章的 GNU Radio Symbol Sync 模块内部跑的就是它(或它的近亲 polyphase clock sync)。

定时恢复之后还有一步载波恢复:若发射与接收的振荡器有微小频差,星座会整体缓慢旋转成圆环——这也是为什么观测真实信号时看到"环"就该调频偏、看到"十字花瓣"就该查 I/Q 不平衡。业余条件下最实用的近似是四阶功率法(对信号四次方后会出现一根离散谱线,锁上去即得四倍频的载波相位),QPSK 专用。

观测真实数字信号

RTL-SDR 能稳定观测的数字信号不少:1090 MHz 的 ADS-B(脉冲位置调制,星座退化为幅度键控)、137 MHz NOAA 卫星的 APT(宽带 FM,星座是圆环——它本质是调频,相位信息被鉴频用掉了)、以及各地 400 MHz 段的数字对讲(如 DMR,4FSK,星座是四个幅度点而非相位点)。观测流程与 4.2 节相同:下变频、限带、抽取到约两倍符号速率,然后直接画 I/Q 散点:

raw = np.fromfile("dmr_435.iq", dtype=np.uint8).astype(np.float32) - 127.5 iq = (raw[0::2] + 1j * raw[1::2]) / 128.0 # 已限带抽取后画散点(假设已降到符号速率的两倍) plt.plot(iq.real[::2][:20000], iq.imag[::2][:20000], ".", ms=1, alpha=0.3) plt.axis("square"); plt.show()

读到什么样的点云,对应什么结论:四团对称的点(或四个幅度环)说明信号被正确限带与定时;一团圆环说明 FM 体制或载波未恢复;一片均匀的"雪花"说明参数错误或信号根本不在——先回频谱图复核,再回来调星座。

常见问题

问题:星座图和眼图是什么关系?

眼图是实数基带信号在时间轴上的折叠视图,看定时抖动;星座图是复数信号在 I/Q 平面上的散点视图,看幅度相位误差。数字接收机调试时两者互补:眼图找定时恢复的问题,星座图找载波恢复与信道质量的问题。

问题:为什么真实信号的星座点是"云"而不是"点"?

噪声、频差、定时误差、多径都会让每个符号偏离理想位置,成千上万个符号叠画出来就是围绕理想点的云团。云的半径正比于噪声功率,云的整体旋转指示频差,云的椭圆变形指示 I/Q 不平衡——星座图的形状是信道诊断的第一手证据。

问题:判读星座时先看什么?

按顺序三看:一看有没有结构——均匀雪花说明参数错误,先回频谱复核;二看旋转——圆环说明频差未消,先做载波恢复;三看弥散——点云与象限边界的关系决定误码率下限。结构、旋转、弥散,这个顺序不要乱。

本节要点回顾

  • 星座图是数字链路质量的仪表:点云致密度对应信噪比,越界频率对应误码率。
  • 成形滤波:根升余弦限制带宽并压制码间串扰,滚降系数越小带宽越省、定时容差越苛刻。
  • 两个恢复:定时恢复找符号中心(Gardner 类算法),载波恢复消除星座旋转(频差表现为圆环)。
  • 真实信号读图:点云形态直接暴露调制体制与参数错误。

三个实验打完,解调这件事在你手里已经"祛魅"。下一章把手写算法装配成 GNU Radio 流图——同样的原理,工程化的形态。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U