4. 数字滤波器设计基础(一):FIR与IIR滤波器原理、频率响应、群延迟
滤波器,说白了就是让某些频率通过,把另一些频率拦下来。做去噪算法,这步绕不开。
我记得刚入行那会儿,总觉得滤波器就是个黑盒子,输入输出就完事了。直到有一次做音频去噪,选错了滤波器类型,结果噪声是滤掉了,但语音信号也变得面目全非。嗯,从那以后我老老实实把原理啃了一遍。
这一章我们重点聊两个主角:FIR(有限脉冲响应)和IIR(无限脉冲响应)。它们原理不同,脾气也不同,选对了事半功倍。
4.1 从差分方程说起
数字滤波器本质上就是个差分方程。你给它一个输入序列,它按照规则算出输出序列。
通用形式长这样:
y[n] = b0·x[n] + b1·x[n-1] + ... + bM·x[n-M]
- a1·y[n-1] - a2·y[n-2] - ... - aN·y[n-N]
这里有个关键区别:
- 如果所有 a 系数都是 0,那就是 FIR 滤波器。输出只依赖当前和过去的输入。
- 如果存在非零的 a 系数,那就是 IIR 滤波器。输出不仅依赖输入,还依赖过去的输出。
这个差异,决定了它们所有的行为特征。
4.2 FIR 滤波器:稳定,但代价高
FIR 滤波器最大的优点就四个字:线性相位。
什么叫线性相位?说白了就是不同频率的信号经过滤波器后,延迟时间是一样的。这在去噪场景里特别重要——你不会把信号的波形形状搞歪。
我在项目中遇到过一个问题:用 IIR 滤波器做心电信号去噪,结果 QRS 波群的位置发生了偏移,医生直接说数据不可用。后来换成 FIR,问题就解决了。
FIR 的代价呢?阶数高。要达到同样的陡峭程度,FIR 需要的阶数往往是 IIR 的 5~10 倍。这意味着更多的乘法器和寄存器,面积和功耗都上去了。
关键指标:
- 相位特性:线性相位(严格)
- 稳定性:稳定(没有极点)
- 硬件代价:高(阶数大)
- 群延迟:常数
4.3 IIR 滤波器:高效,但小心相位
IIR 滤波器最大的优势是效率高。用很低的阶数就能实现很陡的过渡带。为什么?因为它有反馈,相当于把能量"循环利用"了。
但代价也很明显:
- 相位非线性:不同频率的延迟不一样,信号波形会失真。
- 稳定性问题:反馈系数设计不好,滤波器可能振荡甚至发散。
- 有限字长效应敏感:定点实现时,量化误差可能被反馈放大。
我曾经在一个语音降噪项目里用 IIR 滤波器,仿真跑得好好的,上 FPGA 就炸了。查了两天才发现是定点化后极点漂移到了单位圆外。嗯,这个坑我印象很深。
避坑指南:IIR 滤波器在 RTL 实现时,一定要做极点位置敏感性分析。我曾经因为忽略了这个,导致芯片回来滤波器自激振荡,整个项目延期两个月。
4.4 频率响应:看滤波器"长什么样"
频率响应就是滤波器对不同频率信号的"态度"。通常用两个维度描述:
| 指标 | 含义 | 单位 |
|---|---|---|
| 幅频响应 | 各频率通过后的幅度变化 | dB |
| 相频响应 | 各频率通过后的相位偏移 | 弧度或度 |
设计滤波器时,我们通常先定幅频响应的指标:通带纹波、阻带衰减、过渡带宽度。相频响应往往是被忽略的,但在去噪算法里,它恰恰很关键。
你想想看,如果滤波器把噪声滤掉了,但把有用信号的相位搞乱了,那后续处理(比如峰值检测、波形匹配)就全废了。
4.5 群延迟:信号失真的"元凶"
群延迟的定义是相位对频率的负导数:
τ(ω) = -dφ(ω)/dω
翻译成人话:群延迟表示不同频率分量通过滤波器的时间差。
- FIR 滤波器:群延迟是常数(等于 (N-1)/2 个采样周期),所有频率延迟一样,波形不变。
- IIR 滤波器:群延迟随频率变化,低频和高频走得不一样快,波形必然失真。
我在做雷达信号处理时,对群延迟特别敏感。目标回波的形状稍微变一点,测距精度就受影响。那时候我们团队定了个规矩:凡是涉及波形保真度的模块,一律用 FIR。
实用建议:如果你的应用场景对波形形状有要求(比如生物医学信号、音频、雷达),优先考虑 FIR。如果只关心幅度(比如简单的电平检测),IIR 更划算。
4.6 FIR vs IIR:一张表说清楚
| 对比项 | FIR | IIR |
|---|---|---|
| 相位特性 | 线性相位(严格) | 非线性相位 |
| 群延迟 | 常数 | 频率相关 |
| 稳定性 | 稳定 | 需设计保证 |
| 阶数需求 | 高 | 低 |
| 硬件资源 | 多 | 少 |
| 有限字长敏感度 | 低 | 高 |
| 设计复杂度 | 简单(窗函数法) | 中等(模拟原型映射) |
4.7 本章知识体系
下面这张图把 FIR 和 IIR 的核心差异、设计要点、应用场景串起来了。我建议你把它存下来,以后做滤波器选型时对照着看。
这张图把 FIR 和 IIR 的核心差异、特性、适用场景都串起来了。做 RTL 设计前,先对着这张图想清楚你要什么,能省很多弯路。