基于 P201Pro 的 QPSK 无线收发|接收端基础知识 (2):从混乱星座到 QPSK 点簇,Costas‑Loop 载波同步 GNU Radio 实测

从混乱星座到 QPSK 点簇:GNU Radio Costas Loop 载波同步实测

本文从 GNU Radio 的真实接收结果出发:匹配滤波后的星座为什么仍然混乱?Gardner 为什么先把它整理成旋转圆环?Costas Loop 又怎样让圆环停下来,重新显现为 QPSK 四个点簇?

前言:信号收到了,为什么星座图还是乱的?

发射端和接收端使用各自独立的参考时钟,即使设置了相同的载波频率,实际本振之间仍然会有微小频差。

这个频差在接收基带中表现为 载波频率偏移(Carrier Frequency Offset,CFO),它会让 QPSK 星座随时间持续旋转。但在真实 GNU Radio 接收机中,我们最先看到的通常还不是一个漂亮的旋转圆环,而是一幅相当混乱的星座图。

一、实验环境与接收参数

发送端的模块信息参照:首先从\[Gnuradio中数字调制一般方法]这开始,我们在这文章中写了一个一般的调制方法,我们现在用这个来作为发射端的信号,后面解调端就是来解这个信号。简单抽象如下:

运行效果为:

为了观察信号进入接收机后的变化,先搭建一条最小接收链路:

运行后,我们确实能从 频谱 中看到接收到的 QPSK 信号,时域也出现了连续变化的 I/Q 波形;然而星座图并不是理想的四个点,而是一片带有过渡轨迹的混乱图形。

这说明:

接收到信号,不等于已经能够恢复符号。

接收端还需要回答两个问题:

  1. 每个符号应该在什么时刻采样?

  2. 采样得到的星座为什么还在旋转?

它们分别对应 符号同步 和 载波同步。本文的主角,就是完成载波同步的 Costas Loop。

本文使用两台 P201Pro/PlutoSDR 构成 QPSK 无线收发链路,一台发射,另一台接收。大致 架构 如下:

实验环境如下:

其中:

QPSK 每个符号携带 2 bit,因此理论码率为:

二、匹配滤波以后,我们看到了什么?

2.1 匹配滤波器的作用

发射端使用根升余弦(RRC)滤波器完成脉冲成形,接收端则使用相同参数的 RRC 作为匹配滤波器:

匹配滤波器的主要作用,是在最佳采样时刻最大化信噪比,并与发射端的成形滤波器共同形成接近升余弦的整体响应。关于脉冲成形、滤波器延迟和幅度归一化,前文 匹配滤波器 已经介绍过,本文不再展开。

需要注意的是:匹配滤波器只完成滤波,输出仍然保持 4 SPS。它不会自动告诉接收机"四个采样点中的哪一个才是符号中心"。

三、为什么本文先做符号同步?

3.1 符号同步先解决"什么时候采样"

在当前接收链中,我们使用 Gardner Symbol Sync:

Gardner 是一种非判决导向的定时误差检测方法。它不需要提前知道当前样本属于哪个 QPSK 符号,因此即使载波尚未完全同步、星座仍在旋转,它也可以先寻找符号的最佳采样时刻。

Gardner完成两件事:

  1. 调整采样相位,使输出尽量落在每个符号的中心;

  2. 将输入从 4 SPS 转换为 1 SPS。

3.2 从混乱星座到旋转圆环

当过渡采样点被排除,每个输出样本都更接近真实的 QPSK 符号。此时,载波频偏没有消失,但星座的幅度结构已经清楚得多。

于是我们看到了一种非常有辨识度的中间状态:旋转圆环。

这个圆环说明:

  • 最佳符号采样点已经基本被提取;

  • QPSK符号的幅度开始形成稳定结构;

  • 但符号相位仍随时间持续变化;

  • 因此还不能稳定地按四个象限进行判决。

这也是本文将 Symbol Sync 放在 Costas Loop 前面的原因:先把正确的符号样本挑出来,才能清楚观察 Costas 如何把圆环收敛成点簇。

这里讨论的是本文采用的 Gardner 接收链和调试顺序,并不是所有接收机必须遵守的绝对规则。若使用判决导向的 Mueller--Müller 定时同步,或采用其他载波捕获结构,模块顺序可能不同。

四、从旋转圆环引出CFO

为什么最佳采样点已经找到了,QPSK仍然不是四个点?

