三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

IEEE期刊论文精读与完整复现 | F-WMMSE:让天线位置参与波束成形,和速率提升约20%

IEEE期刊论文精读与完整复现 | F-WMMSE:让天线位置参与波束成形,和速率提升约20%

论文精读与Python代码完整复现|Yang S, et al. Flexible WMMSE beamforming for MU-MIMO movable antenna communications[J]. IEEE Transactions on Signal Processing, 2025, 73: 4479-4491.

如有帮助请引用:Yang S, Wan Z, Xiu Y, et al. Flexible WMMSE beamforming for MU-MIMO movable antenna communications[J]. IEEE Transactions on Signal Processing, 2025, 73: 4479-4491.

在多用户 MIMO 系统中,WMMSE是加权和速率优化中最经典的算法之一。传统 WMMSE 在固定信道上交替更新接收合并矩阵、辅助权重矩阵和发送预编码矩阵。但在可移动天线系统中,天线位置也可以参与优化:位置改变阵列响应,阵列响应进一步改变信道,算法因此多出了一层“在哪里发、在哪里收”的自由度。

这也是F-WMMSE最值得研究的地方。

这篇文章不只介绍论文思路,而是结合我们已经完成的 Python 复现项目,拆解以下问题:

  • 如何把候选天线位置写成字典矩阵;
  • 如何用 RLS-SOMP 同时完成位置选择与波束成形系数估计;
  • 如何把位置更新嵌入 WMMSE 迭代;
  • 如何用统一的实验入口复现论文 Fig. 2–6;
  • 如何通过固定随机流、置信区间和单元测试保证结果可检查、可重复。

下面先看整个 Python 复现所实现的算法流程。

图1 F-WMMSE Python 复现算法框图。算法在每轮迭代中依次更新接收端位置与合并矩阵、辅助权重矩阵、发送端位置与预编码矩阵,最后重新构造物理信道并计算系统和速率。

01|F-WMMSE 比经典 WMMSE 多优化了什么?

经典 WMMSE 的核心变量包括:

  • F:发送预编码矩阵;
  • Wₖ:用户k的接收合并矩阵;
  • Bₖ:用户k的辅助权重矩阵。

其目标是把难以直接处理的加权和速率最大化问题,转换成可交替求解的加权均方误差最小化问题。

在固定天线阵列下,算法默认信道矩阵Hₖ已经给定。每轮迭代只需要完成:

Wₖ → Bₖ → F → 重复迭代

F-WMMSE 则进一步引入两组变量:

  • 发送端天线位置集合;
  • 各用户接收端天线位置集合。

因此,算法不再只是在一个固定Hₖ上寻找最优FWₖ,而是同时选择天线位置,并根据新位置重新构造信道。

可以把两者的差别概括为:

经典 WMMSE:给定信道,优化怎么发、怎么收。

F-WMMSE:同时优化在哪里发、在哪里收,以及怎么发、怎么收。

02|我们如何在 Python 中表示“可移动位置”?

连续搜索每一根天线的二维坐标(x,z),会形成一个维度很高、变量强耦合的非凸问题。

我们的主实验实现先把可移动区域离散成规则候选网格。网格中的每一个点对应一个阵列响应原子,所有候选原子共同组成位置字典D

如果候选位置共有M个,而最终只需要选择N根天线,那么位置优化就可以转写为:

在 M 个字典原子中,寻找 N 个最有用的原子。

这实际上是一个稀疏支撑集选择问题。

项目中的fwmmse.arrays模块负责这一层物理建模,包括:

  • 平面波阵列响应;
  • 被选位置的成对阵列响应;
  • 多用户位置流形;
  • 固定 UPA 信道构造;
  • 位置流形对xz坐标的解析导数。

对于第k个用户,选定收发位置后的信道在代码中按照下面的结构构造:

Hk=Ar,k⋅diag(βkL)⋅At,kH H_k = A_{r,k} \cdot \text{diag}\left(\frac{\beta_k}{\sqrt{L}}\right) \cdot A_{t,k}^HHk=Ar,kdiag(Lβk)At,kH

其中,Aₜ,ₖAᵣ,ₖ分别由最终选中的发送端、接收端坐标生成,L为传播路径数,βₖ为复路径增益。

这一步很重要:稀疏算法输出的并不只是抽象索引。代码会把索引还原成实际二维位置,再由这些位置重新计算物理阵列响应和信道矩阵。

