You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现NRZI信号解码出错排查:输出结果不符预期

NRZI解码代码问题分析与修正

核心问题梳理

你的代码存在三个关键错误,直接导致输出结果不符:

  1. 初始信号状态被错误覆盖
    代码开头初始化prev = '_'是正确的(输入首字符为低信号),但循环内第一行就执行prev = signal[i-1],第一次循环i=0时,i-1=-1会取到字符串最后一个字符¯,彻底打乱了初始信号状态的追踪逻辑。

  2. 未跳过管道字符|
    管道仅作为信号变化的触发标记,本身不生成比特,也不参与信号状态判断。但你的代码遍历了所有字符,包括管道,导致输出长度错误,且逻辑判断混乱。

  3. 比特映射逻辑错误
    原代码的条件分支完全不符合NRZI规则:比如管道后的信号判断逻辑完全偏离,应该根据管道后的信号与上一个有效信号的差异来判断比特,而非直接按管道后的信号类型映射。

正确逻辑与修正代码

NRZI解码的正确流程:

  • 跳过所有|字符,只处理_和¯两种有效信号
  • 从初始有效信号(输入首字符_)开始,每遇到一个有效信号,就和上一个有效信号对比:
    • 信号无变化(与上一个相同)→ 输出0
    • 信号有变化(与上一个不同)→ 输出1
    • 更新当前信号状态为这个有效信号

修正后的代码:

def nrzi(signal: str) -> str:
    res = []
    # 初始信号状态:取输入的第一个有效字符
    prev_signal = '_'
    for char in signal:
        # 跳过管道字符
        if char == '|':
            continue
        # 判断信号变化,生成对应比特
        if char == prev_signal:
            res.append('0')
        else:
            res.append('1')
        # 更新上一个有效信号状态
        prev_signal = char
    return ''.join(res)

signal = "_|¯|____|¯|__|¯¯¯"
result = nrzi(signal)
print(result)  # 输出:011000110100

验证说明

运行修正后的代码,输入_|¯|____|¯|__|¯¯¯会输出正确结果011000110100,完全符合要求。

内容的提问来源于stack exchange,提问作者ERJAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:53:14