在前文 \[发射端基础知识--晶振与频率合成(6)\|晶振与频率合成(6)] 中已经看到:发射设备和接收设备具有各自独立的参考时钟。两边本振存在微小频差时,下变频后的基带信号会留下残余CFO。

符号同步后的接收信号可以简化表示为:

其中:

  • :发送的 QPSK 符号;

  • :载波频率偏移;

  • :初始相位偏移;

  • :噪声。

相邻符号之间会多出一小段相位:

单个符号多转一点似乎并不明显,但相位误差会随符号序号不断累积。观察时间足够长时,原来的四个QPSK点沿单位圆不断转动,最终在星座图上叠加成圆环。

要让圆环重新变成四个点簇,接收机必须估计这项持续增长的旋转相位,并对信号进行反向旋转。这就是 载波同步,也是 Costas Loop 的任务。

五、Costas Loop怎样让圆环停下来

Costas Loop可以理解为一个不断测量残余相位误差、再反向修正的反馈环路:

它的校正过程可以写成:

其中 是Costas估计的载波相位。

  • 鉴相器判断当前点相对理想QPSK方向偏了多少;

  • 环路滤波器平滑误差,并持续更新频率和相位估计;

  • NCO产生反方向旋转,将接收星座转回来。

当估计的旋转速度跟上真实CFO时:

持续增长的相位被抵消,星座不再转圈,QPSK的四个点簇重新显现出来。

六、GNU Radio实测:圆环怎样变成四个点簇

完整接收链如下:

前级增益、粗频偏处理和Symbol Sync已经完成基本调试,本文只关注Costas Loop前后的变化。

6.1 Costas Loop之前:旋转圆环

Costas前的星座已经不再是一片完全无结构的散点。Symbol Sync提取出的符号样本集中在一个较明确的半径附近,但整个星座仍然持续旋转,长时间显示后形成较宽圆环。

此时定时同步已经发挥作用,但载波相位仍未恢复。

6.2 Costas Loop参数

本文采用GNU Radio的QPSK Costas Loop:

Order=4对应QPSK的四重旋转对称性。Loop Bandwidth决定环路以多快的速度追踪相位变化,也决定锁定后对噪声的平滑程度。

6.3 打开Costas Loop:恢复四个点簇

打开Costas后,星座变化非常直观:

旋转圆环 → 环逐渐收缩 → 四个象限结构出现 → 形成QPSK四个点簇

圆环消失,说明持续相位旋转已经被抑制;四个点簇重新出现,说明Costas已经恢复了QPSK载波参考。

真实硬件中的点簇不会像理想仿真那样成为四个数学点。热噪声、残余相位误差、定时误差和 射频 链路非理想都会使点簇具有一定宽度。但"圆环变成四簇"已经清楚证明Costas Loop完成了基本载波同步。

MATLAB把这三个阶段放在同一坐标尺度下,可以更清楚地看到结构变化:

匹配滤波、符号同步和Costas载波同步后的星座变化。MATLAB采用已知残余CFO构造理想化对照,GNU Radio实测图将在正文前述位置补充。

七、Loop Bandwidth究竟控制什么?

在GNU Radio的Costas Loop中,最直接的调节参数是 Loop Bandwidth。

直观地说,它决定Costas愿意以多快的速度追踪输入相位:

  • 带宽较小:估计更平滑、抗噪声更好,但捕获和跟踪较慢;

  • 带宽较大:能够更快追踪CFO和相位变化,但也会把更多噪声带进环路;

  • 带宽适中:在捕获速度和稳态点簇宽度之间取得折中。

7.1 GRC暴露的参数和环路理论怎样对应

GNU Radio 3.10的Costas Loop继承了一个通用二阶control_loop。GRC界面没有把所有理论参数都直接暴露出来,而是只让我们设置最常用的三项:

这里的Order=4不是说控制环本身是四阶环路。它只表示使用适合QPSK的四重对称鉴相器,后面的频率与相位 跟踪 仍然是二阶环路。

源码内部还有一些没有在GRC参数区直接显示的设置:

当用户改变Loop Bandwidth时,源码按照下面的关系自动生成比例增益和积分增益:

随后每处理一个输入符号,环路状态更新为:

主要完成较快的相位修正;不断累积,逐渐建立频率估计。因此增大Loop Bandwidth会同时增大和,而在带宽较小时,近似随增长,这就是大带宽捕获频偏更快的源码原因。

