简介:这份文档面向5G网络优化工程师、无线接入网研发人员及通信专业学习者,系统梳理了NR终端从开机到驻留小区所经历的小区搜索与SIB1探测全流程,帮助读者理解连接建立的第一步为何是网络优化的关键环节。资源为单个docx文件,压缩包约15KB,内容围绕3GPP TS 38.300-5.2.5.3展开,依次讲解频率调谐、PSS/SSS检测、PBCH与MIB解码、基于pdcch-ConfigSIB1定位CORESET0与搜索空间、DCI 1_0盲解、SI-RNTI解析、PDSCH检测及SIB1与其他SIBs解码等九个阶段,并特别说明SSB探测如何将PSS/SSS检测与PBCH解码合并为一步以提升效率。目前已有375人学习,适合需要快速掌握小区搜索信令脉络、排查接入失败与弱信号高移动场景问题的读者作为案头参考。
1. 5G(NR)小区搜索到底在搜什么:从PSS/SSS到SIB1的完整链路
做5G网络优化的人,迟早会碰到一个绕不开的问题:终端明明在信号覆盖范围内,却迟迟驻留不上小区,或者驻留了但业务建立失败。翻遍路测日志,最后往往指向同一个环节——小区搜索没走完,或者SIB1没读全。这份文档把TS 38.300 5.2.5.3里定义的小区搜索流程拆成了九个步骤,从频率调谐一路讲到SIB1解码,核心价值在于把“终端怎么从一片空白到能接入网络”这件事讲透了。它适合两类人:一是做外场优化、需要定位接入失败根因的工程师;二是做终端侧协议栈开发、需要对齐3GPP流程的实现者。文档本身是docx格式,内容围绕流程定义展开,不涉及具体厂商私有实现,属于标准流程的工程化梳理。
2. 小区搜索的物理层基础:PSS、SSS和PBCH-DMRS怎么配合
2.1 同步信号的三件套:各自负责什么
5G NR的小区搜索依赖三个物理信号:PSS(主同步信号)、SSS(次同步信号)和PBCH上的DMRS(解调参考信号)。PSS和SSS合起来叫SSB(同步信号块)里的同步栅格部分,终端通过检测这两个信号拿到时间和频率同步,同时确定物理小区ID(PCI)的一部分。具体来说,NR定义了1008个PCI,PSS承载其中3个取值(0/1/2),对应小区ID的N_ID(2);SSS承载336个取值(0~335),对应N_ID(1)。最终PCI = 3 × N_ID(1) + N_ID(2)。这个设计比LTE的504个PCI多了整整一倍,目的是降低小区间PCI冲突的概率,尤其是在密集组网场景下。
PBCH上的DMRS则负责另一件事:终端在解码PBCH时,需要知道PBCH的参考信号长什么样,才能做信道估计。NR的PBCH DMRS序列与PCI和SSB索引(SSB index)都有关联,终端在盲检PBCH时会尝试不同的DMRS假设,直到解出MIB。这里有个容易混淆的点:PSS/SSS检测和PBCH解码在流程上可以合并成一步,也就是文档里提到的“SSB探测”。实际实现中,终端芯片通常会在同一个处理窗口内完成PSS/SSS相关和PBCH DMRS相关,再统一做PBCH解码。
2.2 同步栅格与信道栅格的区别
文档里提到了“同步栅格(synchronization raster)”,这个概念和“信道栅格(channel raster)”经常被搞混。信道栅格是终端调谐频率时的最小步长,NR在FR1里定义了多种信道栅格,比如100kHz、15kHz等,取决于频段。而同步栅格是SSB可能出现的频点集合,终端在小区搜索时不需要扫描所有信道栅格点,只需要在同步栅格上尝试。NR的同步栅格在FR1里定义了全局同步信道号(GSCN),每个GSCN对应一个SSB中心频点。终端开机后,会按照GSCN列表逐个尝试,而不是全频段盲扫。这个设计大幅缩短了初始小区搜索的时间。
注意:同步栅格和信道栅格不是一回事。做频率规划时,如果只对齐了信道栅格而忽略了同步栅格,终端可能根本找不到SSB。
2.3 SSB的时域结构:为什么终端知道去哪里找
NR的SSB在时域上由4个OFDM符号组成:第0个符号是PSS,第1个符号是PBCH,第2个符号是SSS和PBCH频分复用,第3个符号是PBCH。SSB在半个无线帧(5ms)内可以配置多个候选位置,具体取决于子载波间隔。比如15kHz SCS下,候选位置有4个;30kHz SCS下有8个;120kHz SCS下有64个。终端在小区搜索时,会按照这些候选位置逐个尝试检测PSS。一旦检测到PSS,终端就知道了SSB的时域位置,进而知道帧边界的大致位置。这里的关键参数是ssb-PositionsInBurst,它在MIB里指示了实际发送了哪些SSB。终端在初始搜索阶段还不知道这个参数,所以需要盲检所有候选位置。
2.4 从PSS/SSS到PBCH:终端怎么一步步缩小范围
终端调谐到某个GSCN频点后,第一步是检测PSS。PSS在时域上是一个长度为127的Zadoff-Chu序列,终端通过滑动相关找到峰值,确定SSB的起始符号。第二步是检测SSS,SSS序列与PSS序列有固定的映射关系,终端在PSS已知的情况下解出SSS,得到完整的PCI。第三步是解码PBCH。PBCH携带MIB,MIB里包含系统帧号(SFN)的高位、子载波间隔、pdcch-ConfigSIB1等关键信息。PBCH的DMRS序列与PCI和SSB index绑定,终端在已知PCI的情况下,只需要盲检SSB index和半帧指示。PBCH解码成功后,终端就拿到了MIB,小区搜索的第一阶段完成。
这一步的失败模式很典型:PSS检测不到,通常是频点不对或者信号太弱;SSS检测到了但PBCH解不出来,往往是DMRS假设不对或者信道条件太差。外场优化时,如果发现终端在某个频点反复尝试但始终读不到MIB,优先检查该频点的SSB功率和波束配置。
3. 从MIB到SIB1:CORESET0和DCI 1_0的盲检逻辑
3.1 MIB里的pdcch-ConfigSIB1到底给了什么
MIB解码成功后,终端拿到的最关键参数是pdcch-ConfigSIB1。这个参数只有8个比特,但信息量很大:它指示了CORESET0的时频资源位置和PDCCH的搜索空间配置。具体来说,这8个比特分成两部分:高4位是controlResourceSetZero,低4位是searchSpaceZero。controlResourceSetZero对应一张协议预定义的表格,终端根据这个值查表得到CORESET0的频域宽度(以RB为单位)、时域符号数(1/2/3个符号)和频域偏移。searchSpaceZero则指示了PDCCH监听时机,包括监听周期和偏移。
这里有个工程上容易踩的坑:CORESET0的频域位置是相对于SSB的,而不是相对于载波中心。终端在解码MIB之前只知道SSB的位置,所以协议设计上让CORESET0的频域资源与SSB绑定。具体来说,CORESET0的频域起始RB是根据SSB的RB偏移和controlResourceSetZero查表得到的。如果网络侧配置的CORESET0与SSB频域关系不对,终端就找不到PDCCH,SIB1自然读不到。
3.2 CORESET0的时频资源解析
CORESET0是终端在初始接入阶段唯一能用的控制资源集。它的频域宽度可以是24、48或96个RB,时域长度可以是1、2或3个OFDM符号。具体取值由controlResourceSetZero查表决定。表格在TS 38.213的Table 13-1到13-10里定义,不同频段和子载波间隔对应不同的表格。终端在解码MIB后,根据pdcch-ConfigSIB1的高4位和当前频段、SCS,查表得到CORESET0的具体配置。
频域偏移的计算稍微复杂一些。以FR1为例,CORESET0的RB起始位置 = SSB的RB起始位置 + 偏移值。偏移值由表格给出,单位是RB。终端在已知SSB频域位置的情况下,加上偏移就得到了CORESET0的频域位置。如果这个位置超出了当前载波的带宽范围,终端就认为该小区不可接入。外场优化时,如果发现终端能读到MIB但读不到SIB1,优先检查CORESET0的频域配置是否与SSB对齐。
3.3 DCI 1_0的盲检:SI-RNTI加扰的PDCCH怎么找
终端在CORESET0里监听PDCCH,目的是找到用SI-RNTI加扰的DCI 1_0。SI-RNTI是一个固定值(0xFFFF),终端在初始接入阶段不需要额外配置就知道。DCI 1_0的格式在TS 38.212里定义,用于调度SIB1的PDSCH。终端在搜索空间里按照预定义的聚合等级(AL)和候选位置进行盲检。NR的PDCCH盲检次数比LTE少,因为引入了CORESET和搜索空间的概念,终端不需要全盲扫。
盲检的具体过程是:终端对每个候选位置,用SI-RNTI解扰PDCCH的CRC,如果CRC校验通过,就认为找到了DCI 1_0。DCI 1_0里包含频域资源分配、时域资源分配、调制编码方案(MCS)、冗余版本等参数。终端根据这些参数去解码PDSCH上的SIB1。这里的关键是搜索空间的监听时机:searchSpaceZero查表得到的是PDCCH的监听周期和偏移,单位是时隙。终端只在特定的时隙里监听PDCCH,而不是每个时隙都监听。
3.4 一个可复现的SIB1解码流程
下面用伪代码描述终端从MIB到SIB1的完整处理逻辑,方便对照协议实现:
# 假设已经完成SSB探测,拿到MIB mib = decode_pbch(ssb_buffer) # 从MIB提取pdcch-ConfigSIB1 pdcch_config_sib1 = mib.pdcch_ConfigSIB1 # 8 bits coreset0_index = (pdcch_config_sib1 >> 4) & 0x0F # 高4位 searchspace0_index = pdcch_config_sib1 & 0x0F # 低4位 # 根据频段和SCS查表得到CORESET0配置 # 表格来源:TS 38.213 Table 13-1 ~ 13-10 coreset0 = lookup_coreset0_table(coreset0_index, band, scs) # coreset0包含:频域RB数、时域符号数、频域偏移 # 计算CORESET0的频域起始RB ssb_rb_start = get_ssb_rb_start(ssb_frequency, scs) coreset0_rb_start = ssb_rb_start + coreset0.freq_offset # 根据searchspace0_index查表得到PDCCH监听时机 searchspace0 = lookup_searchspace0_table(searchspace0_index, scs) # searchspace0包含:监听周期(时隙数)、偏移(时隙数) # 在CORESET0里盲检SI-RNTI加扰的DCI 1_0 si_rnti = 0xFFFF for slot in searchspace0.monitoring_slots: for candidate in searchspace0.candidates: dci = blind_decode_pdcch(coreset0, slot, candidate, si_rnti) if dci is not None: # 找到DCI 1_0,解析PDSCH调度信息 break # 根据DCI 1_0调度信息解码PDSCH上的SIB1 sib1 = decode_pdsch(dci.freq_alloc, dci.time_alloc, dci.mcs)这段逻辑的核心是查表和盲检。lookup_coreset0_table和lookup_searchspace0_table对应协议里的预定义表格,实现时直接硬编码即可。盲检部分需要注意:终端在初始接入阶段只监听SI-RNTI,不需要监听其他RNTI。如果在这一步失败,常见原因是CORESET0配置与SSB不对齐,或者搜索空间监听时机配错。
提示:做协议栈开发时,CORESET0的查表逻辑建议直接对照TS 38.213的表格逐项核对,不要凭记忆写。不同频段和SCS对应的表格不同,搞混了会导致终端在特定频段上无法接入。
4. 外场优化中小区搜索的避坑与排查
4.1 现象:终端反复尝试但始终读不到MIB
原因:最常见的是SSB频点与终端搜索的GSCN不匹配。NR的同步栅格在FR1里不是连续的,终端按照GSCN列表逐个尝试,如果网络侧配置的SSB频点不在终端支持的GSCN列表里,终端就永远找不到。另一个原因是SSB功率配置过低,终端在PSS检测阶段就失败了。
解决:先确认网络侧SSB的频点配置,对照终端支持的GSCN列表检查是否在范围内。如果是功率问题,调整SSB的功率偏移(ss-PBCH-BlockPower),确保终端在小区边缘也能检测到PSS。外场测试时,可以用扫频仪确认SSB的实际发射频点和功率,再与终端日志对比。
4.2 现象:MIB能读到但SIB1读不到
原因:CORESET0的频域配置与SSB不对齐,或者pdcch-ConfigSIB1的配置值与实际网络侧不一致。另一个常见原因是PDCCH的聚合等级配置过高,终端在弱信号下无法解调。
解决:检查MIB里的pdcch-ConfigSIB1值,查表得到CORESET0的频域起始RB,确认是否与SSB的RB位置对齐。如果不对齐,需要调整网络侧的CORESET0配置。聚合等级方面,初始接入阶段通常用AL8或AL16,如果外场发现终端在弱场下读不到SIB1,可以尝试降低聚合等级,但要注意覆盖和容量的平衡。
4.3 现象:SIB1能读到但终端不驻留
原因:SIB1里的cellBarred字段被设置为barred,或者cellReservedForOperatorUse被设置为reserved。另一个原因是SIB1里的q-RxLevMin设置过高,终端认为当前信号质量不满足驻留条件。
解决:检查SIB1里的cellBarred和cellReservedForOperatorUse字段。如果是barred,说明该小区被禁止接入,需要确认是否是有意配置。如果是q-RxLevMin问题,根据外场实测的RSRP调整该参数,确保终端在目标覆盖区域内能正常驻留。
4.4 现象:终端在多个频点间反复跳转
原因:终端在某个频点读不到SIB1后,会回到第一步重新调谐到下一个GSCN。如果多个频点都读不到SIB1,终端就会在频点间反复跳转,导致接入时间过长。常见原因是网络侧多个频点的CORESET0配置不一致,或者某些频点的SSB功率不足。
解决:检查各频点的CORESET0配置是否一致,确保终端在每个频点都能正常读到SIB1。如果某些频点确实不需要终端驻留,可以在SIB1里设置cellBarred,让终端快速跳过。外场优化时,建议用终端侧日志记录每次频点跳转的原因,定位是哪个频点出了问题。
4.5 现象:NSA组网下终端搜不到NR小区
原因:NSA组网下,NR小区的搜索依赖于LTE锚点提供的NR测量配置。如果LTE侧没有下发正确的B1或B2测量事件,终端不会主动搜索NR小区。另一个原因是NR小区的SSB频点没有在LTE侧的测量配置里正确指示。
解决:检查LTE侧的RRC重配置消息,确认measConfig里包含了NR的测量对象,且ssbFrequency指向了正确的GSCN。如果终端仍然搜不到,检查NR小区的SSB是否实际发送,以及功率是否足够。NSA场景下,NR小区的搜索时机和独立组网不同,终端只在LTE侧指示的测量间隙里搜索NR,所以测量间隙的配置也会影响搜索成功率。
5. 进阶技巧:用QGIS和终端日志交叉验证小区搜索流程
5.1 把终端日志里的SSB信息落到地图上
外场优化时,终端日志里会记录每次SSB探测的PCI、RSRP、SSB index等信息。把这些信息导出成CSV,用QGIS加载,可以直观看到终端在哪些位置能搜到小区、哪些位置搜不到。具体做法是:从日志里提取SSB_RSRP和PCI字段,加上GPS经纬度,生成点图层。然后按RSRP值做分级渲染,红色表示弱覆盖,绿色表示好覆盖。这样一眼就能看出小区搜索失败的区域是否与弱覆盖区域重合。
如果发现某个PCI在多个位置都搜不到,但该位置的RSRP并不差,那问题可能出在SSB的波束配置上。NR的SSB是波束赋形的,每个SSB index对应一个波束方向。如果某个方向的波束功率不足,终端在该方向就搜不到SSB。这时候需要检查网络侧的SSB波束配置,确认是否所有方向的波束都正常发送。
5.2 用SIB1解码成功率定位CORESET0配置问题
终端日志里通常会记录SIB1解码的成功和失败次数。把SIB1解码成功率按小区和频点统计,如果某个小区的成功率明显偏低,优先检查该小区的CORESET0配置。具体做法是:从MIB里提取pdcch-ConfigSIB1值,查表得到CORESET0的频域起始RB,然后与SSB的RB位置对比。如果偏移量不在协议允许的范围内,终端就解不到PDCCH。
这里有个实操技巧:把CORESET0的频域配置和SSB的频域配置画在同一张频谱图上,直观对比两者的相对位置。如果CORESET0的RB完全落在SSB的RB范围之外,且偏移量超过了协议表格的最大值,那基本可以确定是配置错误。这种问题在跨频段组网时特别常见,因为不同频段的表格不同,配置时容易搞混。
5.3 一个我踩过的坑:忽略SSB index导致误判
有一次外场测试,终端在某个位置始终读不到SIB1,但SSB RSRP很好。查了半天CORESET0配置,发现没问题。后来把终端日志里的SSB index打出来,发现终端只检测到了SSB index 0,而网络侧实际发送了8个SSB。原因是终端在初始搜索阶段只尝试了SSB index 0的PBCH DMRS假设,没有遍历所有候选位置。后来在终端侧调整了盲检策略,遍历所有SSB index,问题解决。
从那以后,我每次排查SIB1解码失败,都强制走一遍SSB index的检查:先确认网络侧实际发送了哪些SSB,再确认终端日志里检测到了哪些SSB,两者对比就能快速定位是终端盲检策略问题还是网络侧配置问题。这个习惯帮我省了很多来回折腾的时间。
希望帮到你。
本文还有配套的精品资源,点击获取