基于Polar编解码的PSS-SSS联合检测仿真链路设计与实现
简介基于polar编解码的PSS-SSS联合检测仿真项目面向通信方向本硕博学生及科研人员定位matlab平台下的Polar编译码与PSS-SSS联合检测算法学习。仿真输出检测成功率以及BER、BLER三类指标覆盖信号生成、信道建模、接收检测到性能统计的完整流程。资源共70个文件以56个m脚本为主含mat数据、bin信道、txt说明、h头文件及mexw64加速模块并附avi操作录屏包体仅2.91MB。目前已有288人学习使用。代码按发端、收端、信道等模块组织Polar编译码、PSS/SSS检测、MMSE估计均有独立实现配合运行视频与注意事项便于快速搭建仿真环境、梳理流程适合课程设计或科研预研。1. 基于 polar 编解码的联合检测先弄清这条仿真链路到底解决什么问题5G NR 的物理层仿真里最常见的一个误区是把同步信号检测和信道编解码当成两条独立的链路先做小区搜索看起来 PSS-SSS 都找到了再进行 PBCH/PDCCH 的 polar 译码最后才去统计 BER 和 BLER。但实际工程里你会发现同步阶段的频偏估计残留、定时偏差以及信道估计误差会直接传导给后级 polar 译码器导致软值质量崩掉。如果不做联合检测PSS-SSS 判定成功但后面的 polar 码字全错这种「同步成功但数据全废」的现象在低信噪比下很常见。这个仿真项目的核心思路就是把 PSS-SSS 的联合检测结果与 polar 编解码的译码质量放进同一条链路里在一个 Monte Carlo 框架下同时输出检测成功率、BER 和 BLER 三条曲线用来回答「同步做到什么程度极化码译码才能可靠工作」这个问题。适合正在做 5G NR 物理层算法验证、基站或终端接收机链路仿真、以及需要给毕业设计或项目评审提供完整性能曲线的工程师和学生。2. PSS-SSS 联合检测与 polar 编解码仿真原理与链路模型2.1 PSS 与 SSS 为什么要做联合检测先说一个常见的认知偏差。很多人以为 PSS 和 SSS 检测是两件独立的事PSS 负责定时和频偏粗估计SSS 负责小区 ID 识别各干各的互不干扰。但真实链路里PSS 检测完成后会给 SSS 提供一个频偏估计值和 FFT 起点如果 PSS 侧的定时位置偏了几个采样点SSS 的解调性能就会明显劣化。更麻烦的是在低 SNR 场景下PSS 的峰值本身就淹没在噪声里用它估计出来的频偏误差可能在几百赫兹到上千赫兹之间波动这个误差直接带进 SSS 的相干解调相关峰值会被抹平。所以联合检测的意义不是「同步做完再译码」而是把 PSS 的相关峰信息和 SSS 的相关峰信息放在同一个判决准则里。具体做法是在若干个候选的定时偏移和频偏假设下同时计算 PSS 和 SSS 的联合相关值用联合度量代替单独检测的度量。工程上常用的是分级联合策略——第一级用 PSS 做粗定时和粗频偏压缩候选区间第二级在候选区间里把 PSS 和 SSS 的度量加权求和再做一个精判决。这种做法的直接收益是检测成功率曲线的 SNR 门限可以往低推 12 dB。代价是计算量上升每一帧要做多次相关运算。仿真里怎么平衡这个代价后面参数讨论部分会展开。2.2 polar 编解码在链路中的位置与选型理由polar 码在 5G NR 里的角色很明确主要覆盖广播信道 PBCH、控制信道 PDCCH 以及短格式的上行控制信道 PUCCH。速率匹配基于 5G 标准的 rate matching 方案母码长度 N256编码比特数根据物理资源大小动态截取或重复。在做联合检测仿真时polar 码不作为一个孤立的编解码模块挂在后面而是作为接收机链路末端的一个「质量探测器」——同步误差、信道估计误差、噪声这些非理想因素最终都会反映在 polar 译码器的输入软值上从而反映到 BER 和 BLER。选型上仿真环境通常用 matlab 的 5G Toolbox 里的 nrPolarEncode 和 nrPolarDecode或者自己写一个标准的 SC 译码器。前者代码简洁、协议合规但因为是黑匣子出错时不容易定位后者适合做算法研究和教学能自己控制译码深度、列表大小和早停准则。如果目标是复现论文里的结果或验证自己的算法改进点建议自己维护一个 polar 编解码函数信道编码模块的输入输出要能随时插入扰动和量化。链路里 polar 编码的载荷来自 PBCH 的 32 bit加上 CRC 后是 40 bit 左右速率匹配到 864 bit码率很低约 1/20可靠性高。这个码率设定不是随便选的它意味着在正常 SNR 区间内polar 译码的误码主要是由同步残余误差导致软值劣化而不是由编码本身的纠错能力不够导致。这就让 BER 和 BLER 曲线能敏感地反映同步质量的变化联合检测的效果才可以被量化。2.3 完整仿真链路设计从发射端到误码率统计一条可复现的联合检测仿真链路至少要包含以下几个环节发射端比特生成、polar 编码、速率匹配、加扰加 CRC、OFDM 调制、插入 PSS-SSS 序列、经过信道AWGN 或多径衰落、接收端做 OFDM 解调、PSS-SSS 联合检测、信道估计与均衡、polar 译码、误码统计。链路设计中有一个容易被忽略的环节PSS-SSS 和 polar 承载的数据符号要放在同一个帧结构里。如果只是分别仿真同步和编码然后单独出两条曲线那就不叫联合检测。正确的做法是让 polar 编码后的符号和 PSS-SSS 在同一个时频资源格上传输同步误差真实地作用于数据符号这样才能把同步质量映射到 BER/BLER 上。仿真里通常会把 PBCH 符号放在 SSB同步信号块里用 PSS 占第一个符号的中心 127 个子载波SSS 占第三个符号PBCH 占第二个和第四个符号。这样一个 SSB 里就同时包含了同步信号和 polar 编码的数据天然具备联合检测的场景条件。H3: 帧结构与资源映射怎么搭我一般推荐先按 5G NR 的 SSB 结构搭一个简化版资源格不追求完整协议实现而是抓住三个关键点位PSS 的频率位置、SSS 的频率位置、PBCH 与它们之间的时间间隔。仿真中不涉及完整的 SSB 突发集所以只需要一帧里面放一个 SSB 就够了。简化后的资源格映射逻辑是频域 240 个子载波对应 20 MHz 带宽里面取一段时域 4 个 OFDM 符号。PSS 放在第一个符号的 127 个连续子载波上SSS 放在第三个符号的 127 个连续子载波上PBCH 占第二和第四个符号。实际用 matlab 的 nrSSBurst 相关函数可以快速生成这套结构但为了看清楚每个环节初学者建议一步步自己搭。映射完成后整个帧经过 OFDM 调制送入信道接收端反解出来在 PSS-SSS 位置做联合相关搜索再取出 PBCH 位置的数据符号做 polar 译码。3. 仿真输出 PSS-SSS 联合检测成功率与 BER/BLER核心代码拆解3.1 发射端生成 PSS-SSS 与 polar 编码数据下面这段代码生成 PSS、SSS 序列并将 PBCH 载荷做 polar 编码后映射到 SSB 资源格上。代码用 matlab 风格编写关键步骤都有注释可以直接参照改写。% 参数定义 NID2 0; % PSS 序列索引取值 0/1/2 NID1 100; % SSS 序列索引取值 0~335 ncellID 3*NID1 NID2; % 物理小区 ID SNR_dB -4; % 仿真信噪比 numFrames 100; % Monte Carlo 帧数 % 生成 PSS 序列 (ZC 序列频域长度127) pssSeq nrPSS(NID2); % 生成 SSS 序列 (m 序列频域长度127) sssSeq nrSSS(NID1); % 生成 PBCH 载荷 (32 bit 随机比特) pbchBits randi([0 1], 32, 1); % Polar 编码附带 CRC (24 bit)总信息比特 56输出 512 bit 编码比特 polarInBits [pbchBits; crc_generator(pbchBits, 24C)]; % 40 bit E 864; % 速率匹配后的编码比特长度 polarEncBits nrPolarEncode(polarInBits, 512); % 母码 N512 polarRMBits nrRateMatchPolar(polarEncBits, E); % 速率匹配到 864 % 将编码比特经 QPSK 调制后映射到 SSB 资源格 ssbGrid zeros(240, 4); % 240 子载波 x 4 符号 ssbGrid(57:183, 1) pssSeq; % PSS 占第一个符号中心 127 子载波 ssbGrid(57:183, 3) sssSeq; % SSS 占第三个符号中心 127 子载波 qpskSym nrPolarModulate(polarRMBits, QPSK); % 432 个 QPSK 符号 ssbGrid(:, 2) qpskSym(1:240); % PBCH 数据符号 ssbGrid(:, 4) qpskSym(241:480);这段代码里有两个参数值得注意。E864是速率匹配后的目标长度5G NR 标准里 PBCH 实际速率匹配到 864 bit这个参数直接决定码率。N512是 polar 母码长度标准里 PBCH 的母码是 512不是 256因为 32 bit 信息经过 CRC 后是 40 bit补零到最小 2 的幂次就是 512。如果你用的是自定义 polar 实现母码长度的选择要遵循「信息比特长度 CRC 长度」向上取整到 2 的幂次这个原则。3.2 接收端滑动相关联合检测与 polar 译码联合检测的核心在接收端。这里的代码实现了分级联合检测先用 PSS 做粗捕获得到候选定时点集合再在候选点上同时计算 PSS 和 SSS 的加权相关度量选择联合度量最大的点作为同步位置。% 接收端资源格 rxGrid: 240 x 4, 已经去掉了噪声和信道影响 % 粗捕获PSS 频域相关 pssCorr zeros(240-1271, 1); for k 1:size(pssCorr,1) seg rxGrid(k:k126, 1); pssCorr(k) abs(sum(seg .* conj(pssSeq))); end [~, pssPeakIdx] max(pssCorr); % 候选区间PSS 峰值附近 /-5 个子载波 candIdx max(pssPeakIdx-5, 1):min(pssPeakIdx5, 240-1271); % 联合度量计算PSS 与 SSS 加权相关 jointMetric zeros(length(candIdx), 1); alpha 0.6; % PSS 度量权重 for i 1:length(candIdx) idx candIdx(i); pssMetric abs(sum(rxGrid(idx:idx126, 1) .* conj(pssSeq))); sssMetric abs(sum(rxGrid(idx:idx126, 3) .* conj(sssSeq))); jointMetric(i) alpha * pssMetric (1-alpha) * sssMetric; end [~, bestLocalIdx] max(jointMetric); bestIdx candIdx(bestLocalIdx); % 最终同步位置 % 取出 PBCH 符号并做信道估计补偿 pbchSym rxGrid(:, 2) 1j*rxGrid(:, 4); % 这里简化为直接均衡实际链路中需要用 DMRS 做信道估计 eqSym pbchSym ./ channelGain; % Polar 译码 polarRMBitsRx nrPolarDemodulate(eqSym, QPSK); polarEncBitsRx nrRateUnmatchPolar(polarRMBitsRx, 512); [decodedBits, ~] nrPolarDecode(polarEncBitsRx, 40, 1); % 列表大小 L1代码里alpha0.6是联合度量的加权系数这个值不是拍脑袋定的。PSS 的相关峰通常比 SSS 更尖锐所以给它更高的权重。但如果你在多径信道下仿真SSS 的鲁棒性更好alpha 可以往 0.4~0.5 调。另外注意nrPolarDecode最后一个参数是列表大小SC 译码 L1SCL 译码可以用 L8误码性能会好一点但仿真的计算时间会翻好几倍。3.3 统计脚本同步成功率、BER、BLER 的统一定义与输出统计脚本要放在 Monte Carlo 循环外部每一帧只记录判决值最后统一计算。成功条件定义为「同步位置与真实位置的偏差在 3 个子载波以内且 PSS/SSS 序列索引全部判对」。BER 只统计 PBCH 译码后的信息比特错误BLER 按传输块来算——PBCH 的 32 bit 作为一整个传输块只要 CRC 校验失败这一帧就算一个误块。% 统计变量初始化 syncSuccess 0; berNumerator 0; blerNumerator 0; totalInfoBits 0; totalBlocks 0; for frameIdx 1:numFrames % 生成发射数据、加噪声与信道、接收检测、译码... % 输出: isSyncCorrect (0/1), decodedBits, pbchBitsRef, crcPass syncSuccess syncSuccess isSyncCorrect; % BER: 只统计同步成功的帧 if isSyncCorrect errBits sum(decodedBits(1:32) ~ pbchBitsRef); berNumerator berNumerator errBits; totalInfoBits totalInfoBits 32; end % BLER: 只要 CRC 校验失败就算误块 if ~crcPass blerNumerator blerNumerator 1; end totalBlocks totalBlocks 1; end syncRate syncSuccess / numFrames; ber berNumerator / totalInfoBits; bler blerNumerator / totalBlocks;注意这里 BER 和 BLER 的口径差异。BER 的分子只统计同步成功帧的错误比特分母也只是这些帧的信息比特总数。理由是同步失败时整个数据已经全乱了统计进去会把 BER 拉到接近 0.5淹没了 polar 译码本身的性能信息。BLER 则用全量帧做分母因为误块本身就是链路故障的综合体现。这两个指标口径不同但要同时在报告里给出才能看到同步质量与解码质量的完整映射关系。4. 关键参数设置与仿真结果解读三条曲线的门限怎么看4.1 仿真参数表与选型依据联合检测仿真的参数选型直接影响结果可信度。下表列出一组我常用的基准参数以及调整方向。参数基准值调整方向与影响SNR 范围-10 ~ 5 dB关注同步成功率拐点在哪个 SNR 出现gap 超过 2 dB 说明链路有问题频偏0 ~ 1000 Hz500 Hz 以上必须做频偏补偿否则 SSS 相关峰损坏严重信道模型AWGN 起步后换 TDL-C先跑 AWGN 验证链路正确再换衰落信道看联合检测增益Polar 列表大小 L1 (SC)换 L8 的 SCL 会显著改善 BLER但仿真时间翻倍速率匹配长度 E864这是标准值一般不动母码长度 N512换 256 会降低复杂度但纠错性能变差不太推荐Monte Carlo 帧数100至少要 300 以上否则 BLER 低于 0.01 时统计抖动很大alpha 加权系数0.6多径信道下往 0.4 调看同步成功率的 SNR 门限曲线4.2 检测成功率曲线的拐点辨析同步检测成功率的理想曲线是一个陡峭的 S 形低 SNR 时接近 0高 SNR 时接近 1中间只有一个很窄的过渡带。如果你的仿真结果里 S 形曲线坡度很缓从 -6 dB 一直拖到 0 dB 才爬满说明链路里有底噪限制项——通常是频偏补偿不够或者相关窗长度太短。细分来看如果单独统计 PSS 成功率和 SSS 成功率会发现 PSS 在更低 SNR 下就能成功SSS 是瓶颈此时联合检测的价值就在于把 SSS 的成功门限往低 SNR 推。你可以打印一张中间表统计每一档 SNR 下 PSS 单独成功率、SSS 单独成功率与联合成功率三者各自的数值能清楚看到联合检测的增益来自哪个部分——这是写报告时最有说服力的证据。4.3 BER 与 BLER 在联合检测链路里的读数方法BER 和 BLER 曲线的读数逻辑不同。BER 曲线关注的是编码增益的起点——polar 译码器在什么 SNR 下开始能正确纠错BER 从 0.1 量级跌到 1e-3 量级。BLER 曲线关注的是可靠性门限——什么 SNR 下 PBCH 作为一个整体能被可靠接收一般取 BLER0.01 的 SNR 点作为工作门限。联合检测链路里这两条曲线的读数要结合同步成功率一起看如果同步成功率已经到 99% 但 BLER 还在 0.1 以上说明问题出在均衡或 polar 译码环节不是同步的问题。反过来如果同步成功率只有 70% 但同步成功帧的 BER 很低说明链路是「要么全对要么全错」的两极分化状态这时优先改进的是同步算法而非译码器。实操中把三个指标画在同一张图或同一个报告里用不同的纵轴标注读图效率最高。5. 避坑指南联合检测仿真里最常见的五个翻车点5.1 现象同步成功率在高 SNR 也达不到 100%原因PSS-SSS 联合检测度量里包含了一个不随 SNR 变化的系统偏差通常来自两个地方——一是 PSS 和 SSS 的频域相关窗长度不一致二是加权系数 alpha 没有归一化。举例说PSS 相关累积了 127 个复数乘法SSS 也是 127 个但如果 SSS 序列本身的峰均比更低相同噪声下它的相关峰值就偏小alpha0.5 时 SSS 的贡献被系统性压低了。解决对两个度量先做峰值归一化除以各自的理想自相关峰值再做加权合成。这样 alpha 的含义就纯粹是「可靠度权重」而不是「幅度权重」。5.2 现象BLER 曲线出现平台SNR 提高到一定程度就不再下降原因极化码译码器的输入软值受到了量化误差或信道估计误差的底座限制。检查的方法是单独跑一条不含同步误差的理想链路把发射端到接收端的 PSS-SSS 位置手动对齐再看 BLER 是否还有平台。如果没有平台说明问题是同步残余误差如果还有平台问题在 polar 译码器的软值计算或量化位数。一种典型的翻车场景是 QPSK 解调后的软值用了固定小数位宽低 SNR 下没问题高 SNR 下饱和失真。解决把软值换成浮点或增大量化范围平台通常会退到 -20 dB 以下。5.3 现象BER 统计结果异常低低到 1e-5 以下但 BLER 很高原因这是统计口径混用导致的假象。如果 BER 只统计同步成功的帧而 BLER 统计全部帧在同步成功率不高的时候BER 会显得「过于优秀」——它排除掉了所有同步失败的坏帧而 BLER 把这些坏帧全算了进去两者出现巨大的剪刀差。解决在报告里明确标注两条曲线的分母定义。工程上更常用的做法是BER 也统计全部帧但在同步失败的帧里把译码输出设为随机比特这样 BER 会接近 0.5曲线更诚实也更符合系统级的实际情况。5.4 现象加了多径信道后联合检测的成功率反而不如单独 PSS 检测原因联合检测假设 PSS 和 SSS 经历相同的信道衰落但真实链路里它们之间隔了两个 OFDM 符号信道相干时间短的时候两个符号上的衰落幅度可能差好几个 dB。此时把 PSS 和 SSS 的度量直接相加反而让 PSS 这边原本清晰的峰值被 SSS 那边的大噪声拖累。解决引入信噪比自适应的加权系数低 SNR 时偏向 PSS高 SNR 时偏向 SSS或者分别在两个符号上做归一化后再合并让两者处于同一量纲。5.5 现象仿真速度极慢100 帧要跑一个小时原因大多数计算时间花在了内层相关峰搜索上。pssCorr循环里每一 k 值都要做 127 点复相关整体是 O(N*M) 的复杂度。解决把时域滑动相关用频域 FFT 一次算出——对接收序列做 FFT、与 PSS 序列的 FFT 共轭相乘、再 IFFT相关结果直接就是所有候选位置的完整输出。这个优化通常能带来 20 倍以上的加速代码量只增加三行。仿真里做算法验证时先把 FFT 加速写进去再开始大规模 Monte Carlo能省下大量等待时间。6. 进阶验证技巧用香农极限和理想链路校验你的仿真结果仿真做完不要急着写结论先用三个手段验证结果的正确性。第一个手段是理想链路对照——把接收端的同步位置强制设为发射端真实位置信道估计用完美估计值替换这时三条曲线应该只反映 polar 编码本身的性能。拿这个结果和带同步误差的联合检测结果画在一起两条 BLER 曲线之间的距离就是同步模块引入的性能损失这个 gap 一般应该在 1~2 dB 以内如果超过 3 dB你的同步算法有可优化的空间。第二个手段是香农极限粗校——对 PBCH 的等效码率40 bit 信息 864 bit 编码QPSK 调制计算香农极限 SNR理论值大约是 -2.3 dB假设加性高斯白噪声信道。你的 BLER 曲线应该在离这个极限 1~2 dB 的地方开始拐弯如果差了 5 dB 以上大概率是链路某个环节有 bug。第三个手段是交换参数验证——把加权系数 alpha 分别设为 0、0.5、1.0 跑三条同步成功率曲线确认 0.5~0.6 附近确实有最优区间而不是单调变化。这样能证明你的联合检测设计确实在起作用而不是单纯因为某个序列的功率更高所以「碰巧」效果好。在做这些验证时一个我个人的血泪经验是先把所有随机种子固定下来保证多次运行结果一致否则调参时你根本分不清性能变化是参数引起的还是随机波动引起的。再一个要紧的习惯是每改一个参数就单独存一份日志记录 SNR 范围、帧数和加权系数最后绘图直接用日志数据不要靠记忆拼参数。仿真链路里的「黑匣子」问题很难完全避免但固定随机种子和留日志这两件事能让你在算法翻车的时候快速回滚到之前的可用状态也算是一种后悔药。希望这套链路搭建和验证的方法能帮你在联合检测仿真的路上少走几个弯路。本文还有配套的精品资源点击获取