自制软件 WaveFormEye 使用流程

从畸变波形到均衡恢复

这款软件到底在解决什么问题

高速链路测试里,我们拿到的往往不是“理想数字信号”,而是一条已经被信道损耗、带宽限制、码间干扰、抖动和噪声污染过的实测波形。

WaveFormEye 的核心目标,就是把这条实测波形重新拉回到一个可分析、可验证、可恢复的状态。它围绕下面这条主线展开:

原始波形 -> 眼图分析 -> 码型对齐 -> 脉冲响应提取 -> AMI 均衡 -> BER 验证

如果用一句更通俗的话概括,这个软件做的是:

“从接收到的畸变波形中,恢复出更接近理想判决状态的信号,并量化它到底恢复得怎么样。”

软件适合什么场景

这个项目是一个基于 PySide6 + Qt Widgets + Matplotlib + NumPy/SciPy 的桌面信号分析工具,适合以下场景:

  • 查看示波器导出的两列波形数据
  • NRZPAM4 波形绘制眼图
  • 从训练码型和实测波形中完成相位对齐
  • 提取通道的脉冲响应、冲激响应和频响
  • 调用 IBIS-AMI 模型对波形进行均衡
  • 对均衡结果做判决、对齐和 BER 验证

在项目实现里,主窗口是“波形数据查看器”,其上层功能入口非常直接:

  • 绘制眼图
  • 波形码型对齐器
  • 提取脉冲响应
  • 波形均衡

这四个按钮,基本构成了日常使用的完整工作流。


正式开始前,需要准备哪些文件

在开始使用之前,建议准备好以下输入:

1. 原始波形文件

通常为示波器导出的两列文本数据,项目支持常见的 txt/csv 格式。
这类文件至少需要包含时间列和电压列。

2. 训练码型文件

这一步主要用于“波形码型对齐”和“脉冲响应提取”。
如果你要从实测波形反推出通道特性,必须知道参考码型。

3. AMI 模型文件

如果要做均衡,还需要准备接收端 RX AMI 模型;
如果要启用发送端训练,还需要可选的 TX AMI 模型。

通常会成对出现:

  • .ami
  • 对应的 .dll

4. 项目目录

软件支持项目化保存。建议每个测试场景建立一个单独项目,方便保存:

  • 波形文件
  • 码型文件
  • 脉冲响应参数
  • AMI 模型
  • 导出结果

这样后续重复分析和复盘都会轻松很多。


整体使用流程总览

如果你是第一次用,推荐按下面这个顺序操作:

  1. 在主窗口加载原始波形,确认时间范围、码率、调制方式和重采样参数。
  2. 先画眼图,快速判断当前链路质量,找到大致的判决状态。
  3. 打开“波形码型对齐器”,把实测波形和训练码型对齐,导出对齐后的周期码型。
  4. 打开“提取脉冲响应”,利用实测波形和对齐码型拟合出通道的脉冲响应。
  5. 打开“波形均衡”,加载上一步生成的 .npz 参数文件和 AMI 模型,对波形做均衡。
  6. 查看均衡后的眼图、参数输出和日志,再执行判决解码与 BER 验证。

这套流程里,每一步都不是孤立的,而是前一步给后一步提供输入。


第一步:加载波形并完成基础设置

启动软件后,先进入主窗口“波形数据查看器”。

这里建议先做四件事:

1. 选择波形文件

点击 浏览,导入原始波形。软件会自动解析时间轴、电压轴,并在主画布中显示时域波形。

主画布波形

2. 设置码率和调制方式

主窗口里会根据你输入的 Bit Rate 和当前调制方式自动换算符号率。

  • NRZ 对应 2 电平
  • PAM4 对应 4 电平

这一步非常关键,因为后面的眼图分析、重采样、对齐、脉冲提取和均衡,全都依赖符号率。

3. 设置重采样 SPS

软件支持将原始波形重采样到目标 SPS。这个参数会直接影响后续眼图精度和脉冲响应提取效果。

通常建议:

  • 快速观察可以先用较小 SPS
  • 准备进入脉冲响应和均衡阶段时,尽量使用更稳定的目标 SPS

4. 检查时间窗口

你可以在主窗口设置查看区间,只分析波形中的一段时间窗口。如果原始波形很长,这一步能显著减少无关内容的干扰。


第二步:先画眼图,快速判断波形状态

完成基础设置后,点击 绘制眼图

这一步的意义不是“画张图看看”,而是快速回答下面几个问题:

  • 当前眼图到底有没有张开
  • 最佳判决时间大概在哪
  • 判决阈值是否容易分离
  • 链路当前更像是受噪声影响,还是受 ISI 影响

眼图界面里重点看什么

软件会同时给出叠线眼图和统计眼图。两种表现形式不同,但本质都在描述同一件事:周期内不同波形轨迹的重叠和分布。