03|RLS-SOMP 如何同时完成位置选择和系数估计?

位置字典建立以后,下一步是在候选位置中寻找支撑集。

我们在fwmmse.sparse.rls_somp()中实现了正则化最小二乘 SOMP。每次选择一个位置时,算法执行四步:

  1. 计算所有候选字典原子与当前残差的相关性;
  2. 选出尚未使用且相关性最高的原子;
  3. 在当前支撑集上求解正则化最小二乘问题;
  4. 更新残差,直到选满所需天线数。

支撑集S上的系数更新为:

Xs=(DsHDs+γI)−1DsHY Xₛ = (DₛᴴDₛ + γI)⁻¹DₛᴴYXs=(DsHDs+γI)1DsHY

这里的γ不是一个随意加入的常数。它来自 WMMSE 子问题中的功率约束或正则项,使位置选择与波束成形系数更新能够在同一个优化结构中完成。

与只挑选“最强位置”不同,SOMP 每次都会根据新的支撑集重新估计全部系数并更新残差。因此,后续位置是在解释前面位置尚未覆盖的信息,而不是对同一方向重复选择。

项目测试还构造了正交字典样例,验证 RLS-SOMP 能准确恢复预设支撑位置,并检查返回的稠密系数矩阵是否与字典索引保持一致。

04|一轮 F-WMMSE 在代码里具体做了什么?

主算法位于fwmmse.beamforming.flexible_wmmse()。每轮迭代不是简单调用一次稀疏恢复,而是依次完成接收端和发送端两次位置选择。

第一步:更新接收端位置与合并矩阵

给定当前发送预编码矩阵F,代码为每个用户建立接收位置字典,并把接收合并子问题重写成正则化稀疏逼近问题。

随后调用 RLS-SOMP:

  • 选择Nᵣ个接收位置;
  • 计算这些位置对应的接收合并系数;
  • 生成新的等效接收信道。

第二步:更新辅助权重矩阵

根据当前接收合并矩阵和等效信道计算误差矩阵Eₖ,再更新:

Bk=Ek−1 B_k = E_k^{-1}Bk=Ek1
代码同时计算Bₖ的矩阵平方根,用于构造发送端稀疏优化的目标矩阵。

第三步:更新发送端位置

所有用户的等效信道被堆叠到统一的发送位置字典中。

代码再次调用 RLS-SOMP,从候选发送网格中选择Nₜ个位置。由于多个用户共享同一组基站天线,这里需要在所有用户共同形成的目标上寻找公共支撑集。

第四步:重构真实信道并更新预编码矩阵

得到收发位置后,代码不直接沿用中间的字典近似,而是利用选定坐标重新构造每个用户的物理信道Hₖ

随后求解最终的正则化预编码系数,执行总功率归一化,并记录当前迭代的系统和速率。

这正是图1中最关键的闭环:

位置选择 → 信道重构 → 波束成形更新 → 和速率评估 → 下一轮位置选择

05|为什么项目中还实现了离网格位置细化?

规则网格便于把位置优化转化为稀疏选择,但也存在网格失配:真正更优的位置可能位于两个网格点之间。

因此,我们还在fwmmse.offgrid中实现了离网格位置细化模块。它利用位置流形对xz的解析导数,对新选中的位置进行一阶局部更新,并加入三类保护:

  • 坐标必须位于给定可移动区域内;
  • 任意两根天线必须满足最小间距;
  • 如果更新导致目标函数变差,则拒绝该次更新。

这里需要明确区分:

本文 Fig. 2–6 的主复现实验使用网格化flexible_wmmse();离网格模块是项目中已经实现并测试的扩展能力,不与主实验曲线混为一谈。

06|Python 项目如何保证实验可以重复?

无线通信仿真最容易被忽略的并不是公式,而是实验控制。

同一条曲线如果更换随机信道、初始预编码矩阵或并行进程数,结果都可能变化。为此,我们在fwmmse.experiments中统一管理 Fig. 2–6 的实验配置。

本项目的默认设置包括:

  • 载波频率:f꜀ = 3 GHz
  • 波长:λ = 0.1 m
  • 候选网格间隔:λ/2
  • 发送天线数:Nₜ = 16
  • 每个用户接收天线数:Nᵣ = 4
  • 每用户数据流数:D = 4
  • 算法迭代次数:25;
  • 默认随机种子:2024;
  • 每个数据点:1000 次独立蒙特卡洛实现。

