ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于MATLAB的5G载波聚合算法仿真:从模型到调度器实现

基于MATLAB的5G载波聚合算法仿真:从模型到调度器实现 简介面向5G物理层与载波聚合方向学习者这份基于5G信号的载波聚合算法Matlab仿真资源适合通信工程学生、算法研究人员及Matlab初学者参考。压缩包共2个文件包含带中文注释的m源码和仿真操作录像整体仅661KB轻量易用m代码覆盖简单OFDM传输链的基本载波聚合实现包括2048点IFFT/FFT、8MHz可用带宽、OFDM符号周期及子载波参数配置运行环境为matlab2022A。录像演示了在MATLAB左侧当前文件夹路径下正确运行程序的过程便于对照调试。已有839人下载学习通过代码注释与操作视频读者可快速理解5G载波聚合仿真链路搭建思路和关键参数作用并在此基础上扩展到更多子载波或保护间隔配置。1. 载波聚合算法仿真先想清楚你究竟要仿什么“基于5G信号的载波聚合算法MATLAB仿真”落到工程上是一个具体问题你要在内存里造出两个以上可用的NR分量载波再写一个调度器决定哪个用户用哪段资源最后用吞吐量和频谱效率证明“聚合比不聚合强”。新手最常犯的错是一上来啃3GPP 38.101的表格卡在带宽配置和子载波间隔上仿真半个月还在画星座图。这篇笔记把载波聚合仿真拆成三层分量载波怎么生成、调度算法怎么选、参数怎么调最终跑出一版能复现、能讲清增益来源的MATLAB仿真。适合要做5G物理层演示、课程设计或给非通信背景同事讲无线资源管理的人。2. 载波聚合仿真的模型边界为什么算法仿真不用搭完整链路先理解载波聚合在5G里解决的是哪个问题。NR单载波最大带宽100MHz受频谱连续性和硬件成本限制一个连续100MHz在很多频段拿不出来运营商手里的频谱往往是碎片化的。载波聚合CA把两个以上成员载波Component Carrier, CC绑在一起让终端同时收发多个载波上的数据从而把峰值速率直接叠加起来。PCell负责RRC连接SCell按需激活这套机制属于5G关键技术里的频谱聚合手段。这和MIMO不一样MIMO在同一个带宽里吃空间维度的增益CA吃的是频域带宽的加法两个方向可以同时用。做载波聚合的MATLAB仿真第一件事不是写代码而是把模型边界画清楚。标题里写的是“算法”意味着重点在资源分配与调度策略不在OFDM符号级的编解码链路。如果你把精力花在搭完整收发机半个月过去可能还没跑到调度器。先分清CA和双连接DC再决定仿到哪一层最后按一个可交付的脚本结构去组织代码。2.1 载波聚合与双连接的差别仿真前先分清名词新手最容易把CA和双连接搞混。CA是同一个5G基站下多个小区或载波聚合给一个终端调度在一个MAC实体里做PCell加SCell共同服务一个用户DC是终端同时连到两个不同基站主节点和辅节点各有一个独立调度器一个用户被两个调度器共同服务还涉及承载分流Split Bearer的逻辑。在仿真代码上CA只需要一个调度器去遍历所有CCDC则需要两个调度器加分流策略代码结构完全不同。我见过有人把CA仿真写成两个独立调度器各跑各的最后两个载波各出一份吞吐曲线中间没有任何交互逻辑这其实做成了DC仿真不是CA。要演示聚合增益先确认你的调度循环是“一个调度器遍历多个CC”还是“多个调度器各自调度各自”前者才是载波聚合算法的正确骨架。另外一个容易忽略的点是PCell和SCell的角色差异PCell承担控制信令、随机接入和物理层测量SCell可以快速激活和休眠。如果你的算法要讨论节能SCell激活策略本身就是一个可研究的调度维度。2.2 算法仿真 vs 链路仿真要不要搭OFDM收发机MATLAB做5G仿真有三条常见路线。第一条是物理层链路仿真用5G Toolbox的nrCarrierConfig、nrOFDMModulate这类函数把基带波形真实生成出来叠加信道再解调精度高但代码量大重点在星座图和误块率第二条是MAC层调度算法仿真把每个CC抽象成一组资源块RB调度器决定哪个用户占用哪些RB统计吞吐和公平性重点在算法策略第三条是系统级仿真带上基站布局、移动模型和干扰跑大量传输时间间隔主要用于网络规划。标题里强调的是“算法”第二条就够。很多人看到5G就条件反射去搭建nrWaveformGenerator全家桶结果仿真的核心——载波聚合调度策略——反而没写几行。我一般会先用第二条把调度策略跑通把聚合增益的曲线做出来再按演示需要决定要不要回补物理层细节。如果你的授权里有5G Toolbox可以直接调用现成的载波配置对象来生成波形做验证但调度算法本身用手写脚本更透明论文和答辩时能把每一行都解释清楚不会被问“这个黑匣子里是什么”。2.3 代码组织把仿真拆成“参数区、调度循环、输出区”三段一个载波聚合仿真的.m文件建议拆三段。参数区集中放numCC、numRB、scs、simSlots、业务量这些数字后续调参和录像都在第一段改不用满文件找散落的常量调度循环按“每时隙、每CC、每用户”的层次组织或者向量化处理输出区负责画聚合曲线和打印关键数值。三段式结构在交付时有个实打实的好处演示“改一个参数、重跑、看曲线变化”只需要动参数区观众能直观看出哪个参数在起作用。代码里还有一个常见坏习惯一个变量名反复复用。比如tput既存总吞吐又存瞬时速率短脚本跑通没问题一旦开始扫描参数就乱套。命名上带上单位或语义域比如trafficKbit、grantBits、tputSlotKbit看起来啰嗦但调试和写录像脚本时能省大量时间。第三段的输出区不要只画图至少要打印三个数字聚合总吞吐、单载波最高吞吐、聚合增益倍数这三个数字会成为你改参数时判断方向的锚点。3. 用MATLAB跑通载波聚合最小仿真调度器代码与参数下面给一版可以粘进MATLAB直接跑的载波聚合仿真骨架。场景设定为一个基站、两个分量载波1个PCell加1个SCell、4个用户载波带宽各10MHz子载波间隔15kHz每个时隙调度一次。仿真只做MAC层调度不做信道编解码。代码里有中文注释录像和交付时可以直接对着注释讲。3.1 参数区与业务生成%% 参数区 clear; clc; rng(2025); % 固定随机种子保证两次运行结果一致 numCC 2; % 聚合的载波数PCell SCell numUser 4; % 同时调度的用户数 numRB [52 52]; % 每个CC的RB数10MHz15kHz SCS对应52个RB scs [15 15]; % 子载波间隔单位kHzNR标准配置 simSlots 200; % 仿真时隙数1ms一个时隙 bufSize 2000; % 每个用户初始业务量单位kbit %% 生成业务矩阵 traffic rand(numUser, numCC) * bufSize;这段代码是整个仿真的入口。clear和clc清空工作区rng(2025)固定随机种子这是复现的基础——没有固定种子你跑两次的结果不一样后面所有分析都站不住。traffic矩阵用rand生成每用户每载波上的初始业务量模拟非满载Buffer的到达情况。numRB是频域粒度RBResource Block是MAC层调度的最小单位一个RB由12个子载波组成10MHz带宽、15kHz子载波间隔对应52个RB。载波聚合算法最终就是对这52乘2个RB做分配决策。如果你要换子载波间隔比如从15kHz改成30kHz10MHz带宽对应的RB数会减到25左右同时时隙长度从1ms变成0.5ms参数区里的numRB和simSlots要一起调整这个换算关系是仿真参数设计里最容易出错的地方。3.2 比例公平调度器的核心实现%% 比例公平调度器 lambda zeros(numUser, numCC); % 历史累计吞吐kbit granted zeros(numUser, numCC); % 每用户获得的总资源kbit tputSlot zeros(simSlots, numCC); % 每个时隙的调度量kbit for slot 1:simSlots for cc 1:numCC % 瞬时速率业务量越大、信道越好瞬时速率越高 instRate rand(numUser,1) .* (1 traffic(:,cc)); % 比例公平权重 瞬时速率 / 历史吞吐避免单一用户饿死 pfWeight instRate ./ (lambda(:,cc) 1); [~, uid] max(pfWeight); % 选出本时隙本CC的用户 grantBits 100; % 单次调度资源单位kbit traffic(uid, cc) max(traffic(uid, cc) - grantBits, 0); lambda(uid, cc) lambda(uid, cc) grantBits; granted(uid, cc) granted(uid, cc) grantBits; tputSlot(slot, cc) tputSlot(slot, cc) grantBits; end end这段调度器的逻辑是比例公平Proportional Fair算法的精简版。比例公平的核心思想是调度优先级等于瞬时速率除以历史累计吞吐。瞬时速率高的用户有机会被调度而历史吞吐低的用户会获得补偿这样既照顾信道条件好的用户又不让信道差的用户饿死。代码里pfWeight instRate ./ (lambda(:,cc) 1) 就是这一原则的数学表达分母加1是防止除以零。用rand(numUser,1)生成瞬时速率是演示级的简化实际工程里这个值来自终端上报的CQI信道质量指示映射出的MCS等级再折算成瞬时可达速率。traffic参与率的计算隐含了一个建模业务排队越长的用户瞬时速率越高这会让调度器优先清空积压业务本质上是一种队列感知调度。如果你要更贴近协议栈把instRate换成固定的MCS索引表或随机的信道衰落模型即可。grantBits 100 是单次调度给用户分配的比特量。这个值定多少不随意它和RB数量、调制阶数、码率直接相关。在10MHz带宽下一个用户在一个时隙真实能拿到的传输块大小往往在几万到几十万比特这里用100kbit只是演示数值保证200个时隙内有明显的吞吐差异。改成500会让业务更快耗尽改成10会让曲线上升很慢调参方向可以自己试。3.3 输出对比与画图%% 结果输出 avgTputCC mean(tputSlot, 1); % 每个CC的平均吞吐 aggTput sum(avgTputCC); % 聚合总吞吐 bestCC max(avgTputCC); % 单载波最高吞吐 fprintf(聚合总吞吐: %.1f kbit/slot\n, aggTput); fprintf(单载波最高吞吐: %.1f kbit/slot\n, bestCC); fprintf(聚合增益: %.2f 倍\n, aggTput / bestCC); %% 绘图 figure; bar(categorical({聚合总吞吐,单载波最高吞吐}), [aggTput, bestCC]); ylabel(kbit/slot); set(gca, FontName, Microsoft YaHei); % 让坐标轴中文不显示成方框 title(载波聚合增益对比); grid on;打印三行关键数值是为了录像也是调参时判断方向的锚点。聚合增益倍数是核心指标理想满载情况下双载波聚合的吞吐应该接近两个单载波之和也就是增益接近2倍。如果远低于这个值说明业务量不足、用户数太少或SCell没被有效利用。bar图用categorical使横坐标直接显示中文标签set(gca, FontName, Microsoft YaHei)解决MATLAB在部分系统下中文字体回退变方框的问题。3.4 单载波与聚合的对照实验要证明“聚合比不聚合强”代码本身还不够还需要一组对照实验。做法很简单把numCC改成1其余参数完全不变重新运行一遍脚本记录bestCC对应的吞吐再把numCC改回2运行得到aggTput。两组实验用同一个随机种子比较的才是真实的聚合增益而不是随机波动。对照实验做完你会发现单载波和聚合场景的吞吐曲线差异已经足够清晰配合打印出的增益倍数这就是录像里能直接展示的结论。下一章讲怎么通过调参让这条曲线更符合你想表达的故事——是突出峰值速率提升还是突出多用户公平性。4. 载波聚合算法的调参方向先看曲线再动参数基础脚本跑通之后真正花时间的是参数调试。载波聚合仿真里每个参数都不是独立起作用的用户数、载波数、业务量、调度资源四者互相牵制。调参的第一个原则是先固定随机种子第二个原则是一次只动一个参数第三个原则是看曲线而不是只看最终数字。下面的参数表对应第三章的代码建议范围是针对该骨架脚本的合理区间。参数作用建议范围调参说明numCC决定聚合增益上限2到4超过4后视觉差异变小调度复杂度上升numUser用户数越多调度竞争越明显4到16单用户时PF退化为全给一人没有公平性可看numRB载波带宽决定单载波速率上限52对应10MHz换带宽要按SCS重新计算RB数simSlots仿真长度决定曲线稳定性200到1000太短抖动大太长等待时间长grantBits单次调度资源影响业务消耗速度100到500太小跑不完太大曲线直接到顶随机种子复现与对照实验的基础固定对照组必须同种子否则结论不可比4.1 numCC从2升到4先看总吞吐是否按比例上升把numCC从2改成4预期聚合总吞吐接近翻倍这是载波聚合最直观的效果。但实际操作中你会发现如果业务量不够大第4个载波经常处于空闲状态增益曲线出现平台调大bufSize或numUser让每个CC都满负荷才能看到线性叠加效果。这也是仿真的一个教学点聚合增益不是白来的前提是业务足够多。4.2 numUser调度竞争决定公平性和利用率当numUser从4增加到16每个CC在每个时隙只能服务一个用户调度竞争加剧用户间吞吐差异拉大。这时候去看granted矩阵能直观看到比例公平算法的行为信道好的用户拿到更多资源但历史吞吐低的用户也会被补偿不会有用户完全饿死。要演示公平性指标可以把granted按用户归一化成累积分布函数看曲线的拖尾有多长。4.3 simSlots与grantBits的组合别让仿真停在业务耗尽区这三个参数组合是新手最容易翻车的地方。假设bufSize等于2000grantBits等于100每时隙一个用户被调度一次消耗100kbit200个时隙恰好能跑完绝大部分业务如果把grantBits改成500业务在几十个时隙内全部耗尽剩余时隙吞吐全部为零均值被稀释聚合增益看起来就不明显。调参时用一个粗略估算业务总量除以单时隙调度量得到业务耗尽所需时隙数让simSlots落在这个数的1.2到2倍之间曲线既能看出上升过程又能看出稳态。4.4 边界条件什么时候聚合增益会消失有三个边界场景值得写进你的演示材料。第一是业务强度过低每个CC都有大量空闲RB此时聚合不增加总容量只提升单用户可达峰值速率第二是SCell信道极差调度器始终把用户留在PCell上SCell闲置聚合形同虚设第三是SCell激活时延如果算法没有建模激活过程直接把SCell算作可用带宽结果会过于乐观。把这些边界写清楚比只展示增益曲线更有说服力评审或同事问起来也能自圆其说。5. 载波聚合MATLAB仿真的避坑清单现象、原因、解法这套仿真看着简单实际跑起来每一步都可能静默失败。以下几条是反复出现的血泪经验每条按现象、原因、解决三步写你对照自己的报错和曲线就能定位问题。5.1 中文注释乱码脚本打不开现象代码文件一打开中文注释显示成“锟斤拷”一类乱码甚至整行变成问号脚本无法正常运行。原因MATLAB老版本按系统本地编码读取文件如果脚本保存为UTF-8而系统区域设置是GBK编码解析就会错位。很多人从网页或编辑器复制代码回MATLAB粘贴进来的文本编码不统一。解决统一用UTF-8保存脚本在编辑器“主页、预设、编辑器/调试器”里把文件编码设置为UTF-8改完重启编辑器。老版本可以在脚本首行加%#u强制按UTF-8解析。新版本基本不挑编码但交付给别人时仍建议统一UTF-8避免对方打开乱码。5.2 聚合增益只有1.2倍曲线不好看现象双载波跑出来总吞吐只比单载波高一点点聚合增益倍数不到预期曲线平淡。原因业务量不足是最大嫌疑。bufSize太小一个PCell就装下了全部数据SCell永远空闲聚合自然看不出优势。另一个常见原因是numUser等于1调度器没有竞争比例公平算法退化为固定分配多一个载波只是多一份闲置带宽。解决把bufSize加大到需要两个载波才能服务的量级比如2000以上numUser至少设成4。对照实验跑完后打印aggTput除以bestCC的增益倍数如果达不到1.8倍以上先回去查业务强度和用户数。5.3 仿真卡死、内存飙升跑几分钟没反应现象simSlots从200调到1000后脚本运行速度骤降任务管理器显示MATLAB内存持续上涨。原因循环里不断拼接矩阵是头号元凶。如果tputSlot没有预分配每循环一次MATLAB就要重新分配一次内存数据量一大就卡死另一个原因是把绘图语句放在循环内每次迭代都刷新图形窗口性能开销极大。解决所有结果矩阵用zeros预分配plot或bar统一放在循环外循环内最多用条件判断每50个时隙显示一次进度simSlots控制在1000以内超过就改用蒙特卡洛多次短跑取平均。5.4 图例和坐标轴的中文全变方框现象图窗里“聚合总吞吐”显示的是一排方框标题和图例没法阅读。原因MATLAB绘图默认字体是Helvetica字形表里没有中文字形系统字体回退又失败时中文只能按占位符渲染成方框。解决绘图后执行set(gca, FontName, Microsoft YaHei)Windows系统也可以用set(gca, FontName, SimSun)。如果多张图都要用在脚本开头执行set(0, DefaultAxesFontName, SimSun)统一默认字体。要导出PNG图片时注意分辨率设高一点避免文字发虚。5.5 换随机种子结果趋势反转结论说不清现象rng(2025)跑出来聚合增益2.0倍改成rng(1)直接变0.9倍同一个脚本结论完全翻转。原因仿真长度不够随机业务和信道在短时隙序列里没有平均。200个时隙的样本量对随机模型来说太小尾部的波动足以淹没真实趋势。解决做参数扫描时固定一个随机种子跑全组对比实验保证公平做最终结论时要至少跑5个不同种子取平均公布结果时注明使用的种子和simSlots让别人能复现。录像演示时换种子重跑并展示数字稳定本身就是很好的可信度证明。6. 仿真操作录像的录制与交付让对方看懂你的结果标题里带“仿真操作录像”说明交付对象通常不是你自己。很多工程师仿真跑通、曲线画好就交差结果对方追问“这行参数在哪改、跑一遍给我看”时临时开录屏软件手忙脚乱。我一般会把录像拆成三段每段只讲一个目标观众不需要从头看到尾就能找到自己要的部分。6.1 录像前的固定动作录之前把工作区清空关掉无关浏览器和即时通讯窗口避免录进不相关内容。运行一遍脚本确认终端打印的三个数值和之前一致再开始录制把编辑器字号调到16以上窗口拉大保证小屏幕上也能看清代码。这些动作不到五分钟但能省掉重录的时间。6.2 三段录像与验证清单段时长关键画面验收标准第1段 代码结构2到3分钟参数区、调度循环、输出区观众能说出改哪个参数第2段 运行演示1到2分钟脚本运行、终端打印、图窗输出三个打印数值清晰可读第3段 参数对照2分钟改numCC或numUser重新运行曲线差异和增益倍数可见录像时可以用diary命令把终端输出留底跟录像文件放一起作为文字版佐证diary(sim_result.log); % 记录终端输出到文本文件 % 在这里运行主脚本终端打印会被完整写入log diary(off); % 结束记录这段代码不需要放进正式仿真脚本只在做录像和交付时临时用。运行完把sim_result.log复制到交付目录配合录像里的画面对方可以边看录像边对数字信任感比单独扔一个.m文件强得多。载波聚合仿真本身不难难的是让看的人相信你的结果是稳的。固定随机种子、做单载波对照、录三段式操作演示这三件事做完交付材料就能自圆其说。希望帮到你。本文还有配套的精品资源点击获取
返回列表