可以重点关注这些指标:

  • Tmid:最佳判决时间附近的位置
  • Vmid:判决阈值
  • 眼高
  • 眼宽
  • 电平间距
  • 轮廓和 Bathtub 相关结果

这一步的实际作用

眼图分析一方面能给出最直观的质量判断,另一方面也为后续“判决”和“BER 估计”提供基础。

如果在这个阶段就发现眼图完全闭合、信号接近不可判决,那后面的码型对齐和均衡就更有必要了。

若眼图睁开,信号较为理想,可以直接根据眼图进行判决恢复

理想信号眼图判决恢复

第三步:用“波形码型对齐器”找到真实相位

当你已经有参考训练码型时,下一步就是点击 波形码型对齐器

这一步是整个流程里非常关键、但也最容易被低估的一步。

为什么必须先做码型对齐

因为实测波形通常并不知道:

  • 它从参考码型的哪个符号开始
  • 一共覆盖了多少周期
  • 当前这段波形和理想码型之间到底偏了多少相位

如果不先把这些关系搞清楚,后面做脉冲响应提取时,参考序列和实际波形就对应不上,拟合结果会明显失真。

在界面里怎么操作

进入对齐器后,依次填写:

  • 码型文件
  • 波形文件
  • 符号率 (GHz)
  • 每符号采样数
  • 插值方式
  • 信号类型

然后点击 运行对齐

软件会做两件事:

  1. 检测参考码型的周期信息。
  2. 通过相关性分析找到实测波形在参考码型中的最佳起始位置。

对齐完成后可以得到什么

对齐结果通常会告诉你:

  • 检测到的周期长度
  • 最佳相位
  • 使用了多少波形样本
  • 相关性对齐结果

更重要的是,你可以进一步导出:

  • 导出单周期符号
  • 导出对齐码型

其中“对齐后的码型”是下一步提取脉冲响应时最关键的输入之一。

波形起始点与码型做位置对齐

可以看到波形并非从码型首位开始采集,而是从码型中的某个位置开始,不断循环。


第四步:提取脉冲响应,恢复通道特征

完成码型对齐之后,点击主窗口里的 提取脉冲响应

这个步骤的核心思想是:

已知实测波形和参考码型,假设通道可以近似看成线性系统,那么就可以通过拟合的方法,求出一个最能解释当前实测数据的脉冲响应。

为什么这一阶段这么重要

因为后面的 AMI_Init 不是直接吃原始波形,而是依赖通道的冲激响应或脉冲响应来建立模型内部状态。

换句话说:

  • 码型对齐回答的是“波形和参考序列怎么对应”
  • 脉冲响应提取回答的是“这个通道本身长什么样”

在界面里需要输入什么

在“提取脉冲响应”窗口中,通常要准备:

  • 波形文件
  • 对齐后的码型文件
  • 符号率
  • 目标 SPS
  • 调制方式
  • 插值方式

如果你已经从主窗口进入,这些参数很多会被自动带入。

运行后会看到哪些结果

软件会展示并支持导出以下内容:

  • 拟合脉冲响应
  • 冲激响应
  • 通道频响
  • 波形拟合结果
  • SNDR

这些结果共同描述了信道的线性等效特征。

提取脉冲响应并观察SNDR

为什么建议导出 .npz

项目会把脉冲响应相关结果保存为参数文件,后续均衡阶段可以直接加载。这也是项目内“提取脉冲响应 -> 波形均衡”能够顺畅串起来的关键。


第五步:加载 AMI 模型,对波形做均衡

有了脉冲响应参数文件之后,就可以点击 波形均衡 进入最核心的一步。

这一阶段的目标很直接:

把“已经提取出的真实通道特征”交给 IBIS-AMI 模型,让模型完成均衡,再回头验证均衡到底有没有把信号救回来。

先理解两类输入

均衡界面至少需要三类输入:

  • 原始波形文件
  • 脉冲响应参数文件
  • RX AMI 路径

如果需要发射端训练,还可以额外启用:

  • 启用TX训练
  • TX AMI路径

软件内部实际上做了什么

项目的均衡流程大致如下:

  1. 读取 .npz 中的脉冲响应、符号率、SPS 和参考码型。
  2. 解析 .ami 文件和对应的 dll
  3. 用脉冲响应调用 AMI_Init,让模型建立均衡状态。
  4. 把原始波形重采样到模型所需的 ami_sps
  5. 按块调用 AMI_GetWave,得到均衡后的时域波形。
  6. 重新绘制均衡后眼图,并进一步做判决和 BER 计算。

这也是为什么均衡不是一个“单按钮黑盒”,而是依赖上游脉冲响应质量的原因。

参数设置建议

界面里除了路径输入,还可以通过 AMI 设置 进入参数对话框。
这里通常用于覆写模型参数,比如:

  • 调制等级
  • CTLE/VGA 相关开关
  • 自适应参数
  • FFE taps
  • Block size
  • IgnoreBits

如果你正在做不同均衡策略的对比,这一步非常有价值。

AMI参数设置

为什么日志也值得认真看

均衡窗口不只是显示结果图,还会输出运行日志。
这些日志对于判断下面几件事非常重要:

  • AMI_Init 是否真正成功
  • 自适应参数有没有收敛
  • GetWave 处理是否正常
  • 当前模型有没有输出有效的均衡参数

如果只盯图而不看日志,很多问题会很难定位。

AMI均衡日志

可以看到AMI内部在不断对参数进行调整,从而获取最佳FOM


第六步:看均衡结果时,不要只看“波形变了没有”

很多人第一次看均衡结果,会习惯先问一句:“波形是不是变好看了?”

但工程上更有意义的判断标准其实有三类:

1. 均衡前后眼图对比

这是最直观的指标。

重点看:

  • 眼高有没有增大
  • 眼宽有没有拉开
  • 判决区域是不是更稳定
  • 多电平之间的分离是不是更清楚
ISI+噪声信号的均衡结果

2. AMI 输出参数

均衡完成后,界面会展示模型输出参数和抽头信息。
这些参数能帮助我们判断:

  • 模型是否真正参与了均衡
  • 当前最优参数是否合理
  • TX/RX 的训练是否生效

3. 均衡日志中的收敛过程

如果日志里能看到自适应参数的迭代过程,就能更明确地知道模型是在“工作”,还是只是“走了一遍流程”。


第七步:执行判决解码和 BER 验证

如果只是看到均衡后眼图更开,其实还不能完全说明链路真的更好了。
最终还需要回到最硬的指标上:BER

这时点击:

  • 判决解码
  • 导出判决结果
最佳判决与BER计算

这一阶段内部做了什么

项目会复用“均衡后统计眼图”里的判决时刻和阈值,然后:

  1. 在判决时刻对均衡后波形做插值采样。
  2. 根据阈值把采样点判成 NRZPAM4 符号。
  3. 估计当前判决序列与参考码型之间的整体延迟。
  4. 在一个周期内做相位搜索,找到误码最少的对齐方式。
  5. 输出最终 BER、误码数、对齐相位和比较符号数。

为什么这一步很重要

因为有时候眼图“看起来更开”,但判决和对齐后未必真的能得到更低的误码率。所以真正闭环的验证逻辑应该是:

均衡后眼图改善 + BER 下降

而不是只看图形观感。


实际使用时的几个经验建议

1. 不要跳过码型对齐

很多后续误差,其实不是均衡算法不好,而是前面的参考序列根本没对齐。

2. 眼图分析适合做“快速诊断”,但不等于最终验证

眼图能帮你快速发现问题,但最终是否恢复成功,还是要看判决和 BER

3. 脉冲响应质量决定均衡上限

如果提取出来的脉冲响应本身不可信,那么 AMI 模型再强,结果也会失真。

4. 日志是调试均衡最重要的信息源之一

特别是在 AMI_Init、参数自适应和 GetWave 阶段,日志往往比图形更早暴露问题。

5. 建议全程使用项目化保存

项目模式会自动组织:

  • waveform/
  • pattern/
  • pulse_params/
  • ami_models/
  • exports/
  • results/

这样不管是复现分析、整理报告还是写博客,都会省很多时间。


一个最常用的标准操作范式

如果把上面的流程压缩成一套最实用的“日常操作模板”,可以总结成下面这几步:

  1. 新建项目,导入原始波形。
  2. 设置码率、调制方式和重采样 SPS
  3. 点击 绘制眼图,先判断链路当前质量。
  4. 点击 波形码型对齐器,导出对齐码型。
  5. 点击 提取脉冲响应,生成脉冲响应参数文件。
  6. 点击 波形均衡,加载 .npzRX AMI 模型。
  7. 根据需要打开 AMI 设置 或启用 TX 训练
  8. 执行均衡,查看日志、参数和均衡后眼图。
  9. 点击 判决解码,检查最终 BER
  10. 导出波形、判决结果和关键图表,用于报告或博客整理。

结语

WaveFormEye 的价值,不只是把示波器波形“画出来”,而是把高速链路分析里几个关键环节真正串成了一条工程闭环:

  • 先看波形
  • 再看眼图
  • 再做对齐
  • 再提取通道
  • 再做均衡
  • 最后用 BER 验证

这条链路把“观察现象”和“恢复信号”连接到了一起,也让分析过程从经验判断,逐步走向可解释、可复现、可量化。

如果你正在做高速链路调试、均衡验证或者信号完整性实验,这套流程会非常适合作为一份培训材料,或者一套团队内部标准操作指南。