简介:面向5G网络优化工程师及通信技术人员,这份文档系统讲解5G(NR)终端开机后的小区搜索与SIB1探测完整流程,属于5G网络优化方向的实用技术资料。压缩包仅包含1个docx文档,大小15KB,内容精炼且直击要点。文档依据3GPP TS 38.300规范,将小区搜索分解为频率调谐、PSS/SSS检测、PBCH解码、MIB读取、搜索空间配置、DCI盲检、PDSCH解码及SIB1解析等关键步骤,并重点阐释SSB探测如何合并同步检测与PBCH解码以提升搜索效率。通过研读该文档,读者可清晰理解终端接入网络的信令机制,掌握排查小区接入异常与优化网络参数的思路,适合从事5G网络规划、优化及故障处理的工程师参考学习。目前该资源已有375人学习下载。
1. 5G(NR)网络中终端小区搜索和SIB1探测:从空口盲检到RMSI解析的完整链路
5G(NR)的终端在开机、重选或切换时,第一件事不是在某个固定的频点上直接读系统消息,而是在同步栅格上盲检SSB,再沿着SSB携带的MIB参数一路找到SIB1。这段从PSS/SSS相关检测到SIB1解码的过程,本质上是终端和基站之间“先握手、再交换地址簿”的信令契约。很多人在外场测试时只盯着RSRP和SINR,却忽略了SSB与RMSI映射关系、CORESET#0参数集、Type0-PDCCH搜索空间周期这些底层细节——一旦SIB1解不出来,后续的PRACH、RRC建立全部无从谈起。这篇文章面向协议开发、网优和测试工程师,把小区搜索各阶段的理论依据和可落地的排查命令整理清楚,尽量做到能对着空口log逐段验证。
2. 5G(NR)小区搜索第一步:SSB结构、PSS/SSS序列与定时关系
2.1 为什么NR把同步信号设计成SSB突发集
LTE时代同步信号和PBCH是分散映射在整个带宽上的,而NR为了适配波束扫描和多种子载波间隔,设计了SSB(SS/PBCH block)这种紧凑结构。一个SSB在时域上占据4个OFDM符号,在频域上占据240个子载波(20个PRB),其中PSS占符号0中间的127个子载波,SSS占符号2中间的127个子载波,PBCH和它的DMRS则分布在符号1和符号3的整个20个PRB上。
SSB在一个半帧内可以重复发送多次,形成SSB突发集。对于15kHz子载波间隔,一个突发集最多包含8个SSB;对于30kHz,同样最多8个;对于120kHz和240kHz,最多64个。这个“一次发多个”的设计不是冗余——它是为了匹配基站的模拟波束扫描,每个SSB对应一个下行发送波束方向,终端通过测量不同SSB索引来选择最好的波束。因此,小区搜索的第一步实质上是:终端在预定义的同步栅格上,先找到PSS的时频位置,再完成符号定时、频率粗同步、PCI部分检测。
2.1.1 SSB频域位置:同步栅格和Global同步信道号
终端不可能在每一个频点上盲搜,3GPP定义了同步栅格(synchronization raster),步长和频段有关。在FR1频段,同步栅格的步长通常为1200kHz,对应的GSCN(Global Synchronization Channel Number)按频段不同有专门的计算公式。例如在n78频段,GSCN的计算涉及OffsetToPointA和kSSB的换算关系。外场测试中出现小区搜索失败,很多时候不是信号强度不够,而是终端在绝对射频信道号(NR-ARFCN)上搜索,而基站实际配置的SSB落在相邻的同步栅格上,两者偏差超过终端接收机的搜索窗。
2.1.2 PSS和SSS的两级PCI检测
PSS采用的是长度为127的m序列,根据不同的循环移位值,分别对应N_ID^2的0、1、2三种取值。终端通过本地相关运算找到PSS后,就确定了符号定时和频域起始位置,同时得到PCI的模3部分。SSS同样用127长度的m序列,但由两个m序列的乘积构成,携带N_ID^1的0到335取值。
# 简化的PCI检测流程,用于理解PSS/SSS解调顺序 import numpy as np # 假设received_signal是时域接收信号,ssb_symbols是解调出的SSB符号 def detect_pci(pss_corr, sss_corr): # pss_corr: 与3个PSS序列相关后的峰值位置和强度 n_id_2 = np.argmax(pss_corr) # 取值0/1/2,决定PSS序列 n_id_1 = np.argmax(sss_corr) # 取值0~335,决定SSS序列 pci = n_id_1 * 3 + n_id_2 # 物理小区标识 return pci # 说明: # PSS相关只需要做3次,运算量很小;SSS相关需要做336次,但因为已经确定了符号位置, # 只需要在一个OFDM符号内做频域相关。PCI计算完成后,终端才知道用哪个序列去解PBCH的DMRS。这套两级检测的价值在于:PSS检测的计算量从3*N降到一次相关运算,让终端在FeMBB场景下能快速找到候选小区。实际芯片实现还会做多小区并行检测,在同一时刻处理多个SSB突发的峰值,但这种并行不改变PCI检测的顺序逻辑。
2.2 SSB定时和半帧边界的确定
终端在子帧0和子帧5组成的半帧内搜索SSB。但SSB不一定从子帧0的最开始发送,它的起始符号位置由ssb-PositionsInBurst这个SIB1参数决定。在初始小区搜索阶段,终端还没有读到SIB1,所以它假设SSB突发集内每个SSB的候选位置遵循默认映射表。
对15kHz子载波间隔,SSB候选位置在符号2、符号8;对30kHz子载波间隔,候选位置可能是符号4、8、16、20等。终端搜索一遍所有候选位置后,通过PBCH的DMRS序列来确认具体是哪一个SSB索引——DMRS序列携带了SSB索引的低位比特,而PBCH的净荷则携带SSB索引的高位比特。注意到这个细节很重要:在非独立组网或SA组网里,如果SSB突发集配置为10ms周期,但终端默认假设20ms周期检测,那么解PBCH的速率匹配位置就会错位,导致解码失败。
2.2.1 子载波间隔和SSB周期的相互约束
SSB的子载波间隔在FR1频段通常为15kHz或30kHz,它决定了OFDM符号长度和CP长度。如果基站配置的SSB子载波间隔和终端在频点搜索时假设的不同,终端可能根本检测不到PSS。NR协议规定:SSB的子载波间隔和SIB1的子载波间隔可以不同,但两者必须从同一个集合中选择。例如SSB用30kHz,RMSI也用30kHz;SSB用30kHz,RMSI也可以用15kHz,但此时CORESET#0的RB数量、符号数量都要按不同表项选择,这在后续SIB1调度中会专门讨论。
3. PBCH解码和MIB获取:从DMRS序列到RMSI配置参数的映射
3.1 PBCH的物理资源映射和加扰规则
PBCH占SSB内除PSS/SSS之外的所有资源,即符号1和符号3的20个PRB,加上符号2中SSS两侧的48个子载波。PBCH的调制方式是QPSK,总资源单元数为:20PRB * 12子载波 * 2符号 + 48个子载波 - DMRS开销,最终每个SSB的PBCH可以携带32个比特的BCH传输块,经过CRC加扰和极化编码后映射到资源单元。
加扰序列初始化和LTE有很大不同,它的初始化种子依赖物理小区标识PCI和SSB索引的时隙号。这意味着如果PCI估计错误,即使DMRS相关运算通过,PBCH解调后CRC也大概率校验失败。这也是在外场log中区分“SSB检测成功但PBCH失败”和“PBCH成功但SIB1失败”的重要边界。
3.1.1 用DMRS区分不同SSB的加扰序列
# PBCH DMRS序列生成的伪代码,用于理解不同SSB索引的区分原理 def generate_pbch_dmrs(pci, ssb_index, n_cp=0): # 初始化伪随机序列的种子 # 公式参考38.211 7.4.1.3.1,这里简化为示意 c_init = 2**11 * (ssb_index + 1) * (pci // 4 + 1) + 2**6 * (ssb_index + 1) + pci % 4 dmrs_seq = generate_gold_sequence(c_init, length=144) return dmrs_seq # 参数说明: # pci: 已经通过PSS/SSS检测得到的物理小区标识 # ssb_index: 当前检测的SSB在突发集内的编号,取值0~63 # n_cp: 循环前缀类型,FR1通常为0,即普通CP # 终端在相关检测PBCH DMRS时,会遍历所有ssb_index假设,取相关峰值最大者, # 由此得到SSB索引的低位信息,再和PBCH净荷中的高位索引拼接完整值。3.2 MIB的比特字段梳理
PBCH解码成功后得到的BCH传输块即MIB,共23比特有效载荷加8比特CRC。MIB内的关键字段包括:
systemFrameNumber占6比特,是SFN的高6位,加上PBCH隐式携带的SFN低4位(通过加扰序列的循环移位变化体现),组成了10比特完整SFN,范围0到1023。subCarrierSpacingCommon占1比特,指示SIB1采用的子载波间隔,15kHz或30kHz(FR1)。ssb-SubcarrierOffset占4比特,指示SSB和PRB网格之间的频域偏移kSSB,取值范围0到15。pdcch-ConfigSIB1占8比特,其中前4比特指示CORESET#0的配置索引,后4比特指示Type0-PDCCH搜索空间的配置索引。这两个4比特组合指向38.213表13-1到13-10中的具体行,确定了SIB1调度的时频资源。
3.2.1 kSSB的工程意义和常见配置
kSSB在协议里的含义是SSB最低子载波到PRB0最低子载波之间的偏移,单位是子载波。但它不是简单一个绝对位置值——在38.211中,它用于确定SSB和Point A(公共资源块0的中心)的关系。实际外场配置中,SSB子载波间隔和RMSI子载波间隔一致时,kSSB取值为0到11;如果SSB用30kHz而RMSI用15kHz,kSSB取值范围扩展到0到23,因为频率粒度变细了。一个经常踩的坑是:如果kSSB配置过大,导致SSB的频域位置和CORESET#0重叠,终端在检测完PBCH后尝试盲检RMSI PDCCH会遇到干扰,表现为“MIB解出来了但PDCCH一直盲检失败”。
3.3 从MIB到Type0-PDCCH的带宽和周期推导
MIB中的pdcch-ConfigSIB1是本阶段输出的核心结果。它让终端在完全不知道SIB1任何先验信息的情况下,算出RMSI-PDCCH的监听时机。具体来说:
CORESET#0的带宽只能是24、48、96个RB(15kHz SCS下)或24、48、96个RB(30kHz SCS下),但不同配置索引还组合了不同的符号长度(1到3个符号)和偏移量(RB级偏移)。Type0-PDCCH搜索空间则定义了PDCCH监听的起始符号、持续符号数和周期,周期通常是1、2、4、5、8、10、20个时隙。这些组合全部汇总在38.213的表13-1到13-6中,不同频段适用的表不同。
为了把这个过程量化,下面给出一个简化的查表逻辑例子:
# 根据MIB中的pdcch-ConfigSIB1确定RMSI PDCCH监听时机 def get_rmsi_pdcch_config(pdcch_config_sib1, is_fr2=False): # 高4bit是CORESET#0索引,低4bit是搜索空间索引 coreset_zero_index = (pdcch_config_sib1 >> 4) & 0xF search_space_index = pdcch_config_sib1 & 0xF # 以FR1 15kHz SCS为例,引用38.213表13-1和13-3 coreset_zero_mapping = { 0: {'sym': 1, 'nrb': 24, 'offset': 0}, 1: {'sym': 1, 'nrb': 24, 'offset': 2}, 2: {'sym': 1, 'nrb': 24, 'offset': 4}, 5: {'sym': 2, 'nrb': 48, 'offset': 2}, 8: {'sym': 3, 'nrb': 96, 'offset': 0}, } search_space_mapping = { 0: {'period': 1, 'offset': 0, 'duration': 1, 'start_sym': 0}, 1: {'period': 2, 'offset': 0, 'duration': 1, 'start_sym': 0}, 6: {'period': 5, 'offset': 0, 'duration': 1, 'start_sym': 0}, 12: {'period': 10, 'offset': 0, 'duration': 1, 'start_sym': 0}, } coreset = coreset_zero_mapping.get(coreset_zero_index) ss = search_space_mapping.get(search_space_index) return coreset, ss代码里的索引值只列出了少量示例,完整实现必须以3GPP 38.213的表格为准。这里的重点是理解:不同索引组合对应不同的RMSI覆盖能力和时延。CORESET#0的RB数越多,PDCCH容纳的CCE越多,SIB1的DCI 1_0调度就越不容易阻塞;但搜索空间周期越长,终端的平均接入时延越大。实际网络配置中常见的选择是coreset_zero_index=5配search_space_index=0,兼顾覆盖和接入速度。
4. SIB1探测的完整过程:RMSI搜索、DCI调度与PDSCH接收
4.1 从MIB参数到RMSI PDCCH监听的具体流程
SIB1在NR中被称为RMSI(Remaining Minimum System Information),它本身不固定映射在某个PRB上,而是由Type0-PDCCH上的DCI 1_0动态调度。终端在译码MIB后立即进入RMSI监听状态。监听的具体时机由search_space_index确定,包括周期的时隙粒度以及每个周期内的起始符号。以FR1 15kHz SCS为例,如果搜索空间配置是周期2个时隙,偏移0个时隙,持续1个时隙,起始符号0,那么终端需要在每个偶数时隙的符号0开始的CORESET#0内做PDCCH盲检。
PDCCH盲检的搜索空间类型是Type0公共搜索空间,DCI格式是1_0,其CRC用SI-RNTI加扰。SI-RNTI的值为固定的0xFFFF。终端需要用这个RNTI去解扰所有候选PDCCH,如果CRC校验通过,就读取DCI 1_0中的频域资源分配字段、调制编码方案字段、时域资源分配字段,才能最终确定PDSCH的位置和传输参数。
4.1.1 DCI 1_0中与SIB1接收强相关的字段
DCI 1_0用于调度SIB1时,频域资源分配用一个Resource Allocation Type 1的位图表达,其比特数取决于CORESET#0的RB数;调制编码方案字段通常对应QPSK、16QAM、64QAM等;时域资源分配通过查38.214表5.1.2.1.1-1确定PDSCH的起始符号和持续时间;此外还有TB scaling字段,用于调整传输块大小的缩放因子。在SIB1的DCI中,有些字段被改成固定值——比如HARQ进程号固定为0,NDI固定为0,RV固定为0——因为这些信息对SIB1广播没有意义,保留这些字段是为了保持DCI长度稳定,避免增加盲检次数。
4.1.2 SIB1的时域周期和重复窗口
SIB1的调度周期固定为160ms,用户可以在si-WindowLength内重复接收。协议规定在一个SI窗口内,SIB1的PDSCH可以在任意时隙出现多次。实际配置中,si-WindowLength的取值范围从5ms到20ms。在窗口内,终端会持续监听Type0-PDCCH。一次DCI调度成功后,终端会在对应的PDSCH资源上解调传输块,然后校验CRC。如果CRC失败,可以继续在窗口剩余时间内尝试下一次调度。这个机制允许SIB1在没有HARQ重传的情况下获得时域分集增益。
下表列出了SIB1调度相关的关键参数:
| 参数 | 取值/范围 | 对终端行为的影响 |
|---|---|---|
| si-WindowLength | 5/10/15/20 ms | 窗口越大,终端有更多盲检机会,但待机功耗升高 |
| SIB1周期 | 160 ms | 固定值,决定小区搜索的最长等待时间 |
| SI-RNTI | 0xFFFF | 公共RNTI,所有终端共享 |
| 重复次数 | 无显式配置,依赖窗口内多次DCI调度 | 由基站调度策略决定 |
| TB缩放 | 1/0.5等 | 影响最终传输块大小,接收端需要同步处理 |
4.2 SIB1 PDSCH的DMRS和速率匹配细节
终端从DCI里拿到PDSCH时频资源后,还要处理PDSCH的DMRS图案和速率匹配。SIB1使用映射类型A的PDSCH,DMRS位置由dmrs-TypeA-Position决定——但该参数在SIB1中广播,终端没有读到它之前,需要采用一个默认假设。根据38.214,在初始接入阶段终端假设dmrs-TypeA-Position等于2,这个值与第一个DMRS符号位于第3个OFDM符号(索引2)的事实对应。
SIB1的PDSCH还会做速率匹配,避让SSB占用的资源元素。具体如何避让,由SIB1中的ssb-PositionsInBurst和rateMatchPatternToAddModList决定。终端在实际进行PDSCH解映射时,需要把SSB所占的4个符号、240个子载波资源从SIB1的PDSCH资源中抠掉,再进行解调。这里有个经典问题:如果kSSB配置导致SSB和PDSCH的频域位置重叠,PDSCH的可用RE数会比终端预估的少,初期的SIB1解码就会因误码率过高而失败。
4.3 初始接入阶段SIB1盲检的完整流程示例
# 以下是一个基于空口日志的SIB1接收流程检查清单 # 假设使用协议分析工具导出的信令消息 1. SSB检测阶段 - 检查日志中记录的GSCN和NR-ARFCN,确认是否在同步栅格上 - 查看检测到的PCI和本小区规划是否一致 - 记录SSB索引号和对应的RSRP,确认波束扫描完整性 2. PBCH解码阶段 - 查看MIB消息中的pdcch-ConfigSIB1值,例如0x3A - 解析高4bit(3)和低4bit(10),分别查CORESET#0和搜索空间配置 - 检查kSSB字段,确认小于子载波间隔比值对应的门限 3. RMSI PDCCH监听 - 按搜索空间配置确定PDCCH监听时机 - 记录DCI 1_0的SI-RNTI解扰是否成功 - 如果连续4个周期盲检失败,检查CORESET#0的频域偏移 4. SIB1 PDSCH解码 - 根据DCI的时域资源分配字段确定PDSCH起始符号 - 检查无线承载的误码率目标是否达到BLER阈值 - 确认SIB1解码成功,获取小区接入参数4.4 CORESET#0配置和SIB1子载波间隔的组合选择
MIB中的subCarrierSpacingCommon不仅告诉终端SIB1 PDSCH用多少子载波间隔,还影响CORESET#0的映射表选择。当SSB和RMSI使用相同子载波间隔时,CORESET#0的最小频域偏移是0个RB,最大可配置到38个RB偏移;当不同时,偏移以RMSI的SCS为粒度表示,取值范围变大。在NSA组网或高层楼宇覆盖场景下,如果SSB用15kHz、RMSI用30kHz,那么CORESET#0的27个RB带宽在频域上的实际物理宽度会缩小一半,导致PDCCH覆盖变差。外场做过波束管理的工程师通常建议:SSB和RMSI的子载波间隔尽可能保持一致,除非频段政策或双载波配置强制要求拆分。
PRACH时频资源也由SIB1携带。
5.2.1 RACH配置参数如何影响小区搜索阶段的终端行为
SIB1中的rach-ConfigCommon包含prach-ConfigurationIndex、msg1-FDM、msg1-FrequencyStart、prach-RootSequenceIndex等字段。其中prach-ConfigurationIndex决定了PRACH前导格式、时域起点和周期;msg1-FDM决定频分复用的PRACH机会数量;prach-RootSequenceIndex对应前导序列的根序列索引。外场常见的“能解SIB1但随机接入失败”问题,有相当比例是PRACH的时频位置和SSB关联没有配对。
5.2.2 从SIB1中preamble格式看小区覆盖半径
PRACH前导格式的长度直接决定小区覆盖半径:格式0的序列长度是839个子载波,子载波间隔1.25kHz,最多支持约14km覆盖;格式A1/A2/A3使用短序列,支持更大的子载波间隔和波束对应,但覆盖半径显著缩小。SIB1里通过prach-ConfigurationIndex隐式指定了前导格式。在5G覆盖规划和“5G全网排障”场景中,如果发现某小区SIB1解码正常但前导检测不到,首先检查这个格式和实际小区半径是否匹配。极端场景下,前导格式CP长度不足,远端终端的PRACH到达基站后会落在上一个子帧的窗口里,导致基站侧误检。SIB1中还包含preambleReceivedTargetPower,用于指导终端的PRACH发射功率,如果在远点反复做功率爬升但始终无响应,除了路损因素,还要怀疑Msg1频域位置是否越过了实际带宽边界。
5.3 T304定时器和SIB1探测的关联
T304是切换场景下的专用定时器,SIB1探测本身并不读写T304,但T304的启动和停止可以当作SIB1接收成功与否的辅助判断。终端收到切换命令后启动T304,在目标小区执行完整的SSB小区搜索和SIB1(或专用RRC重配置消息中的等效配置)接收。如果目标小区的SIB1无法解码,T304会一直运行到超时,随后终端判定切换失败并触发RRC重建。
SIB1中不直接携带T304配置,它来自源基站的RRC重配置消息。但排障时要把这两个维度放在一起:一个切换请求下发后,源基站侧看切换准备成功,目标基站侧看随机接入迟迟不来——问题大概率出在目标小区的SIB1或CORESET#0配置无法被该终端正确解析。
6. 实战技巧:用最小配置验证SIB1探测链路和常见异常定位
6.1 用仿真平台跑通SSB到SIB1的全链路
在没有商用基站的环境下,可以用Matlab 5G Toolbox或srsRAN快速验证SIB1探测流程。这里给出一个基于srsRAN小区搜索模块的思路:
# 使用srsRAN的nr_cell_search工具(假设已编译安装) # 采集一段包含SSB和SIB1的IQ数据,文件格式为float32 ./nr_cell_search -f 3.52e9 -s 30e3 -a 50 --ssb-period 20 \ --rx-gain 60 -i rmsi_iq.float32 # 参数说明: # -f 3.52e9: 搜索的中心频率,对应真实NR工作频点 # -s 30e3: SSB子载波间隔,这里按30kHz设定 # -a 50: 天线端口索引 # --ssb-period 20: SSB突发集周期,20ms是FR1常见配置 # -i: 输入IQ文件 # 如果上述命令能够输出MIB解码成功和SIB1的RMSI相关信息, # 说明5G(NR)小区搜索的接收链路在物理层实现层面完整可用。在工程实践里,我更倾向于用信道仿真器叠加多径和频偏,验证终端在极端条件下的SIB1探测能力。仿真器可以用Keysight或R&S的信号源,配合Matlab生成SSB和全部SIB1参数,并人为引入频率偏移和相位噪声,观察终端在多大频偏下SIB1解码开始恶化。NR的同步要求终端在初始小区搜索时容忍±5ppm的晶振误差,在毫米波频段这对应几十kHz的绝对频偏,因此SIB1探测前的整数倍频偏估计和PBCH符号级定时对齐是后端性能的分水岭。
6.2 三个最值得优先排查的SIB1失败线索
第一条线索是检查kSSB和RMSI子载波间隔组合。SIB1探测失败的log中,如果MIB解码成功但PDCCH盲检持续失败,先去对比ssb-SubcarrierOffset和subCarrierSpacingCommon。当SSB SCS大于RMSI SCS时,kSSB的粒度变小,一个很小的配置偏差在频域上会被放大,导致终端监听CORESET#0时实际资源和预期完全错开。
第二条线索是核对CORESET#0的带宽和CCE聚合度。默认搜索空间中PDCCH候选集的CCE聚合等级为4和8,在低信噪比区域,如果CORESET#0只有24个RB、1个符号,那么可用的CCE数量非常有限,SI-RNTI的DCI可能被其他公共信令挤占。遇到这种情况,最常见的优化手段是把pdcch-ConfigSIB1调整到更大带宽的CORESET#0配置,例如从24RB调整为48RB。
第三条线索是验证SSB周期和突发集内SSB个数。终端在初始接入时按20ms周期搜索SSB,如果基站配置的是5ms周期,终端依然能搜到,只是时间提前量计算可能不同。但如果实际SSB个数超过终端在FR1最大支持的数量,后发的SSB索引会超出预期范围,PBCH的DMRS相关值出现多个相近峰值,导致选错SSB索引,进而解错SIB1的速率匹配图样。检查信号分析仪上SSB突发集内主同步信号的相对功率,可以快速确认是否存在相邻SSB索引的互扰。
本文还有配套的精品资源,点击获取