【PUSCH第三期】5G NR QC-LDPC编码深度解析:从协议校验矩阵构造到MATLAB完整实现

5G NR QC-LDPC编码深度解析:从协议校验矩阵构造到MATLAB完整实现

摘要:本文依据3GPP TS 38.212标准(章节5.2.2与5.3.2),系统解析5G NR中QC-LDPC校验矩阵的构造原理与编码流程。内容涵盖:基矩阵设计、扩展因子与循环移位值计算,并以TBS=192为例完整演示从传输块到编码输出的全过程。最后提供MATLAB平台的两种实现:使用5G Toolbox内置函数,以及完全手动构造校验矩阵并实现编码的不依赖工具箱版本。


1 QC-LDPC的提出背景

5G NR中传输块(TB)的大小多种多样,NR要求编码支持1bit颗粒度的任意信息比特长度匹配,即可对任意长度的信息进行编码。传统LDPC编码需要根据信息块大小设计不同的校验矩阵,需要存储大量不同的校验矩阵,存储开销极大(传统LDPC的校验矩阵一般是固定不改变的)。因此准循环LDPC(QC-LDPC)构造方法被提出,用于构造满足NR需求的校验矩阵H。

QC-LDPC构造核心分为两部分:基矩阵B (框架矩阵,一般本身可保持固定)+ 循环移位值矩阵V,二者元素一一对应,整体通过扩展因子Z完成最终校验矩阵的扩展。

在理解了QC-LDPC的基本思想之后,下面首先介绍其最基础的构造规则,即基矩阵与循环移位值矩阵如何共同生成最终的校验矩阵。


2 QC-LDPC基础构造逻辑

2.1 基矩阵与循环移位矩阵的对应规则

循环移位值矩阵V中每个元素 vijv_{ij}vij 称为循环移位值,取值范围为 {−1,0,1,2,...,Z−1}\{ -1, 0, 1, 2, ..., Z-1 \}{−1,0,1,2,...,Z−1}(Z为扩展因子),每个 vijv_{ij}vij 对应生成一个 Z×ZZ \times ZZ×Z 的子矩阵,生成规则为:以Z阶单位矩阵为基础,根据 vijv_{ij}vij 做对应次数的右循环移位,具体对应关系:

循环移位值 vijv_{ij}vij 最终生成的 Z×ZZ \times ZZ×Z 子矩阵
-1 全零矩阵
0 Z×ZZ \times ZZ×Z 单位矩阵(移位0次)
k (1 ≤ k ≤ Z-1) Z×ZZ \times ZZ×Z 单位矩阵右移k次得到的循环子矩阵

完整示例(原笔记示例,Z=3)

已知循环移位矩阵为:

V=[−102010] V = \begin{bmatrix} -1 & 0 & 2 \\ 0 & 1 & 0 \end{bmatrix} V=[−100120]

扩展因子 Z=3Z=3Z=3。

按照规则逐元素扩展后,得到完整校验矩阵 H。每个元素替换为 3×33 \times 33×3 子矩阵,然后拼接起来。详细展开如下:

  • v11=−1→3×3v_{11} = -1 \rightarrow 3 \times 3v11=−1→3×3 全零矩阵:

    000000000\] \\begin{bmatrix} 0 \& 0 \& 0 \\\\ 0 \& 0 \& 0 \\\\ 0 \& 0 \& 0 \\end{bmatrix} 000000000

    100010001\] \\begin{bmatrix} 1 \& 0 \& 0 \\\\ 0 \& 1 \& 0 \\\\ 0 \& 0 \& 1 \\end{bmatrix} 100010001

    001100010\] \\begin{bmatrix} 0 \& 0 \& 1 \\\\ 1 \& 0 \& 0 \\\\ 0 \& 1 \& 0 \\end{bmatrix} 010001100

  • v22=1→v_{22} = 1 \rightarrowv22=1→ 单位矩阵右移1次:

    010001100\] \\begin{bmatrix} 0 \& 1 \& 0 \\\\ 0 \& 0 \& 1 \\\\ 1 \& 0 \& 0 \\end{bmatrix} 001100010

