尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

IIR 滤波器从零到设计系Ⅳ:IIR 滤波器的工程实现(Biquad、DF-II Transposed 与 SOS)

IIR 滤波器从零到设计系Ⅳ:IIR 滤波器的工程实现(Biquad、DF-II Transposed 与 SOS) 前面的文章已经建立了 IIR 的理论主线差分方程 → 传递函数 → 零点与极点 → 稳定性与频率响应 → Biquad接下来要解决的是工程实现问题已有一组 Biquad 系数怎样逐样本计算DF-I、DF-II 和 DF-II Transposed 应该怎样选择高阶 IIR 为什么通常使用 SOS多个二阶节怎样组织、排序和缩放实现后需要验证什么本文不展开信号流图证明重点放在系数、状态、数据路径和数值可靠性上。一、工程中使用的标准 Biquad归一化 Biquad 通常写成对应差分方程其中b0、b1、b2前馈系数 a1、a2反馈系数这里假设分母首项已经归一化为 1。若设计工具输出且必须先将所有系数除以。二、系数符号必须先确认本文使用的分母是所以反馈计算使用有些 DSP 库会直接保存已经取反的反馈系数届时公式可能写成其中两种定义都可以使用但不能混用。工程中拿到一组系数后首先应确认分母首项是否已经归一化 反馈系数是否已经包含负号 系数排列顺序是什么 状态初值怎样定义三、DF-I最直接的实现DF-I 直接实现差分方程需要保存每个样本计算完成计算后更新四个历史值。DF-I 的工程特点是优点 结构和差分方程直接对应 容易调试和人工核对 输入历史与输出历史相互独立 缺点 一个二阶节需要四个状态 不是最少状态实现DF-I 适合教学、功能验证以及某些定点实现但并不一定是浮点 Biquad 的首选结构。四、DF-II使用公共内部状态将传递函数拆成两部分并在中间定义内部信号 w[n]对应时域关系两个公式共用因此一个二阶节只需要两个状态。w[n] 是实现过程中定义的内部量不是外部输入或输出也不需要赋予特殊物理意义。DF-II 的工程特点是优点 二阶节只需两个状态 存储量与系统阶数一致 风险 内部 w 先经过全极点部分 某些滤波器的 w 可能明显大于最终输出 定点实现中可能增加溢出风险五、DF-II Transposed工程中常用的 Biquad 结构DF-II Transposed 同样只使用两个状态其逐样本关系为它们不是新规律只是把原差分方程重新分组每个样本的处理顺序是1. 读取旧状态 s1、s2 2. 计算当前输出 y 3. 根据当前 x、y 和旧 s2 计算新 s1 4. 根据当前 x、y 计算新 s2 5. 保存新状态两个状态可以理解为过去样本已经累积好的输出贡献。DF-II Transposed 常用于浮点 Biquad主要原因是二阶只需两个状态 计算形式紧凑 容易组成统一的 SOS 循环 通常避免普通 DF-II 中显式的全极点内部量 w它并不减少滤波器所需的乘法次数主要优化的是状态组织和实际计算路径。六、三种结构怎样选择结构二阶状态数主要用途DF-I4直观验证、部分定点场景DF-II2最少状态实现DF-II Transposed2浮点 Biquad、SOS 级联理想精度下三种结构实现同一个 H(z)。有限精度下由于中间状态和舍入位置不同输出可能存在细微差异。工程上可以采用以下策略验证公式和系数使用 DF-I 作为参考 浮点实时处理优先评估 DF-II Transposed 定点处理比较 DF-I 与转置结构的内部范围 高阶滤波器使用 SOS不直接实现高阶多项式七、为什么高阶 IIR 要使用 SOS一个 N 阶 IIR 可以直接写成数学上没有问题但直接高阶实现存在工程风险高阶多项式系数对量化误差敏感很小的系数变化可能引起较明显的极点移动内部节点可能出现很大的中间值定点实现更容易溢出单个高阶结构难以定位数值问题极点越靠近单位圆风险通常越明显。因此高阶 IIR 通常保留为多个二阶节其中SOS 是 Second-Order Sections即二阶节级联。它没有降低整体滤波器阶数而是把一个高阶实现拆成多个容易控制的二阶模块。八、滤波器阶数与 SOS 数量一个 N 阶滤波器通常需要·个二阶节。例如4 阶滤波器 → 2 个二阶节 6 阶滤波器 → 3 个二阶节 8 阶滤波器 → 4 个二阶节奇数阶滤波器会包含一个一阶节。为了使用统一的数据结构可以把一阶节放进 Biquad 格式并将缺少的二阶系数设为零。九、SOS 的逐样本数据路径假设一个六阶滤波器由三个二阶节组成定义则一个输入样本的处理过程是x[n] → 二阶节 1 → 中间结果 v1[n] → 二阶节 2 → 中间结果 v2[n] → 二阶节 3 → y[n]如果使用 DF-II Transposed每个二阶节拥有5 个归一化系数 b0、b1、b2、a1、a2 2 个独立状态 s1、s2六阶滤波器由三个二阶节组成因此共有六个状态。各节不能共用状态因为每个节的输入和历史都不同。十、为什么共轭零极点组成一个二阶节实系数滤波器的复数极点成共轭对出现两者组合展开后得到实数系数。零点通常也采用类似的共轭配对方式。这样每个二阶节都可以使用实数运算并局部保存一对零点和一对极点的特性。十一、为什么不能随意打乱 SOS 顺序理想数学条件下因此交换二阶节顺序不会改变整体传递函数。但交换顺序会改变节间信号。假设某个二阶节在部分频率上具有很大的峰值增益把它放在级联前端可能导致后续节输入幅值过大定点数溢出浮点有效精度下降状态变量出现较大峰值量化噪声被后续节进一步放大。因此节顺序影响的是有限精度数值表现而不是理想频率响应。实际项目中应优先保留成熟设计工具给出的 SOS 配对、顺序和缩放结果。十二、增益怎样分配到各节整体增益为可以将 K 分散到各节只要满足整体传递函数就不会改变。合理缩放的目标是避免某一级输出过大 避免状态变量接近数值上限 保留足够的定点余量 减小舍入和量化误差不要仅根据最终输出幅值判断安全性。最终输出正常时中间节仍可能出现较大的信号。十三、状态管理比公式更容易出错实际工程中常见的问题不是公式错误而是状态管理错误。连续数据不能随意清零状态实时音频、振动信号或传感器数据通常按数据块处理。只要相邻数据块属于同一条连续信号状态必须保留。块 1 结束时的状态 → 作为块 2 开始时的状态如果每个数据块开始都清零状态会产生块边界瞬态输出不连续独立信号必须使用独立状态不同通道或不同信号流可以共享同一组只读系数但不能共享状态。左声道自己的 s1、s2 右声道自己的 s1、s2多通道系统的状态数量为通道数 x 二阶节数 x 2十四、系数切换也需要考虑状态如果运行中直接替换滤波器系数旧状态仍然属于旧滤波器。新系数与旧状态组合后可能产生明显瞬态。常见处理方法包括在允许中断的场景中清零状态对系数进行平滑插值同时运行新旧滤波器并交叉淡化选择哪种方式取决于系统是否允许瞬态以及参数变化速度。音频均衡器和控制系统通常不能简单地瞬间替换高共振滤波器的系数。十五、浮点与定点实现的关注点浮点实现重点检查单精度是否满足频率响应要求极点非常靠近单位圆时是否需要双精度设计长时间运行是否出现NaN或无穷值系数更新是否产生瞬态。定点实现还必须检查系数量化后的极点是否仍在单位圆内输入、输出和每节状态的最大范围累加器位宽各节增益和缩放定点实现不能只把浮点系数乘上一个比例后直接使用必须重新验证整个有限字长系统。十六、建议的验证流程完成实现后至少执行以下验证。1. 系数一致性确认实现使用的符号、归一化方式和系数顺序与设计工具一致。2. 冲激响应一致性输入使用同一组 SOS 系数分别获得高精度参考工具的冲激响应SOS DF-I 的冲激响应SOS DF-II Transposed 的冲激响应。检查各实现的输出是否在规定的数值容差内与参考结果一致。浮点运算顺序不同可能产生微小误差因此不要求逐位完全相同。这一步适合发现反馈系数符号错误系数排列或归一化错误状态读取和更新顺序错误SOS 节遗漏或状态错误。理想线性运算下SOS 节顺序不改变总响应实际定点或有限精度运算中顺序会改变内部动态范围和数值误差因此仍需合理排序。3. 频率响应验证通带增益截止频率阻带衰减峰值位置相位响应群时延。4. 极点检查对最终实际使用的量化系数重新求极点并确认所有实际极点严格位于单位圆内。5. 幅值与状态压力测试使用最大幅值直流通带最大增益附近的正弦接近共振频率的正弦阶跃输入随机噪声长时间连续数据。同时记录每个 SOS 节的输入、输出以及状态峰值。6. 分块一致性同一段数据分别采用整段一次处理 固定长度分块处理 不同长度随机分块处理在相同初始状态下结果应在数值精度允许范围内一致。十七、推荐的工程流程完整的工程路径可以压缩为确定采样率和滤波指标 → 选择 Butterworth、Chebyshev 等设计方法 → 生成零点、极点和整体增益 → 转换为 SOS → 保留工具给出的零极点配对、顺序与缩放 → 使用 DF-II Transposed 实现每个二阶节 → 正确管理每节、每通道的独立状态 → 验证频率响应、稳定性和内部数值范围除非有明确理由不建议把 SOS 展开为一个高阶多项式 → 使用高阶直接形式这会丢失 SOS 在数值稳定性上的主要优势。十八、本篇结论DF 结构解决的是单个 Biquad 内部怎样组织状态DF-I → 保存过去输入和过去输出 → 最直观 → 二阶需要四个状态 DF-II → 保存内部信号 w 的过去值 → 二阶只需两个状态 DF-II Transposed → 保存已经累积的输出贡献 → 二阶只需两个状态 → 常用于浮点 Biquad 和 SOSSOS 解决的是高阶 IIR 怎样可靠实现高阶 IIR → 分解为多个二阶节 → 每节保存独立系数和状态 → 信号依次通过全部节 → 通过配对、排序和缩放控制数值风险实际工程中最重要的不是记住所有结构推导而是掌握以下原则明确反馈系数的符号约定。使用归一化的 Biquad 系数。高阶 IIR 优先保留为 SOS。浮点 SOS 通常使用 DF-II Transposed。每个二阶节、每个通道保存独立状态。连续数据分块处理时不能清空状态。系数切换必须处理瞬态。对量化后的最终实现重新验证极点和频率响应。监控中间节和状态范围不能只观察最终输出。设计工具给出的 SOS 排序和缩放不应随意丢弃。介绍完这些后续会正式学习“怎样设计 IIR”。
返回列表