5G NR时频域资源网格图全解析:从子载波到资源块
搞5G无线通信这一行不管是做算法、协议栈、网优测试还是刚入门的学生最后都要回到同一张图上——5G NR的时频域资源网格图。这张图不仅定义了信号在时间和频率上的位置也决定了终端能不能正确地收发数据。我第一次看到这张图的时候觉得它像一张棋盘后来做多了才发现它其实是整个5G空中接口的交通规则。这篇文章我会从为什么需要这张图开始逐步拆解资源网格的结构、参数换算、绘制方法以及实际排查中的坑。适合刚接触5G NR的开发者、测试工程师也适合想系统梳理物理层知识的朋友。时频域资源网格图看着复杂但一旦理解透后面看协议、看调度、看信道处理都会顺畅很多。1. 为什么要先理解时频资源网格图1.1 无线通信为什么要把资源画成网格无线通信本质上是把数据调制到电磁波上传输但这门生意不是一个人独占一条信道。几十个、几百个终端要同时跟基站通信就得把时间切成一个个小段、把频率切成一条条窄带然后把不同用户分配到不同的小格子里。这个小格子就是资源单元而所有格子放在一起就是一张二维网格。你可能觉得这个设计和硬盘分区差不多。硬盘把扇区排成二维矩阵通信把时间和频率排成网格本质上都是“按位置管理资源”。5G NR采用OFDM子载波体制后整个带宽被切成多个正交子载波时域被切成OFDM符号二者叠在一起就形成了“子载波行×符号列”的网格图。每个小方块代表一个RE里面能承载一个调制符号。做物理层开发的人每天都在跟这张网格打交道。调度器要在网格里找空位给用户DMRS要在网格里插参考信号控制信息要在网格里占特殊位置。如果没有这张图所有信道映射、资源分配、干扰协调都会变成一团乱麻。1.2 资源网格图解决了什么问题资源网格图最大的价值不是“方便画图”而是提供了一套统一的坐标系。协议里讨论信道映射说“某个信道位于某个子载波、某个符号位置”一切都以坐标为准。比如PDCCH的CORESET配置就是告诉终端“你去网格的哪些位置找控制信息”终端通过这些坐标去盲检DCI。这套坐标系还让多用户调度变得非常清爽。基站可以给用户A分配前几个RB给用户B分配后面几个RB时间上让它们在同一个时隙的不同符号段发送。调度结果从DCI里下发终端拿到后直接去对应坐标解数据。可以这么说时频资源网格图就是5G物理层所有流程的“大地图”后面所有细节都是在这张地图上展开的。另外它也是做信道估计的基础。信道质量随频率和时间变化通过参考信号在网格上的分布接收端才能插值出整个资源块上的信道响应。如果没有网格图参考信号放在哪、数据参考信号怎么对齐都说不清楚。2. 核心概念拆解从子载波到时隙2.1 子载波间隔和参数集Numerology理解资源网格绕不开5G里的Numerology概念。4G LTE只有一种子载波间隔15kHz而5G NR从 15kHz 起步按2的幂次向上扩展15kHz、30kHz、60kHz、120kHz、240kHz。用协议公式表达就是[ \Delta f 15kHz \times 2^{\mu} ]μ取值范围从0到4。μ0对应15kHzμ1对应30kHzμ2对应60kHz以此类推。为什么要搞这么多间隔核心原因是“高速场景需要更大的子载波间隔”。手机在高铁上跑多普勒频移会破坏子载波间的正交性子载波间隔加大后对频偏的抵抗能力更强。同时更大的子载波间隔也能用更短的符号长度适合高频段大带宽下的低时延需求。代价也很明显子载波间隔越大相同带宽内子载波数量越少可用资源也变少。还有循环前缀CP的设计不同Numerology下CP长度不同影响覆盖半径。比如FR1低频段常用30kHzFR2毫米波频段常用60kHz或120kHz。选哪种参数本质上是时延扩展、多普勒频移、覆盖和容量的折中。2.2 从RE到RB再到资源网格资源网格的最小单元叫REResource Element它等于“一个子载波 × 一个OFDM符号”。RE上面承载的可能是一个QAM调制符号也可能是一部分参考信号能量。平时讨论“每个RB有多少RE”其实是把频域子载波数和时域符号数乘一下。RBResource Block定义为频域上12个连续的子载波。这个定义很关键它让“RB”天然变成一个频域单位但因为大家习惯说“时隙里有N个RB”所以又经常把时隙里的14个符号也一起打包。严格讲一个时隙内一个RB包含12×14168个RE普通CP情况下。那一个RB在频域占多宽12个子载波宽度即12×Δf。如果子载波间隔是30kHz一个RB就是360kHz。很多人把“RB带宽”和“子载波间隔”搞混其实RB是逻辑分配单位带宽只是它的物理属性。就像一箱啤酒有12瓶每瓶500mL那整箱就是6000mLRB是那箱子载波间隔是那瓶的容量。2.3 时隙和子帧结构5G NR的时域结构是分层的帧长度10ms每帧10个子帧子帧固定在1ms。但一个子帧里的时隙数量不是固定的它取决于μ。当 μ0 时一个子帧里只有1个时隙时隙长度1ms当 μ1 时一个子帧里有2个时隙每个时隙0.5ms当 μ2 时一个子帧里有4个时隙每个时隙0.25ms。公式是一个子帧里的时隙数 2^μ时隙长度 1/2^μ ms。普通CP下每个时隙包含14个OFDM符号。扩展CP下每个时隙只包含12个符号。资源网格画的时候横轴通常以一个时隙为单位画14列普通CP纵轴画出可用的子载波数量。帧和时隙的边界决定了很多信道映射的起点所以看资源网格时一定要先确认当前配置的μ值否则会把时隙边界和符号数量都算错。3. 5G NR资源网格的详细结构与绘制方法3.1 二维坐标怎么定义在3GPP协议里资源网格的坐标习惯用“子载波编号k”和“符号编号l”表示k是频域从0开始的连续编号l是时域符号编号。每个天线端口和每个子帧都会有一张对应的资源网格。对于物理层实现来说最重要的是知道这个网格的总行数和总列数。行数取决于系统带宽和子载波间隔。5G NR中每个载波最多可以配置3300个子载波FR1场景实际使用的RB数由信道带宽和子载波间隔共同决定协议里给了一张对照表。列数通常就是指一个时隙里的OFDM符号数普通CP时是14列。实际画图时网格的行列数量就确定了每个坐标位置对应一个RE。如果做代码实现一般会用一个二维数组表示资源网格数组大小是 (N_subcarriers, N_symbols) 或 (N_RBs, N_symbols)。填充数据的时候根据映射规则往对应坐标写入“待发送的调制符号”或“0”。接收端处理流程是反着的先拿到网格图再从特定坐标抽取信号做解调。3.2 一个实际例子30kHz、100MHz带宽拿最常见的FR1配置举例信道带宽100MHz子载波间隔30kHzμ1。根据3GPP对照表100MHz带宽、30kHz间隔下可用的RB数为273个。频域子载波总数是 273×12 3276。理论占用带宽是 3276×30kHz 98.28MHz。那剩下的100-98.281.72MHz去哪了作为保护带分散在频谱两侧。这就是为什么你的频谱分析仪上看100MHz的NR信号实际看到的有用信号不是满带宽。很多时候刚接触的人会问“100MHz带宽为什么RB不够300个”实际就是保护带吃掉了部分带宽。时域上配置μ1时一个时隙是0.5ms包含14个OFDM符号。这张资源网格总RE数就是 3276×1445864 个。如果全部用来承载数据一个时隙能传的比特数等于45864×调制阶数×码率÷2单天线时可见资源网格的坐标密度直接决定吞吐量。3.3 用Python画一个简化的资源网格图示意性地可以用Python画一张非常简化的资源网格把下行SSB、PDCCH、PDSCH等位置标出来。实际项目的网格图比这复杂得多但原理是一样的。import matplotlib.pyplot as plt import numpy as np # 模拟一个 20RB x 14 符号的资源网格便于展示 n_rb 20 n_symbols 14 grid np.zeros((n_rb * 12, n_symbols)) # 随便标注前两个符号放 PDCCHRB 5~8 放 PDSCHRB 12~15 放 SSB # 这里直接用 RB 级别填充更直观 grid[:, 0:2] 0.5 # PDCCH占两个符号 grid[5*12:9*12, 2:] 0.7 # PDSCH在大约RB5~RB8区域 grid[12*12:16*12, :] 0.9 # SSB在大约RB12~RB15 plt.figure(figsize(10, 8)) plt.imshow(grid, aspectauto, cmapviridis, originlower, extent[0, n_symbols, 0, n_rb * 12]) plt.xlabel(OFDM Symbol Index (Time)) plt.ylabel(Subcarrier Index (Frequency)) plt.colorbar(labelSignal Power) plt.title(Simplified NR Resource Grid) plt.show()这段代码只是把RB块画成色块展示“频域行、时域列”的二维结构。真做协议栈实现时要按协议规定把RE级的DMRS、CSI-RS、PDCCH的REG bundle都填进去。但可视化思路是一致的先建网格再按坐标填值。4. 资源网格在5G中的实际应用4.1 下行控制信道PDCCH与CORESETPDCCH在资源网格里不是散落分布的而是集中在一部分“控制资源集”CORESET中。CORESET定义了频域RB和时域符号的数量终端在CORESET里盲检PDCCH候选尝试解出DCI。CORESET的时域长度一般是1~3个OFDM符号频域可以横跨整个带宽也可以只占部分带宽。它会和SSB以及其他信道避开重叠。画资源网格时CORESET总是优先占据时隙开始的几个符号这样终端能尽早知道这一时隙有没有自己的调度信息。实际项目里见过不少因为CORESET配置和搜索空间不匹配导致漏检DCI的问题。你在资源网格图上如果看到PDCCH区域和SSB重叠或者CORESET没有落在BWP内大概率是配置错误。这也是为什么要对着资源网格检查配置。4.2 数据信道PDSCH调度与DMRSPDSCH的调度信息由DCI给出DCI里有频域资源分配字段告诉终端从哪个RB到哪个RB占哪些符号。在资源网格上看就是在一个时隙的某些符号范围里划出一块矩形区域给某个用户。但PDSCH不是把所有RE都用来传数据里面还要插DMRS。DMRS用于信道估计它的pattern可以配置为前置第2或第3个符号按配置和额外后续再放几个符号。不同端口、不同CDM组的DMRS图案在网格上的位置都不一样。做接收机的人如果DMRS图案计算错信道估计就会错后面的解调直接崩。我以前排查过一个吞吐率低的案例查到最后是DMRS额外符号的位置没有按高层参数更新导致后面符号的解调性能很差。所以拿到张资源网格图第一件事先标出DMRS位置再决定哪里能放数据。4.3 TDD配置与上下行资源划分FDD的上下行在频域分开TDD则在时域里分。5G NR的TDD配置同样反映在资源网格的时间方向上。一个时隙里的14个符号可以按模式配置为全下行、全上行或者下行符号、保护间隔、上行符号的组合。比如常见的“DSUUU”模式5个时隙一组第一第二个时隙下行第三个时隙是特殊时隙第四第五时隙上行。特殊时隙里又有DwPTS、GP、UpPTS三段GP是为了避免上下行交接时的干扰。在资源网格图中GP区域会平滑地空出来不映射任何数据。这个环节最常见的坑是上下行符号配比和终端期望不一致。全网配置如果一边对着“DDDSU”算另一边对着“DSUUU”算调度器和终端看到的上下行边界就完全错位轻则调度失败重则产生交叉时隙干扰。务必先用资源网格把上下行边界画出来再讨论时频资源分配。5. 常见问题与排查技巧5.1 时域和频域经常搞混的细节刚开始接触资源网格时最容易把“时隙里的符号数”和“频域RB数”混为一谈。比如有人会把一个RB误认为“频域12个符号”其实RB只定义频域。还有一个高频错误把子帧固定1ms等同于时隙固定1ms。μ2时时隙0.25ms子帧仍是1ms一个子帧里有4个时隙。还有个细节是符号编号和CP的关系。扩展CP时一个时隙只有12个符号资源网格的列数就变成12。如果你按14列去网格里找数据位置全部错位。遇到极端时延扩展场景时网络会切扩展CP调试工具里能看到符号数变化。这里建议是拿到任何资源网格图先确认μ、CP类型、时隙序号再开始分析内容否则后面全都白算。5.2 资源分配单位RBG、VRB和PRB资源调度时不是总按单个RB来还有RBG的概念。RBG是一组连续RB大小由BWP带宽和配置决定。资源分配Type0用bitmap按RBG分配Type1则用连续的RB范围表示。做协议栈开发时这两种分配方式的bit宽度和解析逻辑完全不同。VRB和PRB的对应也是老问题。不交织映射时VRB编号和PRB编号一一对应简单粗暴。交织映射时VRB对铺到PRB上会打乱顺序目的是获得频域分集增益。如果你只看一个“物理RB分配”的日志却不知道它解析的是VRB还是PRB很容易完全理解错调度结果。我自己的经验是排查资源利用率问题时先确认分配字段是Type0还是Type1再从VRB映射逻辑反推实际物理RB位置。实网信令里经常能看到DCI里频域字段只有几十比特但通过RBG换算后可以覆盖几百个RB不搞清楚单位会觉得调度结果对不上。5.3 实测中的可视化工具和技巧很多商用终端厂家会提供物理层日志和资源网格视图但直接读原始log并不友好。比较实用的方法是先把RB分配、MCS、功率等信息导出来自己画成二维热力图。比如把一段时间内的PDSCH RB占用率画出来一眼就能看出是否有持续的干扰或调度瓶颈。如果是实验室环境可以用仪表抓取发射信号后离线分析直接看SSB、PDCCH、PDSCH在网格上的相对位置。实测时我还发现通过对比“配置里期望的DMRS位置”和“实际解出的DMRS位置”可以快速定位收发两端参数不一致的问题。具体操作是拿当前标准里DMRS的RE位置生成模板跟解调出来的信道能量图做相关峰值位置偏差一个符号或几个子载波多半就是时频同步或配置mapping错了。最后再分享一个小技巧画资源网格图时别只盯着一时隙看把连续几个时隙拼起来看。5G的很多问题比如上下行配比错位、周期性干扰、SSB簇、调度丢包都会在连续画面上现出规律。单独看一个时隙经常会被偶然的调度抖动带偏判断。我个人在实际操作中的体会是只要你愿意把问题都映射到资源网格坐标上很多“玄学无线问题”都会变成“坐标错位”“资源冲突”“参数不匹配”这类很具体的问题。这个思路从4G到5G都适用也会是接下来做6G研究时最基础的思考方式。