无线供电通信网络SWIPT仿真:MATLAB上下行链路联合优化指南

发布时间:2026/9/10 17:38:41
无线供电通信网络SWIPT仿真:MATLAB上下行链路联合优化指南 简介面向无线供电通信网络中同时上下行链路传输SWIPT研究的MATLAB仿真资源适合通信工程专业学生、科研人员及关注能量收集与数据传输协同优化的工程师也适合用于物联网/5G背景下的课题预研。资源由13个m脚本和1份md说明文档组成压缩包共14个文件、仅16KB内容精炼重点覆盖信道建模、收发端设计、功率分割/时间切换策略、性能评估及优化算法等完整流程。读者可直接运行脚本快速理解瑞利衰落信道生成、大规模与小尺度衰落建模、每轮迭代最优解获取、收敛性分析以及实验数据采集等关键环节结合README中的使用说明可轻松复现系统仿真并在此基础上扩展信道参数、资源分配或干扰管理方案。目前已有134人学习下载可作为SWIPT课题从入门到进阶的实用代码参考也能帮助研究者在统一框架下快速验证算法并为后续论文写作或项目开发提供可复用基础。1. 无线供电通信网络中的同时上下行链路传输SWIPT 仿真该从哪里入手在一台具备无线充电能力的接入点旁边终端既要上报数据又要给自己补电这个“一个时隙内同时完成上下行链路传输”的需求正是 SWIPTSimultaneous Wireless Information and Power Transfer要解决的核心问题。它不只是在射频信号上叠加能量而是把功率分割、时间切换、能量采集效率、信道衰落压缩进一个联合优化问题。做这套 MATLAB 仿真适合两类人一类是在物联网、无线传感器网络方向上研究资源分配的研究生另一类是要在 5G 或 WLAN 场景里验证波束赋形与调度策略的工程师。拿到这份资源后建议不要直接跑 ProposedAlg.m先理清信道生成和上下行传输模型再谈优化后面排错会省很多时间。2. SWIPT 链路模型与 Rician 衰落信道的 MATLAB 表达2.1 上下行链路传输的接收机策略时间切换、功率分割与空间切换SWIPT 的物理层基础是让接收机从同一路射频信号里同时提取信息和能量。工程上最常见的三种模型是时间切换Time SwitchingTS、功率分割Power SplittingPS和空间切换Space SwitchingSC。本套件里的ProposedAlg.m与Get_optSolutionPerIteration.m主要做资源分配通常以其中一种或两种接收机架构作为约束。接收策略接收机行为典型使用场景时间切换TS同一频带下下行时隙收能量上行时隙发数据低复杂度传感器节点功率分割PS同一时刻把信号功率按比例分给能量采集器与信息解码器实时性要求较高的链路空间切换SC不同天线单元分别用于能量采集与信息接收大规模天线、多用户 MIMOPS 模型的功率分割系数rho是后面优化问题里最核心的变量。rho接近 1 时接收机把绝大部分功率交给能量采集器信息解调的信噪比下降rho接近 0 时信息速率上升但采集到的能量不足。于是上下行链路传输必须联合设计下行能量传输时间tau、基站发射功率P_BS、上行回传功率p_u和功率分割比rho互相耦合。2.2 用 ricefit 和 ricernd 把小尺度衰落“工业化”资源里出现ricefit.m、ricernd.m、ricepdf.m、ricestat.m和ricedemo.m说明这套代码把 Rician 衰落作为默认信道模型。Rician 比 Rayleigh 更贴近室内热点、微蜂窝这类存在直射分量的无线供电场景因为下行能量传输的效率高度依赖直射径的稳定性。小尺度衰落生成和普通raylrnd不同Rician 信道需要先指定 K 因子也就是直射分量功率与散射分量功率的比值。ricernd可以直接生成服从 Rician 分布的随机变量但手工生成更能看清结构常见做法是% swipt_channel_demo.m K_dB 6; % Rician K因子单位dB K_lin 10^(K_dB/10); nSamp 1024; % 采样点数 % 直射分量与散射分量的功率归一化 s sqrt(K_lin / (K_lin 1)); % 直射分量幅值 sigma sqrt(1 / (2 * (K_lin 1))); % 同相/正交分量的标准差 h_small s sigma * (randn(nSamp, 1) 1i * randn(nSamp, 1)); h_small h_small / sqrt(mean(abs(h_small).^2)); % 归一化到单位平均功率这段代码里K_lin 10^(K_dB/10)把 dB 值转成线性值s控制直射分量的强度sigma控制多径散射的擴散程度。归一化一步很关键否则后面叠加路径损耗时接收功率会有固定偏差。ricefit可以用来估计实测信道的 K 因子而ricestat返回 Rician 分布的均值、方差等统计量如果手头有现场采集的 RSSI 序列先跑一次ricefit再定 K_dB对比直接用经验值靠谱得多。2.3 大尺度衰落要和小尺度衰落相乘而不是相加单纯用ricernd生成的信道系数只能描述小尺度变化。无线供电场景里几百米范围内的路径损耗差可以到 30 dB 以上远大于小尺度衰落因此CreateLargeScaleFading.m负责生成路径损耗CreateSmallScaleFading.m负责生成小尺度矩阵。两者在 MATLAB 里合成时要注意功率单位% 大尺度与小尺度合成 rng(42); nUsers 8; distance 10 80 * rand(nUsers, 1); % AP到每个用户距离米 PL_dB 75 35 * log10(distance); % 简化路径损耗模型 % 每个用户的小尺度衰落假设已由 CreateSmallScaleFading 生成 % H_small 尺寸为 nUsers x nSamp这里用 1 个符号周期示意 H_small (randn(nUsers, 1) 1i * randn(nUsers, 1)) / sqrt(2); % 复合信道系数 H_eff db2mag(-PL_dB) .* H_small;db2mag(-PL_dB)把分贝损耗转成线性幅度衰减负号表示信号衰减。这里的H_eff就是后面ProposedAlg.m做功率分配时要用到的等效信道矩阵。需要留意的是PL_dB如果由脚本内部生成随机种子不一致会导致每次仿真的优化结果对不上所以Plot_Layout.m和主算法最好共享同一个初始点。3. 上下行链路联合优化拆解 ProposedAlg.m 的迭代骨架3.1 把能量因果约束写成可计算的优化问题无线供电通信网络里上行能发多少数据取决于下行收集到多少能量。这种“先充电、后通信”的关系数学上写成能量因果约束上行消耗的能量不能超过下行采集的能量乘以能量转换效率。常见的优化模型是同时最大化上行吞吐量和下行能量效率变量包括下行发射功率P_BS、下行充电时长tau、功率分割比rho和上行发射功率p_u。一个典型目标函数是系统加权吞吐量约束包括能量因果、最大发射功率和总时隙归一化。由于约束里存在tau * rho * log2(...)这种耦合项问题不是凸的。ProposedAlg.m的作用不是一次性用fmincon硬解而是把问题拆成两个子问题固定tau求rho和p_u再更新tau交替迭代到收敛。3.2 主程序循环与 Get_optSolutionPerIteration.m 的调用关系Get_optSolutionPerIteration.m是单次迭代内求解子问题的函数。ProposedAlg.m每轮循环调用它得到当前tau下的最优功率分割比和上行功率然后更新tau。如果阅读源码时只盯着变量名容易绕晕我一般会先把主循环骨架拉出来% ProposedAlg 主循环骨架 maxIter 50; tol 1e-4; tau 0.5; % 下行能量传输时间占比初始化 rho 0.7; % 功率分割比初始化 R_prev 0; for iter 1:maxIter % 固定 tau求解 rho 和上行功率 p_u [rho, p_u] Get_optSolutionPerIteration(H_eff, tau, P_BS, ... eta, sigma2, R_min); % 使用本轮结果计算上行吞吐量 R (1 - tau) * log2(1 (rho * p_u .* abs(H_eff).^2) / sigma2); % 用次梯度或一维搜索更新 tau tau min(max(tau step * (R - R_prev), 0.01), 0.99); if abs(R - R_prev) tol break; end R_prev R; end这里的eta是能量转换效率sigma2是接收端噪声功率R_min是用户最低速率约束。Get_optSolutionPerIteration.m内部通常用二分法或fminbnd在[0,1]区间里找最优rho再把rho代回闭式表达式求p_u。把step设置过大会导致tau在最优值附近震荡建议初始设为 0.05观察收敛曲线后再调整。3.3 可调参数与算法收敛性对照调参之前先确认变量与文件里的实际命名是否对应。不同版本的代码里rho、tau、alpha、theta都可能被混用最容易踩坑的是rho被当成基站功率分配因子实际用途却是接收机功率分割比。建议对照以下参数表修改参数物理含义典型取值调参倾向P_BS基站下行发射功率30~43 dBm提高可增能量采集量tau下行充电时间占比0.3~0.7过大会压缩上行传输时间rho功率分割比0.2~0.8过大会恶化信息解调eta能量转换效率0.4~0.8受整流电路非线性限制sigma2噪声功率-90~-100 dBm影响高信噪比区间的速率上限如果迭代不收敛先看R (1 - tau) * log2(...)中的(1 - tau)是否被更新逻辑正确使用再看rho是否越界。很多不收敛情况由初始化tau0.5后第一次迭代得到的rho直接落到边界引起处理办法是把Get_optSolutionPerIteration.m里的搜索区间改成[0.05, 0.95]。4. 收敛曲线与数据采集让 fig2 系列脚本真正落地4.1 fig2_convergence_function.m画目标值下降曲线fig2_convergence_function.m的任务不是简单画一条曲线而是验证算法在每次迭代中确实提升目标值。可以把主循环里每次迭代的吞吐量存到一个数组里再单独画图。常见实现% 提取收敛过程的通用写法 iterations 1:length(R_history); figure; semilogy(iterations, max(R_history(1) - R_history, 1e-6), bo-, ... LineWidth, 1.5); grid on; xlabel(迭代次数); ylabel(吞吐量差 (bits/s/Hz)); title(ProposedAlg 收敛过程);这里用semilogy而非plot是因为吞吐量差在接近收敛时下降速度很快线性坐标下最后几次迭代会挤在一起。max(R_history(1)-R_history, 1e-6)是为了防止差值为 0 时semilogy画不出点。如果曲线在前 5 次迭代内快速下降、之后平缓说明算法行为正常如果出现锯齿形反复则要回第 3 章检查步长和搜索区间。4.2 fig2_collecting_data.m批量信道下的统计曲线单次信道实现的收敛只能证明“这条信道下可行”论文图表通常需要多个随机信道下的平均性能。fig2_collecting_data.m的作用就是循环生成信道、调用ProposedAlg.m、记录结果并汇总。常见的统计维度是用户的平均吞吐量随基站发射功率的变化。% fig2_collecting_data.m 逻辑骨架 P_BS_list 30:2:40; % dBm avg_throughput zeros(length(P_BS_list), 1); nTrials 100; for ii 1:length(P_BS_list) R_sum 0; for trial 1:nTrials % 每次重新生成信道 H_eff generate_channel(nUsers, trial); % 自定义函数 R_sum R_sum run_swipt_algorithm(H_eff, P_BS_list(ii)); end avg_throughput(ii) R_sum / nTrials; end plot(P_BS_list, avg_throughput, r^-); xlabel(基站发射功率 (dBm)); ylabel(平均上行吞吐量 (bits/s/Hz));generate_channel建议在内部显式使用rng(trial)这样每个trial对应一组可复现的随机信道。如果直接用全局随机流之后想复现特定功率点会非常困难。把数据存到.mat或 CSV 文件时也要同时把配置参数存进去否则两周后很难知道曲线对应的是rho还是tau的变化。4.3 结合 README.md 确定运行顺序资源里的README.md通常会写明脚本依赖顺序。按照一般项目结构推荐的执行顺序是先运行Contents.m检查 Rician 工具箱的函数是否在路径中再运行CreateLargeScaleFading.m和CreateSmallScaleFading.m生成信道然后调用ProposedAlg.m完成优化最后分别运行fig2_convergence_function.m和fig2_collecting_data.m。第一次运行时如果报“未定义函数 ricernd”多半是ricefit.m所在目录没有被加到 MATLAB 搜索路径用addpath(你的路径)修复后重新执行即可。5. 从仿真到论文图表Plot_Layout、ricefit 与最容易被忽略的三个错误5.1 用 Plot_Layout.m 检查拓扑可复现性Plot_Layout.m负责画出接入点和用户的地理位置分布。做无线供电仿真时位置坐标直接影响路径损耗建议在文件开头固定随机种子并用scatter显示 AP 与用户的位置关系避免每轮运行出现完全不同的节点分布。rng(7); AP_pos [0, 0]; User_pos 100 * randn(8, 2); scatter(User_pos(:,1), User_pos(:,2), 40, filled); hold on; scatter(AP_pos(1), AP_pos(2), 150, rp, LineWidth, 2); xlabel(x (m)); ylabel(y (m));5.2 用 ricefit 校验仿真信道参数ricefit的作用不只是拟合实测数据还可以用它反向验证ricernd生成的样本是否符合预期 Rician 分布。可以先生成 10000 个样本再调用[Khat, Ahat] ricefit(x)估计 K 因子若估计值与设定值偏差超过 1 dB就要检查归一化步骤是否引入额外功率损失。5.3 三个高频错误错误现象可能原因排查方向ricernd报错Rician 工具箱未加入路径运行which ricernd确认路径吞吐量曲线不随 P_BS 上升rho被固定为 1检查Get_optSolutionPerIteration的搜索区间收敛曲线反复震荡tau步长过大把步长降到 0.01 或改用一维精确搜索最后补一个容易忽视的细节比较不同算法时要让所有算法使用同一套随机信道。把CreateSmallScaleFading生成的复数矩阵先存为.mat文件再让ProposedAlg.m和对照算法分别读取这样图里的差距只来自算法本身而不是噪声样本不同。本文还有配套的精品资源点击获取