随机数流由“全局种子、图编号、面板编号和 realization 编号”共同派生。因此,只要参数不变,无论使用一个还是多个 worker,某个 realization 都对应同一组信道与初始化。

并行计算放在 realization 层,而不是算法内部。项目还将底层 BLAS 线程数限制为1,避免多进程与矩阵库同时扩张线程造成资源争用。

每个数据点最终保存:

  • 1000 次实现的均值;
  • 样本标准差;
  • 95% 置信区间;
  • 实际 realization 数量。

每幅图同时输出 PNG、PDF 和 CSV。图片用于阅读,CSV 用于检查每个点的统计量。

07|Fig. 2:算法是否能够稳定收敛?

图2 不同 SNR 下 MMSE、WMMSE 与两种移动区域配置的 F-WMMSE 迭代结果。每个点为1000次蒙特卡洛实现的均值。

图2比较了SNR = −5 dBSNR = 5 dB时的收敛过程。

在第25次迭代时,我们的 Python 结果为:

  • SNR = −5 dB:MMSE 为3.23,WMMSE 为11.38;两种 F-WMMSE 配置分别达到14.6215.70
  • SNR = 5 dB:MMSE 为19.46,WMMSE 为31.94;两种 F-WMMSE 配置分别达到38.3839.95

−5 dB下,较大移动区域的 F-WMMSE 相比 WMMSE 提升约38.0%;在5 dB下提升约25.1%

更值得注意的是,F-WMMSE 的性能增益并非来自一次性的初始化优势。曲线随着接收位置、发送位置和波束成形系数的交替更新逐步上升,并在有限迭代内趋于稳定。

08|Fig. 3:不同用户数下,SNR 增大后会发生什么?

图3 用户数为2和4时的和速率随 SNR 变化结果。

SNR = 10 dB时:

  • K = 2:WMMSE 为34.06,较大移动区域的 F-WMMSE 为41.54,提升约21.98%
  • K = 4:WMMSE 为46.57,较大移动区域的 F-WMMSE 为55.82,提升约19.86%

当 SNR 较低时,噪声仍是主要限制因素;随着 SNR 提高,多用户干扰和空间自由度的重要性上升。F-WMMSE 可以通过位置选择主动改变不同用户的等效信道,因此在中高 SNR 区域保持了明显优势。

09|Fig. 4 与 Fig. 5:移动区域为什么不是越小越好?

图4 不同路径数下,接收端移动区域参数变化对和速率的影响。

图4中,当接收端网格边长参数为2时,候选点总数为2² = 4,恰好等于接收天线数Nᵣ = 4。此时没有额外位置可供选择,因此 F-WMMSE 与固定位置 WMMSE 的结果重合。

当该参数增大到8时:

  • L = 5:F-WMMSE 从30.90提升到34.05,相比 WMMSE 提高约10.18%
  • L = 10:F-WMMSE 从32.08提升到36.45,提高约13.63%

图5 不同路径数下,发送端移动区域参数变化对和速率的影响。

图5也出现了相同现象。当发送端网格边长参数为4时,候选点总数为4² = 16,恰好等于发送天线数Nₜ = 16,算法同样没有额外的位置选择自由度。

当该参数增大到12时:

  • L = 5:F-WMMSE 达到36.17,相比 WMMSE 的30.97提升约16.81%
  • L = 10:F-WMMSE 达到38.27,相比 WMMSE 的31.89提升约20.01%

这两幅图从代码层面揭示了一个很直观的结论:

可移动天线的增益不是由“移动”这个标签自动产生的,而是来自候选位置数大于实际天线数后出现的选择自由度。

10|Fig. 6:多径数量会怎样影响位置自由度?

图6 路径数从1增加到21时,不同算法的平均和速率。

L = 1时,WMMSE 的和速率为22.04,两种 F-WMMSE 配置分别为23.2223.31,增益相对有限。

L = 21时,WMMSE 为32.49,较小移动区域的 F-WMMSE 为39.02,较大移动区域达到41.07。后者相比 WMMSE 提升约26.38%

多径数量增加后,空间信道中可利用的结构更加丰富。更大的候选位置集合能够从这些路径中寻找更有利的相位组合,因此位置自由度的价值更加明显。

11|Paper-to-Code Mapping:公式如何落到项目文件?

