跳至内容
返回工具箱

二阶数字滤波器

低通、高通、带通、陷波的系数与 C 实现。

正在准备工具…

f0 与 Q

低通、高通在 Q=1/2Q=1/\sqrt{2} 时为 Butterworth 响应,f0f_0 是 −3 dB-3\,\mathrm{dB} 点。Q 增大,过渡区峰值升高。带通的中心增益为 0 dB0\,\mathrm{dB};陷波中心为 f0f_0。

系数采用 Audio EQ Cookbook 的 RBJ 公式,f0f_0 为数字频率,范围 0<f0<fs/20<f_0<f_{\mathrm s}/2。

H(z)=b0+b1z−1+b2z−21+a1z−1+a2z−2 H(z)=\frac{b_0+b_1z^{-1}+b_2z^{-2}}{1+a_1z^{-1}+a_2z^{-2}}

系数与实现

归一化 a0=1a_0=1。浮点版使用转置直接 II 型(DF2T),Q 定点版使用直接 I 型(DFI)。反馈项为 -a1*y、-a2*y;接入加反馈形式的库时,a1a_1、a2a_2 取反。

float、double、Q 定点可选,曲线与代码使用相同精度的系数。低频、高 Q 和深陷波对系数精度更敏感。

定点版逐项舍入乘积,以 int64_t 累加,最后饱和为 16 / 32 位样本;四个历史样本保持相同格式。系数量化后检查极点稳定性与通带增益。a1a_1 可能接近 −2-2,此时 Q1.15Q1.15 / Q1.31Q1.31 装不下,可选 Q2.14Q2.14 / Q2.30Q2.30,或减少小数位换取幅值余量。

定点导出共用 fl_q.h,完整源码、下载和编译示例见Q定点数C库。频响表示量化后的线性模型;饱和及极限环用时域模拟检查。

C 接口

每通道一个 Filter,以 fs 调用 filter_step()。filter_reset(&state, 0) 从零开始;传入首个样本值则初始化到对应直流稳态。

头文件实现单个二阶节。多节级联时,各节独立保存系数和状态。本站 EMA、滑动平均与 Biquad 使用同名 API,分别选用。