我想用 C 语言实现一个四阶定点低通 IIR 滤波器(使用 Q15 算法),我将通过使用两级级联直接形式 II 双四阶滤波器来准备这个滤波器。
我在数字信号处理书籍上找到了无数的 C 实现和示例系数,但我发现它们在验证过程中都不可靠(它们会产生溢出,不会衰减预期的频率分量等)。
哪个 C 实现适合这个问题?而且,是否有任何样本系数来验证这个实现?
我想用 C 语言实现一个四阶定点低通 IIR 滤波器(使用 Q15 算法),我将通过使用两级级联直接形式 II 双四阶滤波器来准备这个滤波器。
我在数字信号处理书籍上找到了无数的 C 实现和示例系数,但我发现它们在验证过程中都不可靠(它们会产生溢出,不会衰减预期的频率分量等)。
哪个 C 实现适合这个问题?而且,是否有任何样本系数来验证这个实现?
尽管这似乎是一个非常简单的问题,但它需要一个非常复杂的答案。
我认为没有“一刀切”的解决方案。算法的最佳选择取决于您可以容忍的噪声和低通类型(陡度和频率)。例如,在 44.1 KHz 采样率下,4 阶巴特沃斯在 10 kHz 下是相当直接的,而在 100Hz 下的低通是非常痛苦的。本质上,这取决于您的极点与单位圆的接近程度。
IIR 滤波器的量化和舍入误差通常被传递到由仅极点传递函数加权的输出。一个 4 阶巴特沃斯 10 kHz 低通滤波器的最坏情况噪声放大仅为 5dB,所以这不是什么大问题。
然而,在 100 Hz 低通(同样是 4 阶 BW)下,噪声被放大了高达 75 dB。如果您使用 Q15 数学,您的基本本底噪声可能在 -100dB 左右。过滤后,您的信噪比将仅为 25 dB。
这就是定点 IIR 滤波器相当复杂的原因之一。如果您需要低截止频率和一半体面的信噪比,那么基本算法将不起作用。您需要研究双精度数学和/或误差谱整形或相关方法。