简介:这套PDF资料围绕Massive MIMO(大规模多输入多输出)系统,面向从事5G/6G无线通信算法研究的工程师、高校师生及相关方向的技术爱好者,重点解决频分双工(FDD)模式下因获取瞬时信道状态信息成本高而难以进行预编码与资源分配的问题。资料提出以统计信道状态信息(SCSI)为基础,采用基于信噪泄漏比(SLNR)的波束形成设计,并联合以最大化系统总遍历容量为目标的功率分配方案;在基站总发射功率约束下,通过变量交替优化迭代求取闭式解,最终有效提升系统总容量。该PDF共1个文件,压缩包约568KB,文档包含系统模型、基于SLNR的波束形成设计、功率分配方案设计、仿真及结果分析、结论与参考文献等完整章节,并配有对比平均功率分配和文献中基于离散傅里叶变换(DFT)矩阵波束形成的仿真图表,便于读者对照复现。目前该资源已有486人学习下载,适合希望深入理解Massive MIMO统计信道优化方法并开展相关算法研究的人员参考。
1. 大规模多输入多输出系统的统计信道方案:为什么放弃瞬时信道信息
做 Massive MIMO 下行链路仿真的人,迟早都会撞上同一个问题:当天线数从 8 涨到 32、64、128,瞬时信道状态信息(ICSI)的获取成本变得越来越不可接受。尤其在频分双工(FDD)模式下,基站只能靠用户反馈拿到下行信道,天线一多,反馈开销直接把系统吞吐吃掉了。这份资源给的是一条完全不同的路径——用统计信道状态信息(SCSI)替代瞬时信道,同时完成波束形成和功率分配。信噪泄漏比(SLNR)做波束形成,最小均方误差(MMSE)方法做功率分配,整个优化过程用交替迭代逼近最优解,每次迭代都有闭式解。对于做 FDD Massive MIMO 研究方向、或者需要跑仿真对比算法的从业者来说,这是一套可以直接落地复现的完整方案。
2. 系统模型与关键假设:从均匀直线阵到均匀平面阵
2.1 天线阵列与用户模型:UPA 为什么比 ULA 更适合空间受限场景
经典的 Massive MIMO 分析大多假设基站侧使用均匀直线阵列(ULA),天线沿一条线排开。但这份资源里明确讨论了一个工程上非常实际的瓶颈:天线间距等于半波长的前提下,载波频率 2.5 GHz 时部署 32 根天线就需要约 1.9 米的物理空间。这个要求在很多实际的基站部署场景里几乎不可行,机房楼顶、灯杆站、室内分布系统的安装位置都有限。这就是引入全维 MIMO(Full-Dimension MIMO)的动机——把天线从一维线阵变成二维平面阵(UPA),用 M 行 N 列的方式排布,在同样的物理面积内塞进更多天线单元。
资源里的系统模型设定如下:基站配备 M 行 N 列的均匀平面天线阵列,服务 U 个单天线用户。仿真中的默认参数为 M=8、N=16,即总天线数为 128 根,用户数 U 取 20 或更多。这种 M 和 N 不相等、总天线数超过 100 的配置,是实际 Massive MIMO 仿真里很有代表性的参数选择——天线数足够多体现出大规模增益,同时用户数远小于天线数,避免信道矩阵求逆时的病态问题。
从实现角度看,UPA 与 ULA 的核心差异在信道建模环节。ULA 只需要考虑水平离开角(Azimuth AoD),而 UPA 必须同时考虑水平离开角和垂直离开角(Elevation AoD)。资源中的信道模型把水平离开角 θu 和垂直离开角 φu 都在 (-90°, 90°) 均匀分布,这正是 UPA 信道生成的标准做法。角度域的二维扩展,会让后续波束形成矩阵的计算量明显增加,但带来的增益是可以在二维方向上同时区分用户,降低用户间干扰。
下表是复现时需要固化的默认参数:
| 参数 | 取值 | 说明 |
|---|---|---|
| 天线行数 M | 8 | UPA 垂直维度 |
| 天线列数 N | 16 | UPA 水平维度 |
| 总天线数 Mt | 128 | M × N |
| 用户数 U | 20(可调) | 单天线用户 |
| 载波频率 | 2.5 GHz | 用于半波长间距计算 |
| 天线间距 d | λ/2 | 半波长 |
| 距离衰减因子 υ | 2.5 | 路径损耗指数 |
2.2 信道模型:莱斯衰落、路径损耗与离开角分布
信道模型是整个复现工作的地基。资源采用的是莱斯衰落信道模型,并且利用了统计信道状态信息,因此不需要在每次快照中更新瞬时信道衰落系数,而是把信道协方差矩阵作为波束形成和功率分配的依据。在 FDD 模式下,基站获取统计信道信息只需要用户反馈信道的二阶统计量,反馈量远小于瞬时信道反馈量,而且统计信道在长时间内保持不变,这是整套算法能够在实际系统中使用的根本原因。
信道生成的核心代码(MATLAB)我一般这样写:
% 参数初始化 M = 8; N = 16; % 天线阵列维度 Mt = M * N; % 总天线数 U = 20; % 用户数 kappa = 10; % 莱斯因子(线性值,用于单次仿真) v = 2.5; % 路径损耗指数 radius = 1; % 用户分布圆半径归一化 % 每个用户随机位置与离开角 for u = 1:U % 用户距离基站的距离(归一化) d_u(u) = sqrt(rand) * radius; % 均匀分布在圆内 % 路径损耗(dB 域计算) pathloss_dB(u) = -128.1 - 37.6 * log10(d_u(u)); % 另一种写法:PL = d_u(u)^(-v),注意要做归一化 theta_u(u) = -90 + 180 * rand; % 水平离开角 phi_u(u) = -90 + 180 * rand; % 垂直离开角 end % 归一化路径损耗线性值(供容量计算直接使用) PL_linear = d_u.^(-v);这里有一个很容易踩的坑:资源正文里给出的路径损耗公式是 PL = d_u^(-υ),其中 d_u 是基站与用户 u 的归一化距离,距离衰减因子 υ=2.5。注意它是先把实际距离映射到以基站为圆心、半径为 1 的圆内,再直接做指数衰减。所以 d_u 的取值范围是 (0, 1],PL 的最小值是 1(在基站旁边),最大值趋近于无穷(在圆心处)。实际仿真为了避免除零错误,需要给 d_u 加上一个极小值保护,比如 max(d_u, 1e-6)。从概率分布上看,用户坐标用 sqrt(rand) 是为了在圆内均匀分布,否则直接取 rand 会使得用户集中在圆心附近,距离分布偏离均匀性。
莱斯因子方面的设定是每个用户独立地在 (-10 dB, 10 dB) 之间均匀取值。这个分布的跨度非常大,覆盖了从近似 Rayleigh 衰落(-10 dB,散射分量主导)到接近 AWGN 信道(10 dB,直射分量主导)的整个区间。对应到 MATLAB 实现,莱斯因子线性值应取 10^(k_dB/10),k_dB 在 (-10, 10) 内均匀随机生成。
2.3 遍历容量:优化目标的数学表达
用户 u 的接收信号模型可以写成:
y_u = sqrt(p_u) * h_u^H * w_u * s_u + Σ_{j≠u} sqrt(p_j) * h_u^H * w_j * s_j + n_u
其中 w_u 是用户 u 的波束形成向量,p_u 是分配给用户 u 的功率,h_u 是基站到用户 u 的信道向量,n_u 是零均值、方差 σ² 的加性高斯白噪声。这里用户 u 收到的干扰来自基站发送给其他用户 j 的信号泄漏到用户 u 的部分。
在这个模型下,用户 u 的遍历容量表达式为:
R_u = E[ log2(1 + SINR_u) ]
其中 SINR_u 是用户 u 的信干噪比。系统总容量是 Σ R_u,而优化的目标就是在基站总发射功率约束下最大化这个总和。问题在于:SINR_u 的表达式里,有用信号功率和干扰功率都和所有用户的波束形成向量耦合在一起,直接对全部变量联合优化是一个非凸问题。资源采用的破局思路是分两步走:先用 SLNR 作为波束形成设计准则把用户之间的耦合解掉,再用 MMSE 方法处理功率分配。
3. 基于 SLNR 的波束形成:广义特征值分解的一次性闭式解
3.1 为什么选 SLNR 而不是 SINR:解耦多用户干扰
传统的波束形成设计指标通常是最大化信干噪比(SINR)。但 SINR 有一个很麻烦的性质:用户 u 的 SINR 不仅取决于用户 u 自己的波束形成向量 w_u,还取决于所有其他用户的波束形成向量 w_j(j≠u)。这是因为别的用户波束形成向量决定了它们发送的信号在用户 u 处产生多少干扰。所以对每个用户独立优化 SINR 是不可行的,所有用户的波束形成向量被耦合成了一个整体优化问题。
SLNR 的思路很巧妙:把问题反过来看。用户 u 的信号能量除了自己被基站接收到的那部分之外,还会泄漏到其他用户那里,形成对其他用户的干扰。SLNR 定义为用户 u 的期望信号功率与它泄漏到所有其他用户的功率加上噪声功率之比:
SLNR_u = (p_u * |w_u^H * h_u|²) / (Σ_{j≠u} p_u * |w_u^H * h_j|² + σ²)
注意分子和分母里的发射功率 p_u 可以约掉,这意味着 SLNR 实际上只和波束形成向量 w_u 有关,和其他用户的波束形成向量无关。这就是解耦的关键——每个用户的最优波束形成向量可以独立求解,不需要联合迭代。这个技巧在文献里最早出现在 Sadek 等人的论文中,用来解决多用户 MIMO 下行链路的预编码设计问题。资源把它应用到统计信道信息场景下,并且结合全维 MIMO 的天线阵列结构,是这套方案的主要贡献点之一。
从工程直觉来理解这件事:SINR 是“我的信号有多强 vs 别人对我的干扰有多强”,SLNR 是“我的信号有多强 vs 我泄露给别人的信号有多强”。后者天然是一种利他主义的指标,但它把一个高度耦合的全局优化问题变成了多个可独立求解的子问题,这个代价非常值得——因为波束形成向量解耦之后,功率分配可以在下一步单独做。
3.2 波束形成向量的闭式解:广义特征值分解
SLNR 优化问题的标准解法是广义特征值分解(Generalized Eigenvalue Decomposition)。把波束形成向量 w_u 的优化写成:
max_w_u SLNR_u = (w_u^H R_u w_u) / (w_u^H B_u w_u)
其中 R_u = h_u h_u^H 是用户 u 的信道协方差矩阵(此时是统计信道信息,用协方差矩阵代替瞬时信道),B_u = Σ_{j≠u} h_j h_j^H + σ² * I 是泄漏加噪声的协方差矩阵。最优的 w_u 就是矩阵对 (R_u, B_u) 的最大广义特征值对应的广义特征向量。
MATLAB 中的实现代码:
% 输入: H_cov 是 U 个用户的信道协方差矩阵元胞数组 % sigma2 是噪声功率 % 输出: W 是 Mt x U 的波束形成矩阵 W = zeros(Mt, U); for u = 1:U % 计算泄漏加噪声的协方差矩阵 B_u B = sigma2 * eye(Mt); for j = 1:U if j ~= u B = B + H_cov{j}; end end % 广义特征值分解: R_u * w = lambda * B * w [V, D] = eig(H_cov{u}, B); % 提取最大广义特征值对应的特征向量 [~, idx] = max(diag(D)); w_u = V(:, idx); % 归一化波束形成向量功率 W(:, u) = w_u / norm(w_u); end代码中 eig(A, B) 是 MATLAB 的广义特征值分解函数,返回满足 Av = lambdaB*v 的特征向量矩阵 V 和特征值对角阵 D。这里 A 用 H_cov{u},B 用 B 矩阵,取 diag(D) 中最大特征值对应的列向量作为波束形成向量。最后一步归一化很重要:波束形成向量本身只影响信号的方向和阵列增益分配,实际的发射功率由后面的功率分配阶段决定。如果不做归一化,下一步功率分配的功率值就会和波束形成向量的模混在一起,优化目标就乱套了。
实际仿真里需要注意,广义特征值分解对 B 矩阵的条件数比较敏感。当某些用户的信道协方差矩阵非常接近时,B 矩阵可能接近奇异,eig() 函数容易返回数值不稳定的结果。这时可以给 B 的对角线加一个微小的正则化项,比如 B = B + 1e-8 * eye(Mt)。
3.3 与 DFT 码本波束形成的性能对比
这套算法在仿真里要对比的基线是文献 [3] 中基于离散傅里叶变换(DFT)矩阵的波束形成算法。DFT 码本的本质是预先设计一组覆盖整个角度空间的固定波束方向,然后从中选择最匹配用户角度的那一个。它的优势在于实现简单、不需要信道反馈(只需要用户角度信息),缺点是波束方向固定、无法针对每个用户的统计信道特性做个性化调整。当用户分布比较分散时效果尚可,但当用户角度接近或信道散射环境差异大时,固定码本的性能损耗很明显。
基于 SLNR 的统计波束形成则不同,它用统计信道协方差矩阵直接计算每个用户的最优波束方向,本质上是在“这个用户可能所处的角度范围”与“不能干扰哪些用户”之间做自适应权衡。仿真结果里两种算法在小信噪比区间的差距不大,但信噪比超过 10 dB 后,SLNR 波束形成的总容量优势变得清晰,叠加功率分配算法后差距进一步拉大。这个趋势对应到实际系统里意味着:如果基站部署在用户密集区域、对频谱效率有明确要求,那多出来的反馈开销和计算复杂度是值得的。
4. 统计信道下的功率分配:MMSE 等价变换与交替优化迭代
4.1 功率分配优化问题的非凸性
波束形成向量确定之后,剩余的自由度是每个用户分配到多少发射功率。直观来看,应该把更多功率分配给信道条件好的用户,但实际没那么简单:用户间的干扰也是通过功率放大的,功率分配的结果会反过来影响每个用户真实的 SINR。所以功率分配问题是一个典型的多变量耦合优化问题,目标函数是最化系统总遍历容量:
max_p Σ_u E[ log2(1 + SINR_u) ],约束条件是 Σ_u p_u ≤ P_total
这里 SINR_u 中的干扰项既包含其他用户的波束形成向量,也包含其他用户的功率分配值。整个问题对功率向量 p 是非凸的。所谓“平均功率分配(EP)”就是把总功率等分给每个用户,这样做虽然简单,但完全无视用户之间信道条件的差异,浪费了系统的多用户分集增益。
非线性优化里处理这类问题有一个很出名的技巧:把最大化速率的原问题等价转换成加权最小均方误差(WMMSE)最小化问题。这个变换的数学基础是:对一个高斯信号模型,最大化速率和最小化 MMSE 之间存在一个精确的等价关系。引入辅助接收均衡器 g_u 和加权系数 α_u 之后,原问题变成:
min_{p,g,α} Σ_u [ α_u * E( |g_u * y_u - s_u|² ) - log(α_u) ]
这个新问题的好处是:在固定任何一组变量时,对剩下变量的优化都具有闭式解。这就是交替优化(Alternating Optimization)能够工作的前提。
4.2 交替迭代算法流程与闭式解
交替优化的流程可以归纳为一个固定的三步循环:
步骤一:固定功率分配 p_u,更新接收均衡器 g_u。这一步本质上是每个用户的维纳滤波(MMSE 接收机),闭式解是:
g_u = (Σ_j p_j * h_u^H * w_j * w_j^H * h_u + σ²)⁻¹ * sqrt(p_u) * w_u^H * h_u
步骤二:固定 g_u 和 p_u,更新加权系数 α_u,闭式解是 α_u = 1 / e_u,其中 e_u 是用户 u 的均衡后均方误差。
步骤三:固定 g_u 和 α_u,更新功率分配 p_u。这一子问题在有总功率约束的情况下是一个标准的凸优化问题,可以用拉格朗日乘子法求解。对 p_u 求导令其为零,配合 KKT 条件整理后可以得到注水(Water-filling)形式的闭式解:
p_u = [ 1/(λ * β_u) - γ_u/β_u ]⁺
其中 λ 是总功率约束对应的拉格朗日乘子,β_u 和 γ_u 是由 g_u、α_u、信道统计协方差共同决定的聚合系数,[x]⁺ 表示取正部。
交替进行三步循环,直到目标函数(系统总容量)的变化量小于预设阈值或达到迭代次数上限。由于每一步都在最小化同一个目标函数的上界,而目标函数本身有下界,所以算法的收敛性是有保证的——资源正文里的说法是迭代结果每一步非递减且目标函数大于 0,因此收敛性容易证明。
整个迭代的 MATLAB 伪代码如下:
% 初始化: 使用平均功率分配 p = P_total / U * ones(U, 1); max_iter = 30; tol = 1e-4; capacity_prev = 0; for iter = 1:max_iter % 步骤一: 更新接收均衡器 for u = 1:U % 计算用户 u 的接收协方差矩阵 R_y = sigma2 * eye(1); for j = 1:U R_y = R_y + p(j) * (W(:, u)' * H_cov{j} * W(:, u)); end g(u) = sqrt(p(u)) * (W(:, u)' * H_cov{u} * W(:, u)) / R_y; end % 步骤二: 更新加权系数 for u = 1:U e(u) = abs(g(u))^2 * R_y - 2 * g(u) * sqrt(p(u)) * ... (W(:, u)' * H_cov{u} * W(:, u)) + 1; alpha(u) = 1 / e(u); end % 步骤三: 注水法更新功率(此处省略拉格朗日乘子二分搜索详细代码) p = water_filling(p, g, alpha, P_total); % 计算当前系统总容量 capacity = 0; for u = 1:U sinr_u = p(u) * (W(:, u)' * H_cov{u} * W(:, u)) / ... (sum(p .* (W(:, u)' * H_cov{:, u})) - p(u) * ... (W(:, u)' * H_cov{u} * W(:, u)) + sigma2 + 1e-12); capacity = capacity + log2(1 + sinr_u); end % 收敛判据 if abs(capacity - capacity_prev) < tol break; end capacity_prev = capacity; end代码里需要注意几个细节。第一,步骤一计算 R_y 时用了所有用户的干扰叠加,其中第 u 个用户对自身的“干扰”是自身信号,所以最后要在步骤三的 SINR 计算里做对应扣除。第二,注水法的 λ 需要通过二分搜索找到满足 Σ p_u = P_total 的取值。第三,初始点选平均功率分配可以让迭代更快收敛,也避免随机初始点导致收敛到比较差的局部最优点的情形。
4.3 收敛性与终判条件
实际仿真中我一般设置最大迭代次数 30 次、收敛阈值 1e-4。绝大部分场景下 10 次以内就能收敛,因为交替优化的前几步对应的容量提升是最显著的,后面只是微调。如果调试时发现容量在迭代过程中出现振荡,优先检查注水法中 λ 的二分搜索是否严格满足功率约束,其次检查 SINR 计算公式里的干扰累计是否有重复项。这两个位置都是容易翻车的隐蔽点。
5. 仿真复现的避坑指南:从信道生成到迭代收敛
5.1 现象一:路径损耗计算结果异常大或为负数
现象:仿真得到的系统容量低到不合理,或者容量随用户数增加反而下降。
原因:最常见的坑是归一化距离的处理。资源中用户均匀分布在以基站为圆心、半径为 1 的圆内,距离 d_u 是归一化距离。如果直接把 d_u 代入 PL = d_u^(-2.5),当 d_u 取到 0(圆心附近)时路径损耗趋近无穷,容量变为 0。另一种错误是用了 dB 域的路径损耗公式却忘了加负号,导致容量反直觉地随距离增加而增大。
解决:生成用户位置时用 sqrt(rand) 保证圆内均匀,距离加一个下限保护(比如 d_u = max(d_u, 0.05)),同时路径损耗严格按 d_u^(-v) 计算并使用线性值参与 SINR 运算,不要混用 dB 和线性单位。
5.2 现象二:莱斯因子设置后信道统计特性没有变化
现象:把莱斯因子从 -10 dB 改到 10 dB,仿真结果几乎没有波动。
原因:莱斯因子在线性与 dB 域之间转换出错。信道建模时通常需要把 dB 值转为线性值参与计算:K_linear = 10^(K_dB/10)。如果直接拿 dB 值当线性值用,等于在 -10 ~ 10 之间小范围调整直射径占比,信道统计特性的变化非常微弱。另一个常见问题是在每一次蒙特卡洛快照中重新随机生成莱斯因子,却忘了信道协方差矩阵需要在每次迭代中保持一致——资源配置里写的是莱斯因子在 (-10 dB, 10 dB) 之间均匀分布且仿真重复 1000 次取平均,而不是在迭代过程中变来变去。
解决:每一轮蒙特卡洛实验的开始阶段,为每个用户固定一个 K 值,转成线性后用于生成统计协方差矩阵。整个波束形成和功率分配迭代期间,信道协方差矩阵保持不变。只有切换下一轮蒙特卡洛实验时才重新随机生成 K。
5.3 现象三:交替优化迭代不收敛
现象:目标函数在迭代过程中波动,达不到预设阈值,甚至在某个迭代步突然下跌。
原因:多半是耦合项处理错了。SLNR 波束形成解耦后,功率分配步骤里用户的 SINR 计算仍然包含其他用户的功率和信道,如果干扰项多加了自身信号、漏加了噪声项,或者把已经归一化的波束形成向量当成没有归一化的版本使用,整个优化目标就会混乱。
解决:单步调试时取一个极小的场景(M=2, N=2, U=2),手动把每一步的数值算一遍,和代码输出比对。重点检查波束形成矩阵 W 的各列范数是否为 1,以及 SINR 公式中分子分母的维度是否匹配。另一个常被忽略的点是噪声功率 σ² 的取值:SLNR 分母里的噪声项要和用户接收端的噪声功率保持一致,不能双重定义。
5.4 现象四:1000 次蒙特卡洛仿真耗时过长
现象:仿真跑了几十分钟还没出结果,或者容量曲线毛刺多不光滑。
原因:双层循环里嵌套了矩阵求逆和广义特征值分解。如果每个用户的信道协方差矩阵都在循环体内重新做 eig() 分解,而波束形成向量本身在迭代中不变,等于重复计算了大量无用的特征分解。蒙特卡洛次数不够时,莱斯因子跨度太大导致个别极端信道实现拉高均值,曲线自然毛刺多。
解决:波束形成向量在信道协方差矩阵确定后一次性计算完毕,不要放进功率分配的迭代循环里。仿真时先用 100 次蒙特卡洛快速验证流程正确性,曲线形态正常后再放大到 1000 次。如果追求效率,可以把所有用户的信道协方差矩阵拼接成三维数组,用页式存取的批量操作代替循环内的逐用户分解。
5.5 现象五:对比算法(DFT 码本)性能反超 SLNR 方案
现象:仿真结果显示 DFT 码本波束形成在低信噪比区间的容量优于 SLNR 方案,与论文结论相反。
原因:信噪比的定义不一致。DFT 码本的波束选择只是从固定码本里挑一个方向,它的有效发射功率是完整的,而 SLNR 波束形成向量经过归一化,每个用户的功率分配 p_u 如果按照平均功率初始化,可能会因为用户间干扰项放得过大,造成初始阶段的容量退化。另一个可能是低信噪比下噪声项起主导作用,SLNR 的泄漏项被噪声淹没,波束形成向量退化为最大比发射的近似形式,极化现象不明显。
解决:先检查 SNR 的定义是否保持了相同口径,比如都是总发射功率除以噪声功率。对比改动功率分配算法前后的两条曲线,确认是在波束形成层面拉开差距还是在功率分配层面拉开差距。低信噪比区间的能力差距本来就不大,重点看 10 dB 以上的曲线走势。
6. 迭代收敛的验证技巧:用容量曲线判断算法是否真的跑对了
从初版仿真跑通到结论可信,中间有一个很容易被跳过的环节:验证迭代真的收敛到了正确的解。只输出一条“容量 vs 信噪比”的最终曲线是不够的,因为你不知道这条曲线是在正确算法下得到的、还是凑巧数值碰对了。我习惯在做完一个场景后额外画两张图辅助判断。
第一张是目标函数随迭代次数变化的曲线。选一组固定的信道实现,画出系统总容量在每次交替优化后的取值。正确的曲线应该是一个快速上升然后进入平台期的形状:第一步从平均功率分配跳到接近最优的位置,容量爬升最猛,后面几步是微调,差值逐步减小直到低于阈值。如果这条曲线是锯齿状振荡,或者出现先升后降的峰值,说明功率更新步骤有问题,优先排查注水法里的拉格朗日乘子是否满足总功率约束。画图时横轴迭代次数从 0 开始,第 0 次对应初始点(平均功率分配)的容量,后面每次迭代一个点。
第二张是容量增益曲线,横轴信噪比、纵轴两个算法的容量差。把采用平均功率分配的 SLNR 方案曲线作为基线,再叠加本文功率分配方案的曲线。两条曲线之间的差值如果在中高信噪比区间稳定扩大,说明功率分配的优化确实在起作用。如果差值为负,回到第 5 章的 5.5 节检查信噪比口径。如果差值几乎为零,可能是迭代没有收敛就退出了循环,把收敛阈值从 1e-4 改到 1e-6 再试一次。仿真里我还习惯顺手检查功率分配和是否等于总功率,误差超过 1e-6 就要警惕,这个微小的偏差会在 1000 次蒙特卡洛后累积成明显的性能误差。
第一次复现时我在莱斯因子的线性转换上吃过亏,曲线形态不对,排查了两天才发现是 dB 转线性时漏掉了 10 的指数。从那以后我每次拿到新的信道模型参数都会先写一个最小场景的单步调试脚本,把解析解和数值解逐项比对,确认无误再跑完整仿真。希望帮到你。
本文还有配套的精品资源,点击获取