对本文使用的Loop Bandwidth=0.015,代入GNU Radio默认阻尼系数可得:

GNU Radio 3.10中GRC参数、QPSK鉴相器、二阶control_loop和NCO之间的对应关系。下方曲线给出Loop Bandwidth如何转化为、。

源码还提供三个可选输出,它们非常适合调试:

以上结构来自GNU Radio官方maint-3.10分支的Costas逐样点实现、公共control_loop和GRC模块定义。

7.2 Loop Bandwidth对应哪个采样率?

本文的Costas Loop位于Symbol Sync之后,此时输入已经从4 SPS变为1 SPS,因此Loop Bandwidth相对于:

归一化,而不是相对于前级的2.084 MS/s。

为了帮助理解,可以使用下面的频率尺度:

这里的用于建立直觉,不等同于严格的3 dB噪声带宽。

7.3 同一输入,只改变Loop Bandwidth

为了只观察Loop Bandwidth的作用, MATLAB使用 完全相同的:

  • QPSK符号序列;

  • 521 kSym/s符号率;

  • 600 Hz残余CFO;

  • 32°初始相位;

  • 16 dB信噪比。

只将Loop Bandwidth设置为:

0.005 / 0.010 / 0.015 / 0.020

不同Loop Bandwidth下的频率估计与残余相位误差。带宽增大后环路响应更快,但锁定后的估计波动也更加明显

上图的第一部分观察频率估计是否追上真实残余CFO;第二部分观察相位误差是否进入稳定范围。两张曲线合起来,才构成完整的"锁定"判断。

7.4 捕获速度与稳态噪声的折中

Loop Bandwidth的核心折中。左图用"频率估计首次达到真实CFO的90%"衡量响应速度;右图表示锁定后的相位误差和频率估计波动。首次达到90%不等于已经稳定锁定,大带宽还可能出现更明显的过冲。

这也解释了GNU Radio调试中的一个典型现象:

增大Loop Bandwidth时,圆环可能更快收成四簇;但继续增大,四簇未必更紧,反而可能出现更明显的相位方向扩散。

本文使用的0.015并不是一个脱离信号速率的固定答案。它是在当前符号率、残余CFO和信噪比条件下,对捕获速度与稳态星座质量进行折中的结果。

这里需要特别避免一个误解:Loop Bandwidth并不直接等于一个固定的"最大可纠正频偏"。 捕获能力还受到鉴相器、阻尼系数、初始相位、信噪比和允许锁定时间影响。

八、总结

从PlutoSDR Source输出的真实IQ信号开始,接收星座经历了三个阶段:

符号同步回答的是:

应该在什么时候观察符号?

载波同步回答的是:

观察到的符号为什么还在旋转?

而GNU Radio中的Loop Bandwidth,则决定Costas环如何在"更快追上旋转"和"锁定后更加平稳"之间进行选择。

最终,Costas Loop最直观的作用可以概括成一句话:

让正在旋转的QPSK星座停下来,把圆环重新变成可以判决的四个点簇。

相关推荐
by209994 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
by209996 小时前
从 malloc/free 到 new/delete:真正理解 C++ 中的内存管理与对象生命周期
c语言·c++·经验分享·动态内存管理
周玉奎先生7 小时前
CGM系列水泥基灌浆料型号参数解析及安庆重点工程应用匹配
经验分享·笔记·零售
恒锐丰科技林技术员8 小时前
EG2106 半桥 MOS/IGBT 驱动芯片解析与工程应用
经验分享·嵌入式硬件·硬件工程
璞致电子10 小时前
基于 AD9361 (PZSDR‑P201Pro) 软件无线电实战综述:从板卡选型、硬件平台升级到 GNU Radio QPSK 完整收发链路
经验分享·嵌入式硬件·fpga开发·软件无线电·sdr·璞致电子
Funny_AI_LAB11 小时前
重构 Coding Agent:当 LLM 没有 KV Cache 时,上下文工程该怎么做?
人工智能·经验分享·语言模型·重构
xiao阿娜的妙妙屋13 小时前
国庆行程怎么整理成攻略图?国庆节旅游攻略封面AI生图工具推荐,附3套实用提示词
经验分享
2401_8501220413 小时前
高温耐油热缩套管选型:材料、温度和油液要匹配
经验分享·笔记·科技·学习
德思特14 小时前
NTN-TDD Band n249测试:从标准演进到实验室测试方案
经验分享·无线通信·ntn