简介:面向5G通信与信道编码学习的仿真资源包,聚焦极化码这一5G控制信道核心编码技术,适合通信专业学生、研究者及物理层算法工程师用于课程设计、论文复现与系统验证。压缩包完整覆盖从CRC附加、码块分段、速率匹配到极化编码、SC与SCL译码及解交织的5G收发链路,并提供AWGN等信道下的误码率仿真入口,支持配置不同码长与信息位长度,便于对照理论分析实际性能。包内共44个文件,以39个MATLAB脚本为主体,另含两个mat可靠性序列数据、两个txt序列与交织配置、一个Markdown说明文档,整体仅31KB,轻量易部署,目录模块划分清晰。代码结构兼具基础函数与完整流程,既有极化变换、LLR更新的底层实现,也有面向UCI与PUCCH场景的端到端处理链路,配套文档可指导复现与参数调整。目前已吸引200人学习下载,对极化码入门和5G物理层编码研究均具参考价值。
1. 5G Polar Code 是什么:一个源码包背后,是控制信道的生存底线
做 5G 物理层仿真的工程师,几乎都绕不开 polar code。这个在 5G NR 标准里专管下行控制信息(DCI)和上行控制信息(UCI)的信道编码方案,决定了控制信道在低信噪比、短块长条件下能不能稳定传信。拿到一个 5g-polar-code-master 这样的源码包,你要做的不是把它当黑匣子跑一遍,而是搞清楚它内部的编码、速率匹配、译码节点到底怎么组织,以及仿真结果和标准要求差在哪里。这个包适合三类人:刚接触 5G 物理层的同学,拿它做基线对比的算法工程师,以及需要快速验证信道编码收益的仿真开发。它帮你解决的问题很具体——在 AWGN 信道下,给定码率和信噪比,误块率到底能压到多少,以及译码器的实现复杂度是否值得上板。
2. 极化码为什么被 5G 选中:从信道极化到可靠度排序
2.1 信道极化:把独立信道变成"好"与"坏"的两极
极化码的理论基础是信道极化现象。原始思路并不复杂:把 N 个独立的二进制输入信道通过递归的极化变换组合起来,随着 N 增大,这些组合信道的容量会趋向两个极端——一部分信道容量趋近 1(完全可靠),另一部分趋近 0(完全不可靠)。信息比特放在可靠位置上,冻结比特放在不可靠位置上并置为收发双方已知的值,接收端通过连续消除译码逐比特判决。
实际仿真中,你不需要自己实现极化变换矩阵的递归过程,但必须理解可靠度排序在收发两端必须完全一致。这个排序直接决定了哪些索引放信息比特,哪些索引冻结。不同版本的 5G 标准给出了不同的可靠度序列,代码包里通常内置了一张 Q 序列(最大母码长度 512 或 1024),用的时候要留意它对应的是哪个版本。
2.2 5G NR 中的极化码参数:CRC 辅助、可靠度序列、速率匹配
5G NR 的极化码和最初的 Arikan 极化码有两点关键差异。第一是增加了 CRC 辅助,外接 CRC 比特参与信息比特集合的选择,译码时利用 CRC 做奇偶校验来辅助路径选择,从而提升短块译码性能。第二是引入了速率匹配,因为无线信道的实际传输比特数不可能总是母码长度本身,需要打孔或缩短来适配物理资源。
代码包里常见的参数包括:母码长度 N(2 的幂次,一般从 32 到 1024)、信息比特长度 K(含 CRC)、CRC 长度(典型值是 11 或 16)、可靠度序列、打孔位置表。编译码器在收发两端共享同一份序列,一旦序列初始化顺序不对,仿真结果会出现莫名其妙的错误平层。
2.3 代码包在 5G 链路中的位置:编码器、速率匹配、调制映射
在完整的 5G 物理层链路里,Polar Code 模块位于传输块处理之后、加扰和调制之前。发送端路径是:CRC 附加 → 极性编码 → 速率匹配 → 加扰 → 调制映射 → 资源映射。接收端则反过来,先解调计算 LLR,再解速率匹配,最后进入译码器。
理解这个位置关系能帮你快速定位仿真结果异常的原因。比如误块率在高信噪比下不下降,问题可能不在译码器,而是速率匹配后的比特顺序和解调软信息没有对齐;又比如误比特率很低但误块率很高,说明译码后的 CRC 校验逻辑或路径度量有问题。这个源码包通常把编码器、译码器、速率匹配封装为独立函数,调试时可以从这三段的输入输出逐一验证中间结果。
3. 跑通 master 包:解压、编译与最小仿真链路
3.1 环境与目录结构:先看 README 和 main 入口
拿到 5g-polar-code-master.zip 后,第一步是解压并确认代码包的运行环境。常见做法是这个包以 MATLAB 或 C++ 工程组织,少数会提供 Python 版本。不要急着编译,先看根目录下的 README 和文件列表,确认是否有预编译产物、模型数据文件,以及 main 函数或仿真脚本的入口位置。绝大多数此类包的目录结构是这样的:src 下放编码器和译码器实现,test 或 examples 下放跑通脚本,data 或 config 下放可靠度表和速率匹配表。
unzip 5g-polar-code-master.zip -d 5g-polar-code cd 5g-polar-code ls -la # 重点看 README.md、文件清单、配置表所在目录检查文件时要注意两点:一是确认源码包内是否包含真实的 5G 标准序列文件(通常以 .mat、.txt 或头文件形式存在),二是是否有编译脚本(Makefile、CMakeLists 或 MATLAB 的 startup 脚本)。如果缺少序列文件,后续仿真基本跑不出符合 5G 标准的结果,因为可靠度序列手工生成不现实。
3.2 最小运行命令:一次完整的编解码仿真
以常见的 MATLAB 工程为例,跑通一次完整仿真只需要调用主脚本并传入信噪比等参数。一个典型的最小命令是:
% 设置仿真参数 N = 512; % 母码长度 K = 200; % 信息比特长度(含 CRC) snr_dB = 2.0; % 信道信噪比 num_frames = 1000; % 仿真帧数 % 运行完整链路仿真 [ber, bler] = run_polar_sim(N, K, snr_dB, num_frames); fprintf('SNR=%.1fdB, BER=%.3e, BLER=%.3e\n', snr_dB, ber, bler);这段脚本的逻辑是:每帧生成随机信息比特,经过 CRC 附加、极化编码、速率匹配、QPSK 调制、AWGN 信道加噪、LLR 解调、解速率匹配,最后送入连续消除列表译码器。译码输出通过 CRC 校验后统计错误帧数,误块率就是错误帧数除以总帧数。上面代码里的 N 和 K 是核心参数,N 必须是 2 的幂,K 包含 CRC 长度,两者组合决定了实际码率 R = K / N 经过速率匹配后的真实传输码率。
3.3 输出指标怎么看:误块率、误比特率、吞吐
仿真结束后会输出 BER 和 BLER 两个指标。BER 是所有译码错误的比特数除以传输的比特总数,BLER 是译码失败(CRC 校验不过或路径度量异常)的传输块数占比。5G 控制信道衡量性能的标准一般是 BLER 1% 或 0.1% 对应的信噪比门限,因为控制信息一旦错误就是整包丢失,不能容忍比特级的小概率错误。
如果想验证实现正确性,一个有效手段是把仿真结果和 AWGN 下极化码的参考曲线对比。通常连续消除列表译码(列表宽度 L=8 或 L=16)相比连续消除译码在 BLER 1% 处能带来 0.5 到 1.5 dB 的增益,如果这个差距没出现,大概率是译码器路径度量计算有误。此时可以先用 L=1(退化为连续消除译码)验证编码和速率匹配的正确性,再逐步增大列表宽度观察性能变化。
提示:num_frames 不要一开始设太高,先用 100 帧确认整个链路能跑通并输出稳定结果,再加大到 1000 或 5000 帧获取平滑曲线。长时间仿真中途崩溃时,先检查内存和随机数种子,再怀疑算法问题。
4. 关键参数怎么设:码率、母码长度、调制阶数的联动
4.1 母码长度 N 与信息长度 K 的约束
极化码的性质决定了 N 必须大于等于 K,且 N 是 2 的幂次。工程上还有个隐形约束:N 选得越大,极化效应越充分,性能越好,但译码延迟和复杂度同步上升。5G NR 实际使用的最大母码长度是 1024,超过这个长度就要分段处理。代码包仿真时,N=256 和 N=1024 在同样码率下,BLER 1% 门限可能差别 0.3 到 0.8 dB,这个差距来自信道极化的充分程度。
选择 K 时要留意 CRC 是否包含在内。比如你希望信息比特实际为 180 比特,CRC 长度为 16,那么 K 应设为 196。有些代码包会把 K 理解为纯信息长度,内部再单独加 CRC,使用前必须读清主脚本的注释或参数命名,否则信息比特数差 16 个会导致码率计算偏差,仿真的性能曲线整体偏移。
4.2 码率 R 对误块率门限的影响
码率 R(速率匹配后实际传输码率)对 BLER 曲线的影响是单调的:码率越高,同信噪比下 BLER 越高,达到 BLER 1% 所需的信噪比也越高。但这个变化不是线性的,低码率区间(R 从 1/6 提到 1/3)信噪比损失较小,高码率区间(R 从 0.6 提到 0.8)损失急剧加大。这是因为高码率下打孔比特比例增大,极化码的可靠度结构被破坏更明显。
仿真时建议固定一个调制阶数(比如 QPSK),扫描 R = 1/3、1/2、2/3 三档,画出 BLER-SNR 曲线并记录 1% 门限。这样得到的门限差值可以直接用于评估系统链路预算。代码包里通常会提供每档码率对应的打孔位置表或缩短位置表,不要随意更换,否则等价于换了一套非标准的速率匹配,曲线间的对比就没有意义了。
4.3 从 QPSK 到 16QAM:信噪比区间怎么选
调制阶数改变了每个符号携带的比特数,同样码率下所需信噪比随之变化。QPSK 下 BLER 1% 门限在 -2 到 3 dB 区间(码率 1/3 到 2/3),16QAM 下通常整体右移 4 到 6 dB。代码包的仿真脚本一般允许配置调制阶数,但要确认解调后 LLR 的计算方式:QPSK 可以直接用简化 LLR,16QAM 必须实现标准 LLR 计算(基于等效噪声方差),否则高信噪比下曲线会出现平台。
具体操作时,先跑 QPSK 低码率验证链路正确性,再逐步切换到 16QAM 和高码率。每个配置点至少仿真 500 帧以上,确保 BLER 估计置信度足够。若同一信噪比下两次运行结果差异较大,检查随机数种子固定方式,建议在脚本里固定种子以保证可复现。
5. 极化码仿真的常见问题与避坑指南
5.1 可靠度序列版本混用导致性能断崖
现象:仿真 BLER 曲线在中低信噪比区间正常,但在高信噪比区间出现错误平层,且列表译码宽度加大后平层不消失。
原因:可靠度序列来自不同版本的 5G 标准草案或实现文档,收发两端使用的序列顺序不一致,或者序列长度和 N 不匹配。部分源码包把"初始可靠度排序"和"速率匹配后重排"混在一起,调用时没有注意顺序。
解决:核对代码包内序列文件与标准定义的对应关系,确认序列长度等于 N 的最大值。在编译码器入口处打印前 16 个信息位索引,和标准给出的前 16 个可靠位索引比对,逐位一致再继续跑仿真。
5.2 速率匹配后的码率算错
现象:Setup 时设定码率 1/2,但仿真得到的性能曲线和已知参考曲线差 0.8 dB 以上,且差异随信噪比增大而稳定存在。
原因:速率匹配后的实际传输比特数 E 不等于 N 乘以码率,部分实现把母码码率 K/N 当作传输码率 K/E,导致打孔比特数错误,译码端接受到的比特数对不上。
解决:打印 E = min(K * 码率分母, N) 的实际值,确认打孔数量 = N - E。验证方法是构造一个全零信息序列,编码后手工打孔并重新补零,再译码,输出应该全零,任何输出错误都说明速率匹配的索引映射有误。
5.3 CRC 长度不匹配导致误块率虚高
现象:BER 正常甚至很低,但 BLER 偏高,且增大列表宽度没有改善。
原因:编码端在 K 个比特(含 CRC)上做编码,译码端用固定长度做 CRC 校验,但两者对 CRC 比特位置的理解不同——比如译码端把 CRC 当作冻结比特跳过,或 CRC 多项式用错。
解决:确认代码包的 CRC 生成多项式(5G 用的是 CRC11 或 CRC16),并检查信息位集合是否把 CRC 比特索引包含进去。在编码端打印"输入 K 比特的最后 16 位",和译码端做 CRC 校验时使用的输入对齐即可定位。
5.4 LLR 初始化为零导致译码不收敛
现象:低信噪比区域 BLER 几乎等于 1,高信噪比处恢复正常,曲线呈现楼梯状。
原因:接收端解速率匹配后补零位置的 LLR 初始化为 0,但译码器内部把 LLR=0 当作等概率比特处理,对冻结位也参与路径比较,导致路径度量混乱。另一种情况是打孔比特在发射端没有消除,接收端无法区分打孔位和真实传输位。
解决:打孔比特对应的 LLR 初始化为 0 是标准做法,但必须同时把对应的译码位置设置为冻结位并赋无穷大可靠度。仔细检查打孔表的生成逻辑,确认打孔位不会出现在信息位索引内,必要时在打孔表生成后打印校验一次。
5.5 高码率下仿真曲线出现平台
现象:码率大于 0.7 时,无论怎么增大信噪比,BLER 都停在 10^-2 到 10^-3 水平不再下降。
原因:母码长度有限加上打孔过多导致极化不完全,以及连续消除列表译码在高码率下路径搜索空间不足,错误事件主要来自不可靠的信息位集合。这不是代码 bug,而是极化码本身的性能边界。
解决:一是换用更长的母码(N 从 512 提到 1024);二是增大译码列表宽度(L 从 8 提到 32);三是加 CRC 辅助提升路径剪枝效率。这三步做完仍不能消除平台,就需要考虑换用 LDPC 码或做级联码设计。
提示:遇到不知名错误先不要钻研算法。在编码器输入端打印几个关键中间量(编码前比特、打孔后比特、调制符号),再在接收端对应位置打印解调后的软值,绝大多数问题都能通过比对这两组数据定位。
6. 把代码包用出深度:CA-Polar 级联、迭代增益与参考曲线比对
拿到一个能正常出曲线的极化码仿真包,合理的下一步不是加参数继续跑,而是把它当作算法验证平台,验证三个方向:CA-Polar 级联增益、迭代译码的收益边界、以及和标准参考曲线的误差。先说 CA-Polar,这是 5G 实际采用的形式,外接 CRC 参与候选路径筛选。你在代码包里改动的点在于:译码器每保留一条候选路径都要做一次 CRC 校验,校验通过才保留,最终在所有通过校验的路径中选路径度量最优的。实现上只需在列表译码器的路径更新处加一个 CRC 判断函数,关键参数是 CRC 长度(11 还是 16)和生成多项式。对比试验以 L=8、CRC 长度 16 和 L=8、无 CRC 做同一组信噪比点,你会在 BLER 1% 处看到约 0.3 到 0.6 dB 的增益,这是短块长度下很可观的收益。
迭代增益的验证思路更直接:把译码器输出的软信息反馈给解调器,再做一次解调和译码,形成 Turbo 式的迭代环。实际工程中极化码的迭代增益有限(通常不到 0.2 dB),但通过这个结构你能确认代码包的软输出接口是否独立、是否能支持外部信息交换。实现时注意软信息交换前要做符号和幅度归一化,否则第二次迭代直接发散。我自己做过一组对比:迭代次数从 1 增到 4,QPSK、码率 1/2、N=512 的条件下 BLER 1% 门限仅下降约 0.15 dB,而仿真耗时增加近 8 倍,因此工程上极化码一般不迭代,这个结论也是 5G 标准落地时没有做迭代译码的原因之一。
最后说参考曲线比对。这是验证代码包实现是否和标准对齐的最强手段。在 AWGN 信道下,极化码 BLER 1% 门限存在一个公认的边界——香农限和有限块长界的间距。你可以用有限块长界的下界公式(正态近似)算出给定 K 和 E 的理论值,比如 K=200、E=400,BLER=0.01 时理论上限约 -0.4 dB(BPSK/QPSK 下),你的仿真结果如果差出 1 dB 以上,说明实现有问题。注意这是近似界,不是精确值,但足够用来判定掩码错误、序列错误这类大偏差问题。比对时固定随机数种子,每个信噪比点至少跑 2000 帧,确保误差波动低于 0.1 dB。完整的参考曲线你可以在源码包的 doc 目录里找,或者用极化码标准作者论文中的图 8 到图 10 做人工比对,前提是实现细节一致。
这个方向值不值得做,我的答案很明确:值得。极化码会长期存在于 5G 和后续蜂窝标准中,而且它在短块、高可靠场景的独特优势,短期内看不到被替代的可能。把一个代码包吃透,本质上建立起了从编码构造、速率匹配到译码器软信息的完整仿真思维框架,这套框架在做链路预算、调制编码方案选型、以及制式对比时几乎天天用到。我自己的习惯是每次拿到一个新包,先做一次全零序列的闭环测试,再做一次和参考曲线的门限比对,最后才进入参数扫描阶段——前两步能过滤掉八成以上的实现坑。希望帮到你。
本文还有配套的精品资源,点击获取