做无人机中继仿真的时候,我第一次意识到一个很尴尬的事实:无论无人机飞到哪里、信道调得多好,只要接入链路还在用传统的正交多址(OMA),频谱利用率的上限就卡在那里。一个时隙只能服务一个用户,边缘用户排队等资源,无人机悬停得再稳也解决不了容量问题。后来我尝试把非正交多址(NOMA)加进接入链路,让两个用户共享同一个时频资源块,再用SIC在无人机侧做干扰消除,整条链路的卸载吞吐量才真正拉开差距。
这个课题——无人机辅助非正交多址蜂窝卸载,我在Matlab里做了两轮完整仿真。第一轮只做无人机中继的OMA流量卸载,用来做对比基线;第二轮加入NOMA,并做了无人机位置、用户配对和功率分配的联合优化。今天把整个流程拆开来讲,包括系统建模、Matlab实现思路、性能分析指标怎么定义、仿真结果怎么解读,以及我在调代码过程中踩过的一些坑。这个课题很适合通信方向的毕设选题、论文复现或者想快速上手无人机通信仿真的同学。
1. 项目背景与整体设计思路
1.1 为什么要做"无人机+非正交多址"的蜂窝卸载
先交代一下这个组合要解决的真实问题。蜂窝网络的边缘用户在上行方向上经常很吃亏:离基站远,发射功率又受限,直连链路的信噪比低得可怜。传统做法是加小基站或者做D2D中继,但小基站需要选址和回传,成本高;D2D依赖用户终端转发,链路稳定性和用户参与意愿都不好保证。
无人机在这个场景里能提供一个可移动、快速部署的空中接入点。它可以绕开地面障碍物,大概率建立视距链路,把边缘用户的数据先收上来,再通过回传链路转给宏基站。这个过程就是蜂窝卸载——用户不再顶着弱链路直连基站,而是把流量"卸载"到无人机这条更优的路径上。
但光引入无人机还不够。接入链路如果继续用OMA,一个时频资源块只能服务一个用户。用户一多,排队延迟就上来了,无人机的覆盖优势会被频谱效率拉低。NOMA的加入正好补上这块:两个用户在同一个资源块上叠加传输,接收端靠功率差和SIC解码来分离信号。无人机侧用NOMA做接入,等于同时干了两件事——把覆盖范围撑大,把频谱资源用密。这就是这个项目最核心的设计逻辑。
1.2 几个关键概念先理清
在展开建模之前,把三个贯穿全文的核心词捋一遍,后面就不会绕。
蜂窝卸载,本质上就是把宏基站承载的业务压力转移到别的接入节点或路径上。本项目里,卸载动作发生在边缘用户和无人机之间,用户不再直连基站,而是把数据发到无人机,再由无人机回传给基站。这个"两跳"结构是后续所有建模的基础。
非正交多址(NOMA),这里的重点是"非正交"。LTE那种OMA把资源在频域或时域上切分成互不重叠的块,用户之间互相不干扰;NOMA则允许用户在同一个时频块上叠加,依靠功率域的差异来区分不同用户。接收端通过串行干扰消除(SIC)逐个解出叠加信号。
无人机在系统里承担的角色是空中中继,但不是简单转发。它既是边缘用户的接入点,又是基站的回传节点,它的三维位置直接决定接入链路和回传链路的信道质量。所以后面无人机位置优化是这个课题里必然要做的一环。
1.3 方案选型对比
做方案设计时,我在几种常见卸载方式之间做了一张对比表,方便看清楚UAV-NOMA的位置:
| 方案 | 频谱效率 | 部署成本 | 覆盖灵活性 | 主要短板 |
|---|---|---|---|---|
| 小型基站 | 中 | 高 | 低 | 选址难,回传成本高 |
| D2D中继 | 中 | 低 | 中 | 终端移动导致链路跳变 |
| Wi-Fi分流 | 低 | 中 | 低 | 干扰不可控,覆盖太小 |
| UAV-OMA中继 | 中 | 低 | 高 | 正交资源拖累频谱效率 |
| UAV-NOMA中继 | 高 | 低 | 高 | 要设计SIC和功率分配 |
选UAV-NOMA不是因为它每个指标都最好,而是它同时兼顾了部署灵活性和频谱效率。小基站虽然性能稳定,但架设周期长,应急场景根本来不及;Wi-Fi分流适合室内,到了室外空旷环境性能就拉胯。无人机配合NOMA,能快速部署,还能在用户信道差异较大的场景里通过功率域叠加获得明显增益。
当然,它也有自己的软肋:如果同一组里的两个用户信道条件接近,SIC解码的优势就体现不出来,NOMA增益会大幅缩水。所以用户配对和功率分配这两个环节,基本决定了整套方案的上限,这也是后面Matlab实现里我花时间最多的部分。
2. 系统模型与核心数学原理
2.1 场景定义与参数设定
仿真场景我设计成一个典型的单小区上行卸载场景:宏基站位于坐标原点,覆盖半径500m;一架无人机在小区内悬停,高度可以在80到200m之间调整;K个用户随机散布在小区里。基站和无人机之间的回传链路假设为视距链路,用户到无人机的接入链路采用上行NOMA。
| 参数 | 数值 | 说明 |
|---|---|---|
| 载波频率 | 2GHz | 典型无人机通信频段 |
| 系统带宽 | 10MHz | 单个资源块带宽 |
| 用户最大发射功率 | 23dBm | 常规终端能力 |
| 无人机发射功率 | 30dBm | 回传链路发射功率 |
| 无人机高度 | 80~200m | 可优化参数 |
| 小区半径 | 500m | 单小区覆盖 |
| 用户数 | 6~20 | 进行敏感性扫描 |
这里要说一个容易忽视的点:参数设置不是越"真实"越好,关键是数量级关系要合理。比如无人机高度设为500m以上,路径损耗会急剧增大,这时NOMA再强也补不回信道变差带来的损失,仿真结果会很难看。合理的参数范围是仿真结果有意义的先决条件。
2.2 NOMA上行传输模型与SIC解码
上行NOMA的数学基础比下行稍微绕一点,我先把模型写出来。假设两个用户u1和u2配成一组,在同一个资源块上同时向无人机发送信号,无人机接收到的叠加信号可以写成:
y = sqrt(P1)·h1·s1 + sqrt(P2)·h2·s2 + n
其中P1、P2是两个用户的发射功率,h1、h2是各自到无人机的信道系数,n是高斯白噪声。关键在SIC解码顺序。上行场景中,解码顺序通常按信道增益从强到弱排列:先解码信道条件好的用户,把这个信号从接收信号中减去,再解码信道差的用户。
两个用户在SIC解码后的可达速率可以这样表示:
R_strong = B·log2(1 + P_strong·|h_strong|² / N0)
R_weak = B·log2(1 + P_weak·|h_weak|² / (P_strong·|h_strong|² + N0))
注意看弱用户速率里的干扰项——只要强用户的信号还没被完全消除,它就一直是弱用户解码时的干扰源。这是NOMA的核心代价,也是它和OMA最大的不同。SIC的顺序一旦写错,后面所有速率计算都会乱套,这个问题我放在第5节详细讲。
2.3 无人机通信的视距信道模型
无人机到地面用户的信道跟传统地面信道区别很大,核心绕不开视距概率。无人机高度越高,对地仰角越大,视距概率越高;但高度越高,传播距离也越远,路径损耗跟着涨。这两个趋势是反着的,也是无人机高度优化为什么有效的数学根源。
我用经典的概率视距模型来生成信道:
P_LoS = 1 / (1 + a·exp(-b·(θ - a)))
其中θ是用户到无人机的仰角,a、b是环境相关参数,通常根据城市、郊区、乡村环境来取值。路径损耗分为两种情况:
PL_LoS = 20·log10(4π·f·d/c) + η_LoS
PL_NLoS = 20·log10(4π·f·d/c) + η_NLoS
η_LoS和η_NLoS是环境附加损耗,一般取1dB和20dB量级。Matlab实现时,我先根据用户位置和无人机位置算出仰角,再按概率判断这条链路是视距还是非视距,最后生成对应的信道增益。这样做的结果是,无人机位置对信道质量的影响被直接量化,你在仿真里能看到"高度过高或者过低性能都会变差"的现象,而不是一个单调的曲线。
2.4 回传链路约束与卸载效用建模
蜂窝卸载不能只看接入链路,回传链路同样关键。用户在接入链路把数据发到无人机之后,无人机还要把这些数据全部转发给基站。如果回传链路的容量小于所有卸载流量的总和,那多出来的数据就会积压在无人机上,导致端到端时延上升。
所以我给回传链路单独建立约束条件:无人机回传到基站的速率必须大于等于所有卸载用户需求速率之和。在这个约束下,卸载成功的条件有两层——接入链路要满足用户的需求速率,回传链路要能扛得住总流量。两层都要算清楚。
仿真里的效用函数我定义为"卸载成功的流量之和",优化目标是最大化这个值。这个目标函数既包含了物理层的信道信息,又包含系统层的负载分担逻辑,比单纯追求最大速率更贴近蜂窝卸载的实际意义。做参数敏感性分析时,你还会发现一个有意思的现象:随着用户数增加,回传链路的约束会逐渐成为瓶颈,无人机吞吐量曲线从线性增长变成趋于饱和,这就是系统容量受限的典型特征。
3. MATLAB仿真架构与关键实现
3.1 代码模块划分与数据流设计
Matlab代码我按六个模块来组织,这样的结构改参数、加算法、替换优化方法都方便:
- 参数初始化模块
- 用户场景生成模块
- 信道计算模块
- 用户关联与配对模块
- 速率计算与SIC模块
- 优化与统计模块
模块之间尽量用函数接口传递数据,不要在脚本里把所有逻辑堆在一块。比如信道计算我封装成独立函数,输入用户坐标、无人机坐标和载波频率,输出信道增益矩阵。这样不管后面做蒙特卡洛仿真、位置优化还是敏感性分析,都可以直接调用同一个函数,避免重复代码。
3.2 参数初始化与用户场景生成
参数初始化的代码我会这样写:
% 系统参数 fc = 2e9; % 载波频率 2GHz c = 3e8; B = 10e6; % 系统带宽 10MHz N0_dBm = -174 + 10*log10(B); % 噪声功率 dBm N0 = 10^((N0_dBm - 30)/10); % 噪声功率 W % 无人机与小区参数 R_cell = 500; % 小区半径 m h_uav = 120; % 无人机初始高度 m P_uav = 30; % 无人机发射功率 dBm P_user = 23; % 用户发射功率 dBm % 用户数量与位置生成 K = 8; theta_user = 2*pi*rand(1, K); r_user = R_cell * sqrt(rand(1, K)); user_pos = [r_user .* cos(theta_user); r_user .* sin(theta_user)]';用户位置生成这里有个小细节:半径要乘以sqrt(rand),不能直接用rand。二维平面的面积和半径平方成正比,如果均匀随机取半径,用户会集中在圆心附近,信道统计分布就会失真。这可能让仿真结果偏向乐观,因为所有用户都离基站太近了。
初始阶段我先固定无人机位置,比如(120, 80, 120),即x偏120m、y偏80m、高度120m,先跑通性能分析流程,后面再做位置优化时再把它放开。
3.3 信道生成与SIC速率计算
信道计算的核心是一个循环,对每个用户计算到无人机的信道增益。伪代码思路如下:
for k = 1:K d_k = norm(user_pos(k,:) - uav_pos(1:2)); theta = atand(h_uav / d_k); % 仰角 % 视距概率 p_los = 1 / (1 + 0.3 * exp(-11 * (theta - 0.3))); if rand() < p_los PL = 20*log10(4*pi*fc*sqrt(d_k^2+h_uav^2)/c) + eta_los; else PL = 20*log10(4*pi*fc*sqrt(d_k^2+h_uav^2)/c) + eta_nlos; end H(k) = 10^(-PL/20); end这里特别提醒一个数值问题:当d_k非常小,比如用户恰好出现在无人机正下方时,仰角接近90度,视距概率趋近1,这符合物理直观,但距离不能取到0,否则路径损耗计算会除以0,产生Inf或者NaN。我通常给d_k设一个下限,比如1m,既不影响结果,又能避免数值异常。
SIC速率计算建议单独封装一个函数,输入是配对组内两个用户的信道增益和功率分配结果,输出是两个用户的可达速率。函数内部先对信道增益排序,再按顺序执行SIC,最后返回速率。这样逻辑清晰,也方便在后面优化循环里反复调用。
3.4 用户配对与功率分配算法
用户配对策略我采用的是典型的"强弱配对":把信道增益最高的用户和最低的用户配对,次高和次低配对,以此类推。这样做的原因在于,NOMA的SIC增益依赖组内用户的信道差异,差异越大,强用户越好解码,弱用户也能在功率分配上得到照顾,整个组的总速率通常更高。
功率分配这里我用分数阶功率控制(FTPC),公式如下:
P_k = P_max·(g_k^(-β)) / Σ_j(g_j^(-β))
其中g_k是用户信道增益,β是功率控制因子,取值范围0到1。β=0时所有用户等功率分配,β=1时信道反转最彻底,强用户功率被大幅压缩,弱用户得到更多补偿。不同β下系统总速率会呈现一个先升后降的曲线,最优值通常在0.4附近。
在代码里,我会对β做一次扫描,比如从0到1步长0.05,画出系统总速率随β变化的曲线。这个扫描结果既是性能分析的一部分,也能帮你确认自己参数设置下的最优工作点,比拍脑袋定一个β值要靠谱得多。
3.5 无人机位置与功率联合优化
项目标题里有"优化研究"四个字,所以优化部分不能只停留在配对和功率分配。无人机位置优化我推荐两步走:先网格搜索,再用粒子群优化(PSO)细搜。
网格搜索的思路很简单,让无人机在x∈[-R_cell, R_cell]、y∈[-R_cell, R_cell]、h∈[80, 200]的范围内按一定步长遍历,对每个位置计算系统总速率,取最大值对应的位置。步长我一般先用50m做粗搜,锁定一个热点区域,再在这个区域里用10m步长细化。如果一上来就用10m步长全区域搜索,三层循环的计算量会非常大,在普通笔记本上可能要跑几个小时,而精度提升又很有限。
PSO的初始化则把粒子放在网格搜索得到的最优位置附近,每个粒子的状态是(x_u, y_u, h_u),适应度函数就是系统总速率。优化目标同样是最大化总速率,但需要满足回传链路容量的约束。PSO的参数我常用粒子数30、最大迭代50次,惯性权重从0.9线性降到0.4,这样收敛性比较稳定,粒子不容易在边界来回震荡。
功率分配和无人机位置是耦合的:位置变了,信道增益变了,最优功率分配系数也跟着变。所以严格的联合优化应该做交替迭代,即固定位置优化功率,再固定功率优化位置,反复循环。我在仿真里做了两层循环,外层是位置优化,内层是功率分配扫描,两层收敛后整体结果基本就稳定了。
4. 性能评估指标与仿真结果解读
4.1 五个核心性能指标
性能分析阶段我重点看五个指标,每个都有明确的数学定义和仿真统计方式:
- 系统总速率:所有用户可达速率之和,衡量频谱效率和系统容量。
- 中断概率:用户速率低于需求阈值λ的概率,反映系统可靠性。
- 卸载成功率:成功卸载流量的用户占所有卸载需求用户的比例,反映蜂窝卸载的实际效果。
- 能量效率:系统总速率除以无人机总功耗(通信功耗加悬停功耗),单位是bit/J。
- 用户公平性:Jain公平性指数,评估系统是否只照顾了少数强用户。
这五个指标互相关联但又各有侧重。系统总速率高不代表用户体验好,如果强用户抢占太多资源,公平性指标就会很低;卸载成功率高也不代表频谱效率高,可能只是用户量少。所以我在仿真结果分析时从来不只是看单一指标,而是把总速率和公平性放在一起看,中断概率和卸载成功率放在一起看,这样整体结论更稳健。
4.2 对比方案与典型结果
我设计的对比方案有四组,覆盖了从"什么优化都不做"到"完整UAV-NOMA优化"的递进:
| 方案 | 描述 |
|---|---|
| 直接OMA | 用户直连基站,资源正交分配 |
| 直接NOMA | 用户直连基站,功率域NOMA |
| UAV-OMA卸载 | 通过无人机中继,接入链路用OMA |
| UAV-NOMA卸载 | 通过无人机中继,接入链路用NOMA |
在典型配置下,仿真结果会呈现出几个规律。第一,UAV-NOMA的系统总速率明显高于直接OMA,原因有两层:无人机改善边缘用户的信道质量,NOMA提升同一资源块上的同时服务用户数。第二,UAV-OMA虽然也提升了覆盖,但在频谱效率上没有优势,总速率提升幅度明显小于NOMA方案。第三,随着用户数增加,UAV-NOMA和直接NOMA的差距会进一步拉大,因为多的用户给了配对更多组合空间,NOMA的多用户增益更有发挥余地。
中断概率的对比会更加极端。直接OMA在边缘用户信道很差时,中断概率可能高达0.4以上,而UAV-NOMA能把中断概率压到0.1以下。这个对比图在论文或者技术报告里非常直观,基本是这个课题最有说服力的一张图。
4.3 参数敏感性分析
参数敏感性分析是性能分析里绝对不能跳过的一步。导师或者审稿人通常都会问:"你选的参数如果变了,结论还成立吗?"所以我会做三类扫描。
第一类是无人机高度从80m到200m扫描。系统总速率会呈现先增后降的趋势,原因在2.3节已经讲过——视距概率和路径损耗两个因素互相拉扯。最优高度一般在120m附近,具体跟环境参数有关。这个结果说明无人机高度不能随便设,必须放到整个系统里做优化。
第二类是功率控制因子β从0到1扫描。β过小时弱用户没有功率补偿,配对组性能被弱用户拖垮;β过大时强用户功率被压缩得太狠,整体频谱效率下降。中间最优值通常在0.4附近,我会在最终结果里标注出这个最优工作点。
第三类是用户数从4个增加到20个。系统总速率会上升,但增速放缓;中断概率先降后升,原因是用户过多之后资源和干扰的平衡被打破。这个现象可以结合回传链路容量瓶颈来解释——无人机回传能力有限,用户数超过一定阈值后,卸载的边际增益会显著下降。
5. 常见问题与排查技巧实录
5.1 SIC解码顺序写反导致速率异常
这是我在NOMA仿真里踩过的最深的坑。最初写速率计算函数时,我按用户编号顺序做SIC解码,结果跑出来的速率曲线乱七八糟,强用户速率奇低,弱用户速率反而很高,完全不符合物理规律。排查之后才发现,SIC必须先解码信道增益最高的用户,把它的信号从叠加信号中减去,再解码弱用户。顺序一旦错了,干扰消除过程就完全失效了。
排查方式其实很简单。在速率计算函数里加一行调试输出,把每个用户的信道增益、排序后的索引和解码顺序打出来,一眼就能看到顺序有没有问题。建议所有做NOMA仿真的人都先做这个检查,不要等结果出来再去猜。
5.2 网格搜索过密导致仿真跑不动
无人机位置网格搜索如果步长设得太小,计算量会爆炸。1000m×1000m×120m的搜索范围,步长10m就是120万个点,每个点还要算K个用户的信道和SIC速率,叠加蒙特卡洛快照的话,普通笔记本根本跑不完。
我的做法是先50m粗搜锁定热点区域,再在这个区域里用10m步长细化。粗搜只需几千个点,细搜在热点区域里也只有几百个点,整个优化过程计算量能下降一个数量级,精度损失基本可以忽略。
另一个实用技巧是蒙特卡洛大循环可以用parfor并行化。我有次在4核机器上把用户数从8提高到20,总仿真时长本来要翻倍,用了parfor之后反而只多了30%的时间。注意parfor里的迭代不能有依赖上一步结果的变量,否则结果不对。
5.3 蒙特卡洛收敛性与随机数种子问题
中断概率是个统计量,样本数不够时曲线会抖得厉害。我做测试时发现,500次快照下中断概率在0.08到0.13之间跳来跳去,完全看不出规律,加到5000次之后曲线才稳定下来。所以建议在正式跑结果之前先做一次收敛性测试:固定一组参数,画中断概率随快照