为了避免“论文看懂了,但不知道代码从哪里读”,下面给出这次 Python 复现的核心映射。

  • fwmmse/arrays.py:构造阵列响应、候选位置字典、实际位置响应与物理信道。
  • fwmmse/beamforming.py::mmse_precoder():计算固定位置线性 MMSE 基线。
  • fwmmse/beamforming.py::wmmse():实现经典 WMMSE,交替更新WₖBₖF
  • fwmmse/beamforming.py::flexible_wmmse():实现 F-WMMSE 主循环,联合更新收发位置与波束成形矩阵。
  • fwmmse/sparse.py::rls_somp():完成稀疏支撑选择与正则化系数估计。
  • fwmmse/sparse.py::ols_mmv():提供多测量向量稀疏恢复对照实现。
  • fwmmse/offgrid.py:实现坐标局部细化、区域边界与最小间距约束。
  • fwmmse/experiments.py:管理 Fig. 2–6 的参数扫描、随机流、并行仿真和统计。
  • fwmmse/plotting.py:输出 PNG、PDF 和 CSV。
  • fwmmse/cli.py:提供统一的实验命令行入口。

如果准备阅读源码,建议顺序是:

arrays.py → sparse.py → beamforming.py → experiments.py

先理解位置字典和 RLS-SOMP,再看 F-WMMSE 主循环,会比直接从实验脚本追调用关系更清楚。

12|我们还做了哪些数值验证?

除了生成曲线,项目还包含9项测试,覆盖:

  • 平面波响应的单位模与位置排列顺序;
  • 被选位置响应与完整网格响应的一致性;
  • xz解析导数与有限差分结果的一致性;
  • 信道矩阵维度与数值有限性;
  • 预编码矩阵总功率归一化;
  • 和速率结果的有限性与非负性;
  • WMMSE 每轮输出及最终功率约束;
  • RLS-SOMP 与 OLS-MMV 的支撑恢复;
  • 离网格位置更新的区域边界与最小天线间距。

本次整理文章前,我们重新执行了这9项测试,全部通过。

这些测试不能代替理论证明,但能够尽早发现数组排列、共轭转置、功率缩放、位置索引和导数实现中的常见错误。对于复杂数值算法,这一步往往和“把主函数跑通”同样重要。

13|如何运行这套 Python 复现?

安装项目及测试依赖后,可以先用一次 realization 做快速检查:

python-mfwmmse reproduce--figureall--realizations1--workers1

复现本文使用的完整统计配置:

python-mfwmmse reproduce--figureall--realizations1000--workers4

也可以只运行某一幅图:

python-mfwmmse reproduce--figure3--realizations1000--workers4

最终结果写入outputs/fig2outputs/fig6。每个目录包含:

  • 一张 PNG 图片;
  • 一份 PDF 矢量图;
  • 一份带均值、标准差和95%置信区间的 CSV 数据。

14|从这次复现中,真正应该掌握什么?

F-WMMSE 的价值不只是“比 WMMSE 多优化一组位置变量”。

更值得学习的是它把三个原本分散的问题连接了起来:

  1. 用 WMMSE 处理多用户速率优化;
  2. 用稀疏支撑集表示天线位置选择;
  3. 用实际选定位置重构信道,再返回波束成形闭环。

而从复现角度看,一套可信的科研代码也不应只有一条最终曲线。它还应该包括明确的模块划分、可追踪的公式映射、可重复的随机实验、可检查的 CSV 数据和针对关键数值操作的测试。

后续我们还会继续拆解这套 Python 项目,包括:

  • RLS-SOMP 的逐行代码解析;
  • F-WMMSE 一次完整迭代的矩阵维度;
  • Fig. 2–6 的参数配置与绘图流程;
  • 如何修改天线数、用户数、路径数和移动区域;
  • 如何把离网格位置细化接入新的实验。

如果你正在研究可移动天线、MU-MIMO、WMMSE 或稀疏优化,需要论文复现完整代码,欢迎关注「无线通信科研笔记」。

我们会持续分享无线通信论文解读、Python 算法实现、仿真实验复现,以及论文公式到可运行代码的完整映射。


论文信息

题目:Flexible WMMSE Beamforming for MU-MIMO Movable Antenna Communications

作者:Songjie Yang, Zihang Wan, Yue Xiu, Boyu Ning, Yong Li, Yuanwei Liu, Chau Yuen

期刊:IEEE Transactions on Signal Processing, Vol. 73, 2025

DOI:10.1109/TSP.2025.3625145

← 返回列表