将这些子矩阵按位置拼接,得到 6 行 9 列的完整校验矩阵 H(用分块竖线分隔):

H=[000100001000010100000001010100010100010001010001100001] H = \left[\begin{array}{ccc|ccc|ccc} 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 1 & 0 \\ \hline 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 1 & 0 & 1 & 0 \\ 0 & 0 & 1 & 1 & 0 & 0 & 0 & 0 & 1 \end{array}\right] H= 000100000010000001100001010100001010010100001010100001

各分块对应关系(和原笔记完全一致):

分块位置 循环移位值 vijv_{ij}vij 分块类型
第一行第一块 -1 全零矩阵
第一行第二块 0 单位矩阵
第一行第三块 2 单位矩阵右移2次
第二行第一块 0 单位矩阵
第二行第二块 1 单位矩阵右移1次
第二行第三块 0 单位矩阵

构造核心结论:基矩阵本身码率比较高,通过扩展因子增加行数后,得到低密度的稀疏校验矩阵,这种构造可以灵活支持高码率到低码率的传输块适配,满足NR的TB传输需求,更好地支持IR-HARQ。

上述规则展示了QC-LDPC的通用构造方法。接下来,我们将聚焦于5G NR的具体实现,即NR所采用的基矩阵的内部结构及其与最终校验矩阵分块之间的对应关系。

2.2 NR QC-LDPC 基矩阵的五子矩阵与最终校验矩阵的分块结构

NR 的 QC-LDPC 基矩阵 (BG) 本身由五个子矩阵拼接而成,结构如下:

BG=[ABCDE] \text{BG} = \begin{bmatrix} A & B & C \\ D & E & \end{bmatrix} BG=[ADBEC]

各部分含义:

  • A:承载系统信息位(信息比特)
  • B :方阵,对应校验比特,采用双对角线结构(便于快速编码,降低错误平层)
  • C:全零矩阵
  • DE:用于 IR-HARQ 扩展,支持灵活码率降低

当将这个基矩阵用扩展因子 Z 扩展成真正的校验矩阵 H 时,上述结构自然映射为:

H=[HcoreOHextI] H = \begin{bmatrix} H_{\text{core}} & O \\ H_{\text{ext}} & I \end{bmatrix} H=[HcoreHextOI]

其中:

  • HcoreH_{\text{core}}Hcore 是由 [AB][A \quad B][AB] 部分扩展得到的高码率核心校验矩阵(对应初传的高码率码字)
  • HextH_{\text{ext}}Hext 是由 D 和 E 部分扩展得到的扩展校验矩阵(用于递增冗余重传)
  • O 是全零矩阵(由 C 扩展而来)
  • I 是单位矩阵(由 E 扩展而来,因为 E 本身就是单位阵,扩展后变成多个 Z×ZZ \times ZZ×Z 单位阵组成的对角块)

这种设计的优点:等价于一个高码率 LDPC 码后面串接多个单校验比特 。初传只发送 HcoreH_{\text{core}}Hcore 对应的码字;若接收失败,重传时发送 HextH_{\text{ext}}Hext 中的额外校验比特(即递增加冗余),接收端合并后码率降低,译码成功率提高。这就是 IR-HARQ 的物理基础。

构造校验矩阵还需要的两个关键参数是扩展因子 Z 和循环移位值 PijP_{ij}Pij。下面分别介绍它们的取值集合与计算方法。


3 扩展因子Z与循环移位值计算

3.1 扩展因子Z定义

本部分定义出自3GPP TS 38.212 5.3.2节。一个完整的QC-LDPC码由基矩阵、循环移位值矩阵和扩展因子 Z 共同构成。5G NR定义了8组扩展因子,形式为:Z=a×2jZ = a \times 2^jZ=a×2j,其中 a∈{2,3,5,7,9,11,13,15}a \in \{2,3,5,7,9,11,13,15\}a∈{2,3,5,7,9,11,13,15},j∈{0,1,2,3,4,5}j \in \{0,1,2,3,4,5\}j∈{0,1,2,3,4,5}。因此Z的取值范围为 2≤Z≤3842 \leq Z \leq 3842≤Z≤384。BG1支持的最大信息位长度为 22×384=844822 \times 384 = 844822×384=8448,BG2支持的最大信息位长度为 10×384=384010 \times 384 = 384010×384=3840。

