welle.io DAB软解核心算法揭秘:Viterbi软判决解码与UEPEEP保护如何破解FIC信道

发布时间:2026/8/23 11:29:03
welle.io DAB软解核心算法揭秘:Viterbi软判决解码与UEPEEP保护如何破解FIC信道 welle.io DAB软解核心算法揭秘Viterbi软判决解码与UEPEEP保护如何破解FIC信道【免费下载链接】welle.ioA DAB/DAB Software Defined Radio (SDR)项目地址: https://gitcode.com/gh_mirrors/we/welle.iowelle.io 是一款开源的 DAB/DAB 软件定义无线电SDR接收器能借助 RTL-SDR、Airspy 等硬件实时解码数字音频广播信号。本文将深入拆解 welle.io 解码器中最关键的算法Viterbi 软判决解码与 UEP/EEP 信道保护看它们如何一步步破解承载节目单信息的 FIC 信道让你彻底理解 SDR 接收机背后的纠错魔法 ✨FIC信道DAB广播的空中调度台在 DAB 标准中FICFast Information Channel快速信息信道是整帧信号的调度台它携带 FIBFast Information Block块告诉接收机哪个时隙里播着哪个电台、用什么编码、音频是 DAB 还是普通 DAB。没有 FIC接收机连节目列表都列不出来。FIC 信号在传播中会受到噪声和脉冲干扰因此采用了三重防护卷积码Viterbi 解码—— 抗随机噪声的主力FIB CRC 校验—— 快速判断解码结果是否可信能量扩散Energy Dispersal—— 防止长串相同比特破坏定时同步在 welle.io 中这条流水线由 src/backend/fic-handler.cpp 的FicHandler类驱动它继承自Viterbi类是理解整个算法的核心入口。Viterbi软判决解码64个状态的最优路径搜索卷积编码K7、码率1/4DAB 标准规定 FIC 使用约束长度K7的卷积码码率为1/4每个信息比特产生 4 个编码比特因此译码器状态空间为2⁶ 64 个状态。这一设计直接体现在头文件 src/backend/viterbi.h 中#define RATE 4—— 码率 1/4#define NUMSTATES 64—— 64 个编码器状态#define K 7定义在 src/backend/viterbi.cpp软判决比硬判决聪明在哪普通硬判决只记录 0 或 1而 welle.io 的 Viterbi 解码器接收的是softbit软比特取值范围 -127~127代表这个比特像 0 还是像 1 的置信度。解码时见deconvolve()函数软比特被映射到 0~255 区间置信度直接参与度量计算软判决的好处是即使符号被部分污染只要方向没变译码器依然能做出正确判断纠错能力比硬判决提升约 1.5~2 dB。蝶形运算与回溯算法心脏解码过程分为两步前向更新update_viterbi_blk_GENERIC()对每个软符号执行蝶形运算BFLY 宏函数。每个状态保留一个路径度量path metric记录到达该状态的最优累积代价超过阈值RENORMALIZE_THRESHOLD时做重归一化防止溢出。后向回溯chainbackchainback_viterbi()从已知的终止状态反向追溯沿着记录的历史判决decisions还原出原始比特流。这里还有一个有趣的工程细节代码注释坦承最初自研实现时多项式被写成了位反转形式导致解码失败——可见卷积码的生成多项式{0155, 0117, 0123, 0155}对位序极其敏感这正是 FIC 解码玄学问题的高发区。UEP/EEP保护框架给不同信道量体裁衣除了 FICDAB 的节目服务信道MSC还有两类更强的保护方案welle.io 用统一的抽象基类组织它们见 src/backend/protection.h类适用场景交织策略UEPProtection通用信道保护两级 4 子块 PI 交织PI1~PI4EEPProtection增强型信道保护EEP-A/B 档两级 PI 交织PI1~PI2它们分别实现在 src/backend/uep-protection.cpp 和 src/backend/eep-protection.cpp共享同一个卷积码 Viterbi 软判决内核。UEP 的精髓在于交织。以 32 kbit/s、保护等级 5 的档位为例编码顺序由profileTableuep-protection.cpp 开头的查表指定 L1/L2/L3/L4 长度与 PI1/PI2/PI3/PI4 索引。交织把时间上相邻的比特打散到不同位置使突发干扰无法连续击伤同一个码块——相当于鸡蛋分篮存放。译码时按相反顺序反交织再交给 Viterbi 还原。不同保护等级的权衡一目了然等级 5 抗干扰最强等级 1 吞吐效率最高。welle.io 会根据 FIC 中声明的保护配置动态选择对应档位这也是它能兼容各种发射台参数的原因。FIC解码全流水线从软比特到节目单把 src/backend/fic-handler.cpp 的processFicInput()拆开完整的 FIC 破解流程是收集 2304 软比特processFicBlock()按 DAB 模式 I/II/IV 的不同块大小攒够一个码字解删除depuncture按PI_16、PI_15两张删除图案还原 24 个完整卷积码块再补上编码器寄存器尾部的 24 比特Viterbi 软判决解码2304 比特还原为 768 比特的 FIC 数据能量扩散还原与本地生成的 768 位 PRBS 伪随机序列异或PRBS序列由 9 级移位寄存器在构造函数中生成逐 FIB 做 CRC 校验三个 256 比特 FIB 各自独立校验通过后交给FIBProcessorsrc/backend/fib-processor.cpp解析失败的 FIB 计入fic_decode_success_ratio成功率反馈 UIgetFicDecodeRatioPercent()返回 0~100 的解码比率你在 welle.io 专家视图里看到的 FIC 解码成功率 正是它整个闭环体现了**软判决 交织 CRC 兜底** 的经典组合拳Viterbi 负责尽量解对CRC 负责敢不敢信能量扩散保证定时不失。想读源码从这三个文件入手 算法核心src/backend/viterbi.h、src/backend/viterbi.cpp —— 64 状态 Viterbi 译码器约 350 行是全文最值得精读的部分保护框架src/backend/uep-protection.cpp、src/backend/eep-protection.cpp、src/backend/protTables.cpp —— UEP/EEP 档位表与 PI 交织索引流水线装配src/backend/fic-handler.cpp —— 解删除、PRBS 异或、FIB CRC 的完整编排小结welle.io 之所以能在普通 USB 电视棒上稳定解码 DAB 电台靠的正是这套教科书级的信道保护算法Viterbi 软判决以 64 状态网格搜索榨干每一个比特的置信度UEP/EEP 交织把突发干扰打散成零星噪声CRC 与能量扩散则守住最后一道防线。理解了 FIC 信道的破解过程你就掌握了 DAB 解码器的一半秘密——另一半OFDM 解调与音频解码welle.io 的后端源码同样值得你继续探索 【免费下载链接】welle.ioA DAB/DAB Software Defined Radio (SDR)项目地址: https://gitcode.com/gh_mirrors/we/welle.io创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考