三、时频资源结构:帧结构、资源网格与BWP设计

各位好,我是老张。今天咱们聊聊5G物理层最基础、也最绕不开的一个话题——时频资源结构。

说实话,我刚从4G转到5G那会儿,第一感觉就是:这资源结构怎么这么复杂?帧结构变了,子载波间距能调了,还多了个BWP的概念。但干久了你会发现,这些设计背后都有它的道理。说白了,5G要同时服务手机、工业传感器、自动驾驶,资源分配必须灵活。

3.1 帧结构:10ms的骨架

5G的帧结构,核心就是10ms一帧。这个和LTE一样,但内部拆法完全不同。

  • 无线帧:10ms,系统里的时间大周期
  • 子帧:1ms,一个子帧就是1ms,固定不变
  • 时隙:这个就灵活了。常规CP下,一个时隙是14个OFDM符号

关键来了——子载波间距不同,时隙长度就不同。我列个表,大家一看就明白:

子载波间距 (kHz) 时隙长度 (ms) 每帧时隙数 每子帧时隙数
15 1 10 1
30 0.5 20 2
60 0.25 40 4
120 0.125 80 8
重要提醒:帧号范围是0到1023,系统帧号SFN用10bit表示。这个在同步和寻呼里特别重要,我见过有人把SFN搞错,导致终端死活搜不到小区。

我个人习惯,在实现帧结构时,先确定子载波间距μ值。μ=0对应15kHz,μ=1对应30kHz,以此类推。时隙索引的计算公式是:

// 时隙索引计算
// n_slot 在帧内从0到(10 * 2^μ - 1)
int slotIndexInFrame = (SFN * 10 * (1 << mu)) + slotIndexInSubframe;
// 其中 slotIndexInSubframe 范围是 0 到 (2^μ - 1)
经验之谈:我在做基站协议栈时,习惯把时隙索引作为全局时间基准。所有调度、HARQ、测量都以时隙为最小粒度。这样代码结构清晰,不容易乱。

3.2 资源网格:RE、RB、RBG

资源网格,说白了就是一张二维表。横轴是OFDM符号,纵轴是子载波。每个格子就是一个RE(Resource Element)。

你想想看,一个RB(Resource Block)在频域上占12个子载波,时域上占一个时隙(14个符号)。所以一个RB包含12×14=168个RE。但注意,这里面有些RE被用作参考信号、控制信道,真正能传数据的没那么多。

RBG(Resource Block Group)是调度的基本单位。这个大小取决于BWP的带宽:

  • BWP带宽 ≤ 36个RB时,RBG大小=2或4
  • BWP带宽 37-72个RB时,RBG大小=4或8
  • BWP带宽 73-144个RB时,RBG大小=8或16
  • BWP带宽 > 144个RB时,RBG大小=16
避坑指南:我曾经在实现资源分配时,默认RBG大小是4。结果遇到一个100MHz带宽的场景,RBG大小应该是16,我按4来分,调度器直接崩了。后来我加了个配置表,根据BWP带宽动态计算RBG大小,再也没出过问题。

3.3 BWP设计:带宽部分

BWP是5G引入的一个新概念。为什么要有BWP?原因很简单——省电。

你想,一个手机如果始终监听整个系统带宽(比如100MHz),那功耗得多大?所以5G允许给终端配置一个较小的BWP,只在需要时才切换到更大的BWP。

BWP有几个关键参数:

  1. 起始位置:在公共资源块CRB中的偏移
  2. 带宽:用RB数量表示,范围从24到275个RB
  3. 子载波间距:BWP可以有自己的μ值
  4. 循环前缀:常规CP或扩展CP

我记得在做一个多BWP切换的项目时,遇到一个坑:BWP切换有延迟,终端需要重新调谐射频。如果切换太频繁,反而影响性能。所以我的建议是:

设计原则:初始BWP设小一点(比如24或48个RB),保证终端能快速接入。业务量大时再切换到更大的BWP。切换时机要结合业务量和信道质量,别盲目切换。

代码实现上,BWP的配置通常长这样:

// BWP配置结构体示例
typedef struct {
    uint16_t locationAndBandwidth;  // 起始位置和带宽的联合编码
    uint8_t  subcarrierSpacing;     // 0:15kHz, 1:30kHz, 2:60kHz, 3:120kHz
    uint8_t  cyclicPrefix;          // 0:normal, 1:extended
} BWP_Config_t;

// 解析locationAndBandwidth
// 高N位表示起始位置,低M位表示带宽
uint16_t startRB = (config >> bandwidthBits) & ((1 << startBits) - 1);
uint16_t sizeRB  = config & ((1 << bandwidthBits) - 1);
小技巧:BWP的起始位置和带宽是联合编码的,解析时要注意位宽。我一般先查表确定起始位和带宽位各占多少bit,再移位解析。别直接硬编码,不同带宽配置位宽不一样。

3.4 资源映射的实际流程

好了,我们把帧结构、资源网格、BWP串起来,看看实际怎么用。

假设一个场景:基站要给某个终端分配资源。流程是这样的:

  1. 确定终端的激活BWP,拿到它的起始位置和带宽
  2. 在BWP内,根据RBG大小分配资源
  3. 在分配的RBG内,确定具体的RE位置
  4. 排除参考信号占用的RE,剩下的就是数据RE
  5. 把数据映射到这些RE上,生成时域信号

嗯,这里要注意:资源分配时,频域上以RBG为单位,时域上以时隙为单位。调度器在每个时隙都要做一次资源分配决策。

我曾经在调试时发现,终端上报的CQI和实际信道质量对不上。查了半天,原来是BWP配置错了,终端监听的是另一个频段。从那以后,我每次配BWP都会double-check起始位置和带宽。

最后总结一句:帧结构是时间轴,资源网格是频域轴,BWP是终端的活动窗口。三者配合,才能实现5G灵活的资源调度。搞懂了这些,物理层协议栈的骨架你就抓住了。


公众号:蓝海资料掘金营,微信deep3321