不同集合索引 iLSi_{LS}iLS 对应不同的Z集合,如下:

3.2 循环移位值 PijP_{ij}Pij 计算

本部分定义出自3GPP TS 38.212 5.3.2节第20页。协议预定义了基准循环移位值 VijV_{ij}Vij,我们最终用的循环移位次数 PijP_{ij}Pij 由下式计算:Pij=Vijmod  ZP_{ij} = V_{ij} \mod ZPij=VijmodZ。得到PijP_{ij}Pij后,就可以将单位矩阵右移PijP_{ij}Pij次,得到最终的 Z×ZZ \times ZZ×Z 子矩阵。

计算示例(原笔记示例)

若 iLS=3i_{LS} = 3iLS=3,取 Z=7Z = 7Z=7,对应基准值 V00=23V_{00} = 23V00=23,则 P00=23mod  7=6P_{00} = 23 \mod 7 = 6P00=23mod7=6。

扩展后得到的 7×77 \times 77×7 循环移位子矩阵为(单位矩阵右移6次):

0000001100000001000000010000000100000001000000010\] \\begin{bmatrix} 0 \& 0 \& 0 \& 0 \& 0 \& 0 \& 1 \\\\ 1 \& 0 \& 0 \& 0 \& 0 \& 0 \& 0 \\\\ 0 \& 1 \& 0 \& 0 \& 0 \& 0 \& 0 \\\\ 0 \& 0 \& 1 \& 0 \& 0 \& 0 \& 0 \\\\ 0 \& 0 \& 0 \& 1 \& 0 \& 0 \& 0 \\\\ 0 \& 0 \& 0 \& 0 \& 1 \& 0 \& 0 \\\\ 0 \& 0 \& 0 \& 0 \& 0 \& 1 \& 0 \\end{bmatrix} 0100000001000000010000000100000001000000011000000 有了基矩阵结构、扩展因子和循环移位值的计算方法,还必须了解在编码开始之前传输块需要经过哪些预处理步骤。以下依据TS 38.212 §5.2.2依次介绍CRC附加、基图选择、码块分割、Kb与Zc的确定以及编码后长度。 *** ** * ** *** ### 4 协议规定的准备阶段(TS 38.212 §5.2.2) #### 4.1 TB 级处理 * 输入:传输块比特序列 a0,a1,...,aB−1a_0, a_1, ..., a_{B-1}a0,a1,...,aB−1(B 为 TB 大小,不含 CRC) * **CRC 附加** :若 B\>3824B \> 3824B\>3824,在 TB 末尾附加 24 位 CRC;否则附加 16 位 CRC。得到 B′B'B′(含 CRC 的总比特数)。 #### 4.2 基图选择 选择 BG1 或 BG2 的条件(满足任一即选 BG2,否则 BG1): if (B ≤ 292) or (B ≤ 3824 and R ≤ 0.67) or (R ≤ 0.25) then BG = BG2 else BG = BG1 end if #### 4.3 码块分割 * 若 BG1,最大码块大小 Kcb=8448K_{cb} = 8448Kcb=8448;若 BG2,Kcb=3840K_{cb} = 3840Kcb=3840。 * 若 B′≤KcbB' \\leq K_{cb}B′≤Kcb,不分割(C=1C=1C=1)。否则分割为 C=⌈B′/(Kcb−24)⌉C = \\lceil B' / (K_{cb} - 24) \\rceilC=⌈B′/(Kcb−24)⌉ 个码块,每个码块末尾再附加 24 位 CRC。 * 最终所有码块的总比特数为 B′′=B′+C×24B'' = B' + C \\times 24B′′=B′+C×24。 * 每个码块的信息长度(含该码块自己的 CRC)为 K′=⌈B′′/C⌉K' = \\lceil B'' / C \\rceilK′=⌈B′′/C⌉。 #### 4.4 确定 KbK_bKb 与扩展因子 ZcZ_cZc **对于 BG1** :Kb=22K_b = 22Kb=22 固定。 **对于 BG2** :根据 B(不含 CRC)确定 KbK_bKb: | B 范围(不含 CRC) | KbK_bKb | |:--------------:|:-------:| | B \> 640 | 10 | | 256 \< B ≤ 640 | 9 | | 192 \< B ≤ 256 | 8 | | B ≤ 192 | 6 | 然后从第3.1节的Z集合中选择最小的 ZcZ_cZc,使得 Kb×Zc≥K′K_b \\times Z_c \\geq K'Kb×Zc≥K′。最终每个码块的信息比特长度 K=Kb×ZcK = K_b \\times Z_cK=Kb×Zc,填充 NULL 比特的数量 F=K−K′F = K - K'F=K−K′。 #### 4.5 编码后长度 * BG1:N=66ZcN = 66 Z_cN=66Zc * BG2:N=50ZcN = 50 Z_cN=50Zc 以上准备阶段给出的参数均为抽象公式。为使读者更直观地理解整个流程,下面以 TBS=192 为例,完整演示从传输块到编码输出的每一个具体步骤。 *** ** * ** *** ### 5 完整示例:TBS=192 本节以 **TBS=192** 比特为例,严格按照上述步骤计算参数并编码。本示例完整演示从TB到编码输出的全过程,包括校验矩阵构造、输入序列准备、校验比特生成和输出映射。 **步骤1:TB级CRC附加** B=192≤3824→B=192 \\leq 3824 \\rightarrowB=192≤3824→ 附加16位CRC,B′=192+16=208B' = 192+16 = 208B′=192+16=208。 **步骤2:基图选择** B=192≤292→B=192 \\leq 292 \\rightarrowB=192≤292→ 选 **BG2**。 **步骤3:码块分割** BG2的Kcb=3840K_{cb}=3840Kcb=3840,B′=208≤3840→C=1B'=208 \\leq3840 \\rightarrow C=1B′=208≤3840→C=1,无额外码块CRC,B′′=208B''=208B′′=208,K′=208K'=208K′=208。 **步骤4:确定Kb和Zc** BG2下B=192≤192→Kb=6B=192 \\leq192 \\rightarrow K_b=6B=192≤192→Kb=6。 选最小ZcZ_cZc使6×Zc≥2086 \\times Z_c \\geq 2086×Zc≥208:Zc=32Z_c=32Zc=32不行(192\<208192\<208192\<208),Zc=36Z_c=36Zc=36可以(216≥208216 \\geq 208216≥208)。Zc=36Z_c=36Zc=36属于iLS=4i_{LS}=4iLS=4的集合。 K=6×36=216K = 6 \\times 36 = 216K=6×36=216,填充NULL数 F=216−208=8F = 216-208 = 8F=216−208=8。 **步骤5:编码后长度** BG2: N=50×36=1800N = 50 \\times 36 = 1800N=50×36=1800 比特。 **步骤6:构造校验矩阵H** BG2大小42×5242 \\times 5242×52,非零元素位置由协议表5.3.2-3给出。对每个非零位置(i,j)(i,j)(i,j),查表得Vij(iLS=4)V_{ij} (i_{LS}=4)Vij(iLS=4),计算Pij=Vijmod  36P_{ij} = V_{ij} \\mod 36Pij=Vijmod36。H由42×36=151242 \\times 36=151242×36=1512行,52×36=187252 \\times 36=187252×36=1872列组成,每个"1"换成36×3636 \\times 3636×36右移PijP_{ij}Pij次的循环置换矩阵。 #### 步骤7:准备编码输入序列 c 原始 208 比特(192 比特 TB + 16 比特 CRC)记为 `b_0 ... b_207`。构造长度为 `K = 216` 的编码器输入序列 `c_0 ... c_215`: * `c_0 ... c_71 = b_0 ... b_71`(对应基矩阵的前两列,即打孔列。这些比特参与校验方程计算,但**不映射到输出 d**,也不会被发送。) * `c_72 ... c_207 = b_72 ... b_207`(共 136 比特,是原始传输块+CRC 的剩余部分。这些比特将映射到输出 `d` 的前部,并正常发送。) * `c_208 ... c_215 = NULL`(共 8 个填充比特,因为 `K' = 208`,`K = 216`,需填充 8 个 NULL。) **说明** :`c_72 ... c_207` 的取值就是原始信息比特的真实值(0 或 1),**不是强制清零**。 **步骤8:生成校验比特w** M=N+2Zc−K=1800+72−216=1656M = N + 2Z_c - K = 1800 + 72 - 216 = 1656M=N+2Zc−K=1800+72−216=1656。求解 H⋅\[c;w\]T=0H \\cdot \[c; w\]\^T = 0H⋅\[c;w\]T=0(在GF(2)中)。 #### 步骤9:输出编码序列 d 编码后输出 `d` 的长度为 `N = 1800`,按以下规则填充: * `d_0 ... d_135 = c_72 ... c_207`(共 136 个有效信息比特,取值与原始 `b_72 ... b_207` 相同) * `d_136 ... d_143 = NULL`(对应填充的 NULL 比特,共 8 个) * `d_144 ... d_1799 = w_0 ... w_1655`(校验比特,共 1656 个) **速率匹配** :在后续处理中,所有标记为 `NULL` 的位置将被剔除,不参与传输。因此实际发送的序列包含: * 136 个有效系统位(`d_0 ... d_135`) * 1656 个校验位(`d_144 ... d_1799`) 打孔列对应的 72 个系统位(`b_0 ... b_71`)始终不发送,仅用于编码计算。 *** ** * ** *** **补充解释1:** * 基矩阵 BG2 大小:42 行 × 52 列 * 扩展因子 Zc=36Z_c = 36Zc=36 * 扩展后的校验矩阵 HHH 的大小 = (42×36)(42 \\times 36)(42×36) 行 × (52×36)(52 \\times 36)(52×36) 列 = **1512 行 × 1872 列** **编码输入:** * 信息比特序列 ccc 的长度 K=Kb×Zc=6×36=216K = K_b \\times Z_c = 6 \\times 36 = 216K=Kb×Zc=6×36=216 * 需要生成的校验比特序列 www 的长度 M=N+2Zc−KM = N + 2Z_c - KM=N+2Zc−K 其中 NNN 是编码输出长度(BG2 为 50Zc=180050Z_c = 180050Zc=1800) 代入得 M=1800+72−216=1656M = 1800 + 72 - 216 = 1656M=1800+72−216=1656 **组合向量:** 将 ccc 和 www 拼接成一个列向量: \[cw\]长度=K+M=216+1656=1872 \\begin{bmatrix} c \\\\ w \\end{bmatrix} \\quad \\text{长度} = K + M = 216 + 1656 = 1872 \[cw\]长度=K+M=216+1656=1872 **矩阵乘法:** HHH 的列数 = 1872,正好等于组合向量的长度。 HHH 的行数 = 1512,代表校验方程的数量。 因此: H⋅\[cw\]=0(在 GF(2) 中) H \\cdot \\begin{bmatrix} c \\\\ w \\end{bmatrix} = 0 \\quad (\\text{在 GF(2) 中}) H⋅\[cw\]=0(在 GF(2) 中) 左边是一个 1512 维的列向量(每个元素是一个线性方程),右边是 1512 维的零向量。**矩阵乘法在维度上完全合法。** **为什么 MMM 不是 1512?** * HHH 的行数 1512 是**校验方程的个数** ,由基矩阵的行数(42)和扩展因子 ZcZ_cZc(36)决定:42×36=151242 \\times 36 = 151242×36=1512。 * M=1656M = 1656M=1656 是**校验比特的个数**,由编码结构决定,两者没有直接相等的关系。 **直观理解:** 校验矩阵 HHH 的每一行对应一个校验方程,这些方程约束了所有变量(ccc 和 www)之间的关系。变量的总个数是 1872(= 216 个信息位 + 1656 个校验位)。因此 HHH 必须有 1872 列才能与变量向量相乘。行数(1512)小于列数(1872),这正是 LDPC 码"低密度"且具有冗余校验能力的体现。 **示例中的数值验证:** * HHH 尺寸:1512×18721512 \\times 18721512×1872 ✅ * ccc 长度:216 * www 长度:1656 * c+wc + wc+w 长度:1872 ✅ * H×(c;w)H \\times (c;w)H×(c;w) 结果维度:1512×11512 \\times 11512×1 ✅ *** ** * ** *** **补充解释2:** **这 216 比特中包含了打孔的数据**。 具体来说: * 编码器输入序列 `c` 的总长度是 `K = Kb × Zc = 6 × 36 = 216` 比特。 * 其中前 `2 × Zc = 72` 个比特(即 `c_0 ~ c_71`)对应基矩阵中被打孔的两列。这些比特的信息(无论是真实数据还是填充的 NULL)**仍然参与编码** (即参与校验方程的计算),但**不会在传输中发送**(打孔)。 * 剩余的 `216 − 72 = 144` 个比特(`c_72 ~ c_215`)中,前 `208 − 72 = 136` 个比特是原始传输块+CRC(但根据协议会被强制清零并标记为 NULL),最后 8 个比特是填充的 NULL。 因此,**216 比特的输入序列 `c` 完整地包含了被打孔的系统位(前72比特)以及其他信息位和填充位**。打孔并不影响编码器的输入长度,只影响哪些比特最终被发送。 *** ** * ** *** **补充解释3:** * **BG1 和 BG2 是唯一固定的基矩阵**,每个基矩阵只包含 0 和 1。 * BG1 大小:46×68,非零元素由表 5.3.2-2 定义。 * BG2 大小:42×52,非零元素由表 5.3.2-3 定义。 * **真正通过循环移位生成的是最终的校验矩阵 H** :将基矩阵中的每个"1"替换为 Zc×Zc 的循环置换矩阵(由 `P_ij = V_ij mod Zc` 决定右移次数),每个"0"替换为 Zc×Zc 全零矩阵。 ![](https://i-blog.csdnimg.cn/img_convert/22363221b1243c00b31343a885abd002.png) 上述表格采用**稀疏列表** 形式:只列出基矩阵中所有"1"的位置及其对应的基准移位值 `V_ij`。 例如表格中的一行 `(i, j, V_ij)` 表示:基矩阵的第 i 行、第 j 列是 1,且该位置的基准移位值为 `V_ij`。 所有未在表格中出现的 `(i, j)` 位置,基矩阵中的值默认为 0。 "2、3 这种移位的情况"指的是:通过 `P_ij = V_ij mod Zc` 计算出的**实际右移次数** 。 因此,即使表格中的 `V_ij` 是 23,通过模 Zc(例如 Zc=7)得到 `P_ij=2`,最终子矩阵就是单位矩阵右移 2 次。 可以看出i 比较大的情况下,并不是所有的 j 都能找到对应 V_ij,也就是并没有对应 V_ij,此时就代表直接用一个 36×36 全零矩阵即可。 **示例总结表**: | 参数 | 值 | |:------:|:---------:| | TBS B | 192 | | CRC | 16 | | B' | 208 | | BG | BG2 | | Kb | 6 | | Zc | 36 | | i_LS | 4 | | K | 216 | | 填充NULL | 8 | | N | 1800 | | H大小 | 1512×1872 | | M | 1656 | 通过上述示例,读者已经掌握了NR LDPC的完整编码操作。接下来进一步探讨NR LDPC的两个重要设计特性------内置打孔设计以及两种基图的详细参数对比,这些内容有助于深入理解NR的编码设计原理。 ### 6 MATLAB内置的LDPC编码流程(使用5G Toolbox) TBS = 192; %% 生成原始码流 fprintf('\n--- 生成原始码流 ---\n'); code = randi([0,1],TBS,1); fprintf('原始码流比特数: %d bits\n', length(code)); %% 增加crc fprintf('\n--- 增加crc ---\n'); codecrc = add_crc_bits(code); fprintf('增加crc后的比特数: %d bits\n', length(codecrc)); B = length(codecrc) %% LDPC编码 fprintf('\n--- 调用matlab库函数进行LDPC编码 ---\n'); bgn = 2; % 使用基图 2 Zc = 36; % 手动指定提升因子 K_fixed = 10 * Zc; % K 必须为 10 * Zc = 360,以适配 Matlab 内部实现 % 准备有效数据 (数据部分) txcbs_original = codecrc; % 假设 codecrc 是长 208 比特的原始数据 % 计算需要填充的 NULL 数量 F_required = K_fixed - length(txcbs_original); % 360 - 208 = 152 个填充比特 % 构造最终输入数据 (长度为 360,末尾填充 152 个 -1 表示 NULL) txcbs_fixed = [txcbs_original; -1 * ones(F_required, 1)]; % 执行 LDPC 编码 codedcbs = nrLDPCEncode(txcbs_fixed, bgn); fprintf('LDPC编码后比特数: %d bits\n', length(codedcbs)); ### 7 手搓MATLAB编码过程(手动构造校验矩阵) 本节展示如何**手搓**实现5G NR LDPC的编码流程,包括:构造基矩阵、根据扩展因子生成循环移位值、扩展为完整校验矩阵H、以及利用H进行编码(求校验比特)。不依赖任何5G专用工具箱函数。部分核心代码如下: BG = 2; % 基图选择 (1=BG1, 2=BG2) Z = 36; % 提升因子 K_b = 6; % BG2信息列数 K = K_b * Z; % 信息比特数 N = 52 * Z; % 码字长度 M = 42 * Z; % 校验比特数 bg = get_bg2_base_matrix(); H = build_H_matrix(bg, Z); ### 结语 本文从QC-LDPC的基本构造原理出发,逐步深入到5G NR协议的具体参数(基矩阵、扩展因子、循环移位值),详细解析了编码前的准备阶段(CRC、基图选择、码块分割、Zc确定),并以TBS=192为例完整演示了每一步的计算过程。最后给出了MATLAB平台上的两种实现方式:一种使用5G Toolbox内置函数快速开发,另一种完全不依赖工具箱、手动构造校验矩阵并实现编码。希望这份笔记能为从事5G物理层算法研究的工程师和学生提供扎实的参考。 📢 **如果本文对你有帮助,欢迎关注 「手搓物理层」** 后台私信 PUSCH3 获取本文完整PDF + 配套MATLAB代码包。 往期多普勒笔记请回复"PUSCH1""PUSCH2"获取。

