揭秘维特比译码器:CommPy的viterbi_decode如何实现近最优解码(附硬判决与软判决对比)

📅 2026/8/24 9:00:45
揭秘维特比译码器:CommPy的viterbi_decode如何实现近最优解码(附硬判决与软判决对比)
揭秘维特比译码器CommPy的viterbi_decode如何实现近最优解码附硬判决与软判决对比【免费下载链接】CommPyDigital Communication with Python项目地址: https://gitcode.com/gh_mirrors/co/CommPyCommPy 是一个用 Python 实现的数字通信开源工具箱Digital Communication with Python其中 convcode.py 提供了卷积码的三大件网格Trellis、编码器conv_encode和维特比译码器viterbi_decode。本篇带你拆解viterbi_decode 维特比译码算法的内部工作原理加法-比较-选择ACS如何逐时刻收敛到最优路径以及硬判决与软判决在解码增益上的真实差距 一、为什么需要维特比译码器先看一个直观的例子信道上加噪会让mouse变成乱码但只要在发送前加入冗余FEC 前向纠错接收端的维特比译码算法就能检测甚至纠正错误。而卷积码恰好是维特比算法的主场——冗余比特被连续地编织进码字结构里形成一张随时间展开的网格地图。二、三步读懂 viterbi_decode 源码打开 convcode.py维特比译码其实只由三块组成1️⃣ Trellis译码的地图Trellis类根据记忆长度和生成矩阵 G(D) 自动生成两张表next_state_table当前状态 当前输入 → 下一状态output_table当前状态 当前输入 → 输出比特组以经典的 G(D) [1D², 1DD²] 为例memory[2]、g_matrix[[5,7]]只有 4 个状态、每个状态 2 条分支地图非常小巧。2️⃣ 分支度量衡量这一步像不像核心函数_compute_branch_metrics按decoding_type分三种打分方式这是硬/软判决差异的根源判决类型输入形式分支度量适用场景hard硬判决0/1 比特汉明距离hamming_dist二进对称信道 BSCsoft软判决对数似然比 LLR负对数似然之和已量化为整数 LLR 的接收机unquantized未量化实数符号欧氏距离euclid_distAWGN 高斯信道3️⃣ ACS 回溯_acs_traceback的最优路径搜索每个时刻对每个状态执行Add各候选前驱的累积路径度量 分支度量Compare Select只保留最小最优的那条并记录前驱状态与输入到paths/decoded_symbols中Traceback当缓冲达到回溯深度tb_depth默认为5 倍记忆长度经验上足以冻结幸存路径后从当前最优状态倒推把幸存路径上的输入符号写进decoded_bits。整个过程是流式的边接收、边压缩、边输出延迟恒定在tb_depth个时刻。三、硬判决 vs 软判决差在哪这是工程中最关键的取舍源码里的细节一目了然硬判决把接收信号先取整成 0/1再数错了几个比特。简单但把幅度信息扔掉了软判决保留接收信号的可信程度LLR分支度量累加对数似然——弱证据也能参与投票unquantized直接用实数做欧氏距离最贴近 AWGN 信道最大似然解码稳定性细节soft模式的 LLR 输入会被clip 到 [-500, 500]防止指数运算溢出尾部处理终止后的时刻硬判决补 0、软判决补 0、unquantized 补 -1保证译码器能驶回零状态。收益同样的卷积码软判决相比硬判决通常能拿到约 1~2 dB 的信噪比增益——在无线系统里这几乎等于免费的容量。四、卷积码编码器结构长这样下面这张图展示了一个典型卷积码编码器移位寄存器组 模二加器正是Trellis内部建模的对象。五、最小可用示例3 行代码完成编解码想亲手跑一遍参照 test_convcode.py 的测试用例from numpy import array from commpy.channelcoding.convcode import Trellis, conv_encode, viterbi_decode trellis Trellis(array([2]), array([[5, 7]])) # G(D) [1D², 1DD²] coded conv_encode(message_bits, trellis) decoded viterbi_decode(coded, trellis) # 硬判决解码 llr 10.0 * coded - 5 noise # 模拟带噪接收LLR decoded_soft viterbi_decode(llr, trellis, decoding_typesoft)无噪信道下decoded与原始message_bits完全一致即使叠加随机噪声软判决解码也能正确恢复——这正是测试用例反复验证的行为。六、近最优解码代价是什么维特比译码器本质上在做最大似然序列估计逐时刻只保留每个状态的幸存者把指数级路径压缩到线性规模复杂度约O(状态数 × 时间)。相比穷举所有 2ᴸ 条路径的暴力最大似然解码它是经典的用一点点性能损失换可计算性的方案——而默认 5×M 的回溯深度让这点损失在实际中几乎不可感知。延伸探索路径卷积码编解码与维特比译码器实现commpy/channelcoding/convcode.py编解码往返测试含软判决 LLR 用例commpy/channelcoding/tests/test_convcode.py802.11 WiFi 物理层完整链路示例wifi80211_conv_encode_decode.pyTurbo 码内含 BCJR/MAP 译码器commpy/channelcoding/turbo.py掌握viterbi_decode之后你已经拥有了理解 Turbo 码、LTE/5G 卷积码信道的钥匙——维特比译码器正是这一切的起点。【免费下载链接】CommPyDigital Communication with Python项目地址: https://gitcode.com/gh_mirrors/co/CommPy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考