Python实现NRZI信号解码出错排查:输出结果不符预期
NRZI解码代码问题分析与修正
核心问题梳理
你的代码存在三个关键错误,直接导致输出结果不符:
初始信号状态被错误覆盖
代码开头初始化prev = '_'是正确的(输入首字符为低信号),但循环内第一行就执行prev = signal[i-1],第一次循环i=0时,i-1=-1会取到字符串最后一个字符¯,彻底打乱了初始信号状态的追踪逻辑。未跳过管道字符
|
管道仅作为信号变化的触发标记,本身不生成比特,也不参与信号状态判断。但你的代码遍历了所有字符,包括管道,导致输出长度错误,且逻辑判断混乱。比特映射逻辑错误
原代码的条件分支完全不符合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
相关产品推荐
相关产品推荐