相关推荐
我爱C编程8 小时前
基于WSN无线传感器网络的定向步幻影路由算法matlab仿真
网络·matlab·无线传感器网络·wsn·定向步幻影路由
rit84324998 小时前
高斯过程回归:原理与MATLAB实现
matlab·数据挖掘·回归
南宫萧幕9 小时前
HEV 智能能量管理实战:从 MPC/PPO 理论解析到 Python-Simulink 联合仿真闭环全流程
开发语言·python·算法·matlab·控制
啦啦啦_999912 小时前
1. 线性回归之 向量&矩阵
算法·矩阵·线性回归
Gofarlic_oms113 小时前
Allegro高级功能模块许可证管理注意事项
运维·服务器·开发语言·matlab·负载均衡
南宫萧幕14 小时前
车辆能量管理进阶:从前沿算法 (VMD-PPO-DBO) 机制解析到 MPC 工程建模
人工智能·算法·matlab·simulink·控制
爱吃巧克力的程序媛15 小时前
计算机图形学---如何理解模型矩阵、视图矩阵、投影矩阵
数码相机·线性代数·矩阵
IT猿手15 小时前
多无人机动态避障路径规划研究:基于壁虎优化算法GJA的多无人机动态避障路径规划研究(可以自定义无人机数量及起始点),MATLAB代码
算法·matlab·无人机
listhi52015 小时前
MATLAB电力系统加权最小二乘法(WLS)状态估计
算法·matlab·最小二乘法