简介:这份《5GNR学习笔记-理论v1.0.pdf》面向通信工程、无线网络优化方向的初学者与进阶读者,系统梳理5G新空口的基础理论框架,帮助读者建立从网络架构到物理层的完整认知。内容涵盖NR总体架构与功能划分,包括gNB与ng-eNB节点、AMF/UPF/SMF三大核心网功能模块,以及NG、Xn接口的协议栈与主要功能;同时深入无线协议栈,对比用户面与控制面的层次差异,重点说明SDAP层在NR中的新增作用。物理层部分讲解波形、子载波间隔与CP配置、帧结构,梳理15KHz至240KHz五种子载波配置、常规与扩展CP的适用条件,以及PRB、时隙与符号数的对应关系。资源包为1个PDF文件,大小约3.23MB,结构紧凑便于随时查阅。目前已有303人学习,适合作为5GNR理论入门与协议栈复习的参考笔记。
1. 从一份 5GNR 学习笔记说起:理论 v1.0 到底该记什么
很多人第一次接触 5GNR,都是从一份名为「5GNR学习笔记-理论v1.0.pdf」的资料开始的。它不像 3GPP 协议原文那样动辄几千页,也不像厂商培训 PPT 那样只给结论不给推导,而是把物理层帧结构、 numerology、带宽部分、参考信号这几块最硬的内容,用工程视角重新串了一遍。问题在于,大多数人拿到这类笔记后,第一反应是「存下来慢慢看」,结果永远停在第一页。真正该做的,是把它当成一张施工图:先搞清楚 5GNR 理论里哪些参数会直接影响你后面调基站、看日志、算吞吐,再决定哪些章节值得反复啃。这篇笔记面向的是刚入行无线优化、传输承载或终端测试的工程师,也适合已经做过 LTE 但想快速把 5GNR 理论框架搭起来的人。下面我按自己带新人的顺序,把这份理论笔记拆成能动手验证的几条线。
2. 5GNR 理论笔记的骨架:帧结构、numerology 与带宽部分怎么串
2.1 先分清 FR1 和 FR2 在笔记里的位置
任何一份 5GNR 理论笔记,第一章几乎都会先甩出频率范围划分。FR1 是 410 MHz 到 7125 MHz,FR2 是 24250 MHz 到 52600 MHz。笔记里通常只给一张表,但实际用起来,这个划分决定了你后面所有参数的单位和量级。比如同样叫一个时隙,FR1 里子载波间隔 15 kHz 时是 1 ms,FR2 里子载波间隔 60 kHz 时就变成 0.25 ms。如果你在看笔记时没有把频率范围钉死,后面算调度周期、算 HARQ RTT 就会全乱。我一般建议在笔记第一页空白处手写一行:FR1 看覆盖和移动性,FR2 看带宽和波束。这样后面每读一个参数,都能先问一句它属于哪个范围。
2.2 numerology 不是玄学,是子载波间隔和符号长度的换算表
5GNR 相比 LTE 最大的理论变化就是引入了多套 numerology。笔记里通常用 μ 表示,μ=0 对应 15 kHz,μ=1 对应 30 kHz,μ=2 对应 60 kHz,μ=3 对应 120 kHz,μ=4 对应 240 kHz。每往上走一级,子载波间隔翻倍,符号长度减半,一个时隙里的符号数仍然是 14 个,但绝对时间缩短。这个换算关系必须背到能脱口而出,因为后面看 DCI 调度、看 TDD 配比、算上行覆盖,全都要用。我见过太多人把 μ=1 的时隙当成 1 ms 来算,结果吞吐量预估直接差一倍。笔记里如果只给了公式,你最好自己补一张表,把每个 μ 对应的时隙长度、符号长度、CP 开销都列出来,贴在显示器边上。
2.3 带宽部分 BWP 是笔记里最容易被跳过但最该动手画的部分
BWP 是 5GNR 里比较新的概念,一份理论笔记如果只写「BWP 是带宽子集」,那基本等于没写。实际工程里,BWP 决定了终端在哪个频段上收 PDCCH、在哪个频段上发 PUSCH,还决定了初始接入时用哪个 BWP。笔记里通常会画一张图,显示一个载波里可以配多个 BWP,但不会告诉你为什么需要多个。我一般会带着新人做一件事:拿一个 100 MHz 的载波,假设子载波间隔 30 kHz,算出一个 BWP 最多能占多少个 PRB,然后手动标出初始 BWP、专用 BWP 和默认 BWP 的位置。这个动作做完,后面看 RRC 重配消息里的 BWP 切换就不会懵。笔记里的理论值要和实际配置对一遍,对不上就说明你漏了保护带或者载波聚合的偏移。
2.4 参考信号:DMRS、PTRS、CSI-RS 在笔记里各自管什么
5GNR 的参考信号比 LTE 更灵活,也更让人头大。DMRS 用于解调,PTRS 用于相位跟踪,CSI-RS 用于信道测量。笔记里一般会分别介绍,但不会强调它们之间的时序关系。实际看日志时,你会发现 DMRS 的配置直接决定了 PDSCH 能解调成什么样,PTRS 只在 FR2 高频段才真正起作用,CSI-RS 的周期又和波束管理绑在一起。我建议在读这一章时,拿一张纸画出三个参考信号在一个时隙里的位置,然后标出哪些符号是固定的,哪些是可配的。这个图一旦画出来,后面看 MIB、SIB1 里的配置字段就会快很多。笔记里的理论描述是骨架,你自己画的图才是血肉。
3. 把理论笔记变成可复现的验证步骤:从参数计算到日志对照
3.1 用 Python 算一遍 numerology 和时隙长度
光看笔记里的公式容易飘,最好写几行代码把关键参数算出来。下面这段脚本把 μ 从 0 到 4 的时隙长度、符号长度、每帧时隙数都打出来,你可以直接拿去和笔记里的表格对。
# 5GNR numerology 关键参数计算 # 参考 3GPP TS 38.211 中的帧结构定义 subcarrier_spacing_base = 15 # kHz,基础子载波间隔 symbols_per_slot = 14 # 常规 CP 下每个时隙的符号数 slots_per_frame = 10 # 一帧 10 ms for mu in range(5): scs = subcarrier_spacing_base * (2 ** mu) # 子载波间隔 kHz slot_duration_ms = 10 / (2 ** mu) # 一个时隙的绝对时长 ms symbol_duration_us = slot_duration_ms * 1000 / symbols_per_slot # 符号时长 us slots_per_subframe = 2 ** mu # 每个子帧的时隙数 print(f"μ={mu}, SCS={scs}kHz, 时隙={slot_duration_ms:.4f}ms, " f"符号={symbol_duration_us:.2f}us, 每子帧时隙数={slots_per_subframe}")这段代码的逻辑很直接:子载波间隔每翻一倍,时隙长度就减半,符号长度也减半。参数说明里要注意,symbol_duration_us 算的是包含 CP 的平均符号长度,不是纯 FFT 周期。如果你拿这个结果去和笔记里的表对,发现 μ=2 时时隙长度是 0.25 ms,那就说明你算对了。这个脚本我一般让新人自己敲一遍,不要复制,敲的过程中就会记住 2 的幂次关系。
3.2 用表格把 BWP 配置和 PRB 数量对齐
BWP 的理论计算离不开 PRB。下面这张表是我从笔记里整理出来的,假设载波带宽 100 MHz、子载波间隔 30 kHz,不同 BWP 配置下对应的 PRB 数和占用带宽。你可以拿它去对照实际基站配置。
| BWP 类型 | 起始 PRB | PRB 数量 | 占用带宽 (MHz) | 典型用途 |
|---|---|---|---|---|
| 初始 BWP | 0 | 24 | 8.64 | 小区搜索、SIB1 接收 |
| 默认 BWP | 0 | 66 | 23.76 | 空闲态驻留 |
| 专用 BWP | 10 | 132 | 47.52 | 业务态调度 |
| 高频专用 BWP | 20 | 264 | 95.04 | FR2 大带宽场景 |
表格里的占用带宽是按 30 kHz 子载波间隔、每个 PRB 12 个子载波算出来的,实际还要扣保护带。笔记里如果只给了 PRB 数量没给带宽,你就自己乘一下。这张表的价值在于,当你看到 RRC 重配里 BWP 的 PRB 范围时,能立刻反应出它占了多少频谱,会不会和邻区冲突。
3.3 从 MIB 和 SIB1 里反推理论参数
理论笔记读完后,最好的验证方式是抓一次真实的小区搜索日志,把 MIB 和 SIB1 里的字段和笔记里的定义对一遍。MIB 里会带 pdcch-ConfigSIB1、subCarrierSpacingCommon、dmrs-TypeA-Position 这些字段。你拿笔记里 DMRS 类型 A 的位置定义,去对日志里的 dmrs-TypeA-Position 是 pos2 还是 pos3,就能知道这个小区用的是哪种时域图案。SIB1 里会带 initialUplinkBWP 和 initialDownlinkBWP,把里面的 locationAndBandwidth 字段换算成 PRB,再和上面那张表对,就能验证你算的 BWP 对不对。这个过程不需要连基站,很多终端测试仪表都能导出日志。我一般会要求新人至少对三个不同的小区,把 MIB 和 SIB1 的关键字段抄下来,和笔记里的理论值做一次交叉验证。对不上的地方,往往就是笔记里没写清楚的边界条件。
3.4 用 TDD 配比验证时隙格式
5GNR 的 TDD 配比在笔记里通常只给一个示意表,但实际网络里配比是半静态加动态的。你可以拿笔记里的时隙格式定义,去对一下实际配置。比如一个 DDDSU 的周期,D 是下行时隙,U 是上行时隙,S 是特殊时隙。特殊时隙里又分下行符号、灵活符号、上行符号。笔记里如果写了「特殊时隙的符号分配由 tdd-UL-DL-ConfigCommon 决定」,你就去找这个 IE 里的 nrofDownlinkSymbols 和 nrofUplinkSymbols,算一下灵活符号还剩几个。这个动作能帮你理解为什么有些小区上行调度会卡在特殊时隙的边界上。我见过一个案例,特殊时隙里灵活符号配了 6 个,但实际调度只用了 4 个,剩下 2 个被保护间隔占了,笔记里没提保护间隔,结果新人算上行吞吐时多算了 2 个符号,误差就出来了。
4. 5GNR 理论笔记里最容易翻车的几个坑
4.1 把 μ 和时隙长度记反,导致调度周期算错
现象:看笔记时觉得 μ=1 就是 1 ms 时隙,配调度周期时按 1 ms 配,结果实际只有 0.5 ms,HARQ 反馈对不上。原因:笔记里通常把 μ 和子载波间隔放在一起写,时隙长度另起一行,读快了就容易串。解决:自己画一张 μ 到 时隙长度 的映射表,贴在工位上,每次配参数前看一眼。我自己的习惯是把 μ=0 到 μ=4 的时隙长度写成 1、0.5、0.25、0.125、0.0625,单位 ms,背下来。
4.2 BWP 切换时忘了默认 BWP 的回退
现象:专用 BWP 配置了 132 个 PRB,但终端在某个时刻突然回到 24 个 PRB 的初始 BWP,吞吐掉底。原因:笔记里只讲了 BWP 切换的触发条件,没讲 BWP 定时器超时后会回退到默认 BWP。解决:在笔记的 BWP 章节旁边补一行「bwp-InactivityTimer 超时回默认 BWP」,然后去查这个定时器的实际配置值。一般默认 BWP 的 PRB 数比专用 BWP 少,回退后调度器需要重新分配资源,如果没预留过渡时间,就会丢包。
4.3 DMRS 类型选错,解调门限直接恶化
现象:同样的信道质量,别人能解 256QAM,你只能解 64QAM。原因:笔记里 DMRS 类型 A 和类型 B 的时域位置不同,类型 A 靠前,类型 B 靠后,选错了会导致信道估计不准。解决:先确认笔记里 dmrs-TypeA-Position 的取值,再去对实际配置。类型 A 适合常规 CP,类型 B 适合短时隙。如果你在 FR2 用类型 A 配短时隙,DMRS 符号不够,解调性能就崩。我一般会在笔记上标注:FR1 常规时隙优先类型 A,FR2 短时隙优先类型 B。
4.4 参考信号周期和波束扫描周期搞混
现象:CSI-RS 配了 20 ms 周期,但波束扫描是 5 ms 一次,结果 CSI 上报跟不上波束切换。原因:笔记里把 CSI-RS 和波束管理放在两章,没强调两者的周期要匹配。解决:把 CSI-RS 周期设成波束扫描周期的整数倍,或者反过来。实际配置里,SSB 周期和 CSI-RS 周期要一起看。我踩过的坑是 SSB 配了 20 ms,CSI-RS 配了 10 ms,结果终端在 SSB 没发的时隙里做 CSI 测量,测了个寂寞。
4.5 把理论峰值吞吐当成实际可调度吞吐
现象:按笔记里的公式算,100 MHz、30 kHz、4 层 MIMO 能到 1.5 Gbps,实际一测只有 800 Mbps。原因:笔记里的峰值是假设所有符号都用于 PDSCH、所有 PRB 都满调度、没有控制开销。实际有 PDCCH 占符号、有 DMRS 占 RE、有保护带、有 SSB 开销。解决:在笔记的吞吐公式旁边补一个开销系数,一般控制开销按 15% 到 20% 估,DMRS 开销按 1/4 到 1/3 估。我自己的经验是,理论峰值打七折才是实际能调度的上限,打五折才是稳定吞吐。
5. 把理论笔记用活:从参数反查到排障的进阶习惯
理论笔记读到最后,最容易陷入的误区是把它当字典,遇到问题才翻。我自己的做法是反过来:先拿一个实际排障案例,然后逼自己从笔记里找出对应的理论依据。比如有一次遇到上行覆盖受限,终端在小区边缘发 PUSCH 一直失败。我先去笔记里翻 PUSCH 的功率控制公式,找到路损补偿因子 alpha 和 P0 的配置,然后去查实际参数,发现 alpha 配了 1,P0 配了 -100 dBm,但终端上报的功率余量已经到 0 了。这说明理论公式里的路损补偿已经拉满,问题不在功率控制,而在上行波形。再翻笔记的 DFT-s-OFDM 和 CP-OFDM 章节,发现这个小区配的是 CP-OFDM,而终端在边缘应该用 DFT-s-OFDM 来降低峰均比。把波形切换后,上行覆盖立刻改善。这个案例让我养成一个习惯:每次排障,先定位到笔记里的哪个公式或哪张表,然后只改那个公式里的变量,不要东改西改。
另一个习惯是定期把笔记里的参数和现网配置做一次批量对照。我一般会导出基站侧的 BWP 配置、TDD 配比、DMRS 类型、CSI-RS 周期,然后写一个简单的脚本和笔记里的理论值做 diff。下面这段伪代码展示了思路,实际用 Python 读 CSV 就行。
# 理论值与现网配置对照的伪代码 # 假设 theory.csv 和 live.csv 都有 cell_id, param, value 三列 import csv def load_params(path): params = {} with open(path) as f: for row in csv.DictReader(f): key = (row['cell_id'], row['param']) params[key] = row['value'] return params theory = load_params('theory.csv') live = load_params('live.csv') for key in theory: if key in live and theory[key] != live[key]: print(f"不一致: {key}, 理论={theory[key]}, 现网={live[key]}")这段代码的关键是 key 的设计,cell_id 加 param 能唯一确定一个配置项。参数说明里要注意,value 的类型要统一,字符串比较容易把 30 和 30.0 判成不一致。我一般会在加载时做一次归一化。这个对照脚本跑一次,就能把笔记里过时的或者理解错的地方全暴露出来。我自己的笔记已经改过三版,每次都是被现网配置打脸后改的。
最后一个习惯是给笔记留「后悔药」。每次改配置前,先把当前配置和笔记里的理论值截个图,存到一个按日期命名的文件夹里。改完如果出问题,直接回滚,不用凭记忆恢复。这个习惯听起来笨,但救过我两次。一次是改 BWP 的 PRB 数,改完发现终端接入不了,翻出截图一看,初始 BWP 的起始 PRB 被我不小心从 0 改成了 10,终端搜不到 SSB。回滚后五分钟恢复。理论笔记的价值不在于你读了多少遍,而在于你每次动手前有没有拿它当检查清单。希望帮到你。
本文还有配套的精品资源,点击获取