4. 浮点参考模型搭建与验证

定点化设计的第一条铁律是:先有一个可信的浮点参考模型,再谈定点化。浮点模型不是"随便搭一个能跑的模型",而是后续所有定点版本、误差评估、位宽取舍的黄金基准(Golden Reference)。如果浮点模型本身有错,定点化再精细也只是在错误的基础上做优化。本节以一个真实可用的对象——一阶数字低通滤波器(IIR)为例,完整走一遍浮点参考模型的搭建、激励定义、观测点设置与基准用例验证流程。

一、选定算法对象与浮点参考结构

选择一阶 IIR 低通滤波器作为示例对象,原因是它足够简单、便于手算核对,又同时包含乘法、加法、状态反馈和系数,是定点化中最典型的"误差敏感结构"。其差分方程为:

y[n] = b0 * x[n] + b1 * x[n-1] - a1 * y[n-1]

其中 x 为输入,y 为输出,b0、b1、a1 为滤波器系数。在 Simulink 中,浮点参考模型应使用 double 数据类型搭建,推荐用 Discrete Transfer Fcn 模块或 Unit Delay + Gain + Sum 显式搭建。前者简洁,后者更贴近定点实现结构,便于后续逐节点定点化。本节采用显式结构,因为它能暴露每一个中间变量,方便定点化时逐点替换数据类型。

示例参数(合理假设,非实测):采样率 Fs = 1000 Hz,截止频率 fc = 50 Hz,则归一化角频率 ω = 2π·fc/Fs ≈ 0.3142 rad。采用双线性变换得到系数:b0 ≈ 0.1367,b1 ≈ 0.1367,a1 ≈ -0.7265。这些系数在浮点模型中直接以 double 常量写入 Gain 模块。

二、定义输入激励

浮点参考模型的激励必须覆盖算法在实际使用中会遇到的典型工况,而不是只喂一个正弦波。针对低通滤波器,建议至少定义三类激励:

  • 单频正弦:用于验证通带增益和相位是否符合理论。例如 20 Hz 正弦,理论通带增益应接近 1。
  • 阶跃信号:用于观察瞬态响应和建立时间,检验滤波器对突变的抑制能力。
  • 宽带噪声或扫频:用于覆盖全频段,暴露截止频率附近的幅频特性。

在 Simulink 中,激励源可用 Sine Wave、Step、Band-Limited White Noise 模块,或统一用 From Workspace 加载预先构造的输入向量。推荐后者,因为输入数据可复现、可版本管理,且能直接与 MATLAB 脚本联动。例如构造一个 1 秒、1000 点的输入向量:

t = (0:999)'/1000;
x = sin(2*pi*20*t) + 0.5*sin(2*pi*200*t);
% 20Hz 通带分量 + 200Hz 阻带分量

这样一次仿真就能同时观察通带保持和阻带衰减,比单一频率更高效。

三、设置输出观测点

浮点参考模型的观测点不能只看最终输出 y[n]。定点化误差往往在中间变量上先暴露,因此建议在以下位置设置观测:

  • 输入 x[n]:确认激励正确进入。
  • 乘积项 b0·x[n]、b1·x[n-1]、a1·y[n-1]:这三个乘积是定点化中舍入误差的主要来源。
  • 状态 y[n-1]:反馈状态,误差会在此累积。
  • 输出 y[n]:最终结果,用于与定点版本对比。

在 Simulink 中,用 To Workspace 模块将这些信号记录为 logsout 或独立变量,并统一设置采样时间与仿真步长一致(本例为 0.001 s)。观测数据是后续误差评估的原始素材,必须完整保存。

四、浮点基准测试用例

基准测试用例是浮点模型的"验收标准"。每个用例应包含:激励类型、持续时间、期望输出特征、容差范围。下表给出三个可直接使用的基准用例:

用例编号激励持续时间期望特征容差
TC-0120 Hz 正弦,幅值 1.01 s稳态输出幅值 ≈ 1.0,相位滞后约 18°幅值 ±1%
TC-02单位阶跃,幅值 1.00.5 s稳态输出 ≈ 1.0,建立时间 < 50 ms稳态 ±0.5%
TC-0320 Hz + 200 Hz 混合1 s200 Hz 分量衰减至 < 0.1阻带幅值 < 0.1

这些用例的期望值来自滤波器理论计算,属于合理推导结果,不是实测数据。实际执行仿真后,应将仿真输出与理论值对比,确认浮点模型本身正确,再将其固化为基准。

浮点参考模型验证通过后,务必冻结模型版本和输入数据,并记录 Simulink 版本、求解器设置(本例用固定步长 discrete,步长 0.001 s)。定点化过程中任何对比都必须以这个冻结版本为基准,否则误差来源无法追溯。

五、验证流程与判断依据

浮点参考模型的验证不是"跑一次看波形差不多就行",而应有明确的判断依据。推荐按以下顺序执行:

  1. 用 TC-01 运行仿真,将输出与理论稳态幅值、相位对比,确认通带特性正确。
  2. 用 TC-02 检查阶跃响应,确认无异常振荡、无发散,建立时间符合一阶系统理论值。
  3. 用 TC-03 检查阻带衰减,确认高频分量被有效抑制。
  4. 将三个用例的输出保存为基准数据文件(如 golden_ref.mat),供后续定点版本逐点对比。

判断依据应量化:幅值误差超过 1%、相位偏差超过 5°、或出现发散,都说明浮点模型有问题,必须先修正再进入定点化。只有浮点模型在全部基准用例上通过,它才具备作为黄金参考的资格。

浮点参考模型搭建与验证流程 输入激励 Sine / Step / Noise From Workspace 浮点参考模型 (double) y[n] = b0·x[n] + b1·x[n-1] − a1·y[n-1] Unit Delay + Gain + Sum b0=0.1367, b1=0.1367, a1=−0.7265 输出观测 x[n], 乘积项, y[n-1] To Workspace 浮点基准测试用例 TC-01 单频正弦 20 Hz, 幅值 1.0, 1 s TC-02 单位阶跃 幅值 1.0, 0.5 s TC-03 混合信号 20 Hz + 200 Hz, 1 s 验证判断依据 ✓ 幅值误差 ≤ 1% ✓ 相位偏差 ≤ 5° ✓ 无发散、无异常振荡 ✓ 建立时间 < 50 ms ✓ 阻带幅值 < 0.1 ✗ 任一不通过 → 修正浮点模型

当浮点模型在 TC-01 至 TC-03 上全部通过,将其输出保存为 golden_ref.mat,并冻结模型文件与输入数据。这个冻结版本就是后续所有定点化工作的唯一对比基准。定点化过程中,任何位宽调整、舍入模式改变、溢出保护策略,都必须以该基准的逐点误差作为判断依据,而不是凭波形"看起来差不多"下结论。

常见误区:直接用 Simulink 默认的变步长求解器跑浮点模型。定点化对比要求仿真步长严格一致,否则浮点与定点的时间轴不对齐,逐点误差计算会失真。务必在模型配置中改为固定步长(Fixed-step),步长与算法采样周期一致。

至此,浮点参考模型已具备"可复现、可对比、可验收"三个属性。下一步的定点化,本质上就是在这个基准上逐节点替换数据类型,并用同一组激励和同一套判断依据,量化每一个替换带来的误差。