实时双二阶(biquad)IIR 滤波器,用纯 Kotlin 实现,不依赖第三方库,适用于音频回调中不能分配内存的场景。
用途 用于构建实时 IIR 滤波器:低通、高通,或由多个峰值(peaking)段组成的均衡器组,也可用于扫频滤波器、音调控制、分频等效果。每个双二阶只需五个系数,每通道四个状态值,逐样本计算无需分配内存。
主要能力 低通与高通使用 audio-EQ-cookbook(Robert Bristow-Johnson)标准公式,以 ω = 2π·fc/fs、α = sin(ω)/(2Q) 计算系数;峰值段使用增益相关公式,以 A = 10^(gainDb/40) 计算 b、a 系数并归一化。支持多级级联,每级拥有独立系数集与独立状态集。
使用方式与实现要点 系数计算后在缓冲区边界惰性重算,通过 @Volatile 脏标记由参数设置器触发,避免逐样本三角函数开销和跨线程写系数导致半套系数运行。归一化时先把原始 a0 存入局部变量再统一相除,不可就地按错误顺序覆盖。截止频率需钳制在 20 到(采样率/2−1)之间,超出会导致递归不稳定并溢出为 NaN,且 NaN 进入状态后会永久传播。
常见陷阱 每个通道必须有各自的四个状态值,左右声道共享 x1/x2/y1/y2 会造成串音与立体声像塌缩;级联 N 级需要 N 组状态,两级共享延迟线并非四阶滤波器。两个相同 Q=0.707 节级联在截止点约为 −6 dB,属 Linkwitz–Riley 形状,并非教科书四阶 Butterworth(后者需不同 Q 值且保持 −3 dB)。峰值滤波组中即使某段为 0 dB 也应保留恒等段,否则调整时数组尺寸变化会清空状态并产生咔嗒声;0 dB 时传递函数为恒等但并非逐位相同,可用数值验证。旁路、流变更、禁用或跳转等任何不连续处都应清空状态,reset() 只清状态不清系数。扫频应在对数域插值,避免线性扫频的听感突变。系数跨线程需 volatile,状态仅音频线程访问保持普通字段。
适用场景 适合在音频回调、实时音频处理、移动端音频应用等要求低延迟、无逐样本分配的环境中使用。
限制 资料未提供完整库、安装命令、支持平台与性能基准;示例均为代码片段和数学推导。代码正确性需自行通过资料给出的数值验证脚本和听感测试确认。