第 5 章 IIR 滤波器 / IIR Filters

5.1 IIR 滤波器的定义

IIR(Infinite Impulse Response,无限冲激响应)滤波器的核心特征是输出不仅依赖当前和过去的输入,还依赖过去的输出——即存在反馈回路。一旦激励消失,反馈机制使冲激响应理论上可以无限延续。

差分方程

IIR 滤波器的一般差分方程 (Difference Equation) 为:

$$y[n] = \sum_{k=0}^{M} b_k , x[n-k] - \sum_{k=1}^{N} a_k , y[n-k]$$

其中 $b_k$ 为前馈系数 (feedforward coefficients),$a_k$ 为反馈系数 (feedback coefficients),$M$ 和 $N$ 分别为分子和分母的阶数。

系统函数

对差分方程做 $z$ 变换,得到系统函数 (System Function):

$$H(z) = \frac{\sum_{k=0}^{M} b_k , z^{-k}}{1 + \sum_{k=1}^{N} a_k , z^{-k}} = \frac{B(z)}{A(z)}$$

$A(z)$ 的根构成系统的极点 (Poles)。系统稳定的充要条件是:所有极点位于单位圆内部($|p_k| < 1$)。

graph LR
    X["x[n]"] -->|"b₀"| SUM["Σ"]
    X -->|"b₁·z⁻¹"| SUM
    Y["y[n]"] -->|"a₁·z⁻¹"| SUM2["-Σ"]
    SUM2 --> SUM
    SUM --> Y
    style X fill:#2d5a88,color:#fff
    style Y fill:#2d5a88,color:#fff
    style SUM fill:#4a7c59,color:#fff
    style SUM2 fill:#8b4513,color:#fff

5.2 IIR 与 FIR 对比

特性FIRIIR
冲激响应长度有限($N$ 点)理论上无限
线性相位 (Linear Phase)✅ 可精确实现❌ 一般非线性
稳定性天然 BIBO 稳定需确保极点在单位圆内
实现相同指标的阶数较高较低
系数量化敏感度较低较高(极点位置敏感)
设计方法窗函数法、等波纹最优法模拟原型法

工程取舍:IIR 以非线性相位为代价换取更低阶数和更少计算量。在语音处理、生物信号等对相位要求不严的场景中,IIR 常是首选;而在数据通信、图像处理等要求线性相位的场景中,FIR 更合适。

5.3 模拟原型设计法

IIR 数字滤波器的主流设计路线是间接法

  1. 先设计满足指标要求的模拟滤波器($s$ 域)
  2. 通过映射变换将 $H_a(s)$ 转换为 $H(z)$($z$ 域)

为什么要绕道模拟域? 因为模拟滤波器的设计理论(Butterworth, Chebyshev 等)在 20 世纪已高度成熟,有封闭公式和设计表格可直接使用。而直接在数字域逼近任意幅度响应是一个困难得多的数学问题。

graph TD
    A["数字滤波器指标
ωp, ωs, Ap, As"] -->|"频率预畸变"| B["模拟指标
Ωp, Ωs"] B --> C["设计模拟原型
Ha(s)"] C -->|"双线性变换"| D["数字滤波器
H(z)"] style A fill:#2d5a88,color:#fff style B fill:#4a7c59,color:#fff style C fill:#4a7c59,color:#fff style D fill:#2d5a88,color:#fff

5.4 模拟低通滤波器原型

5.4.1 Butterworth(巴特沃斯 / 最平坦滤波器)

幅度响应:

$$|H_a(j\Omega)|^2 = \frac{1}{1 + \left(\frac{\Omega}{\Omega_c}\right)^{2N}}$$

特点:通带内单调下降,无波纹;过渡带最宽;在截止频率 $\Omega_c$ 处衰减恒为 $-3$ dB。

5.4.2 Chebyshev Type I(切比雪夫 I 型)

$$|H_a(j\Omega)|^2 = \frac{1}{1 + \varepsilon^2 , T_N^2!\left(\frac{\Omega}{\Omega_p}\right)}$$

其中 $T_N(\cdot)$ 为 $N$ 阶切比雪夫多项式。特点:通带内等波纹 (Equipripple),阻带单调下降。同指标下阶数低于 Butterworth。

5.4.3 Chebyshev Type II(切比雪夫 II 型 / 逆切比雪夫)

$$|H_a(j\Omega)|^2 = \frac{1}{1 + \left[\varepsilon^2 , T_N^2!\left(\frac{\Omega_s}{\Omega}\right)\right]^{-1}}$$

特点:通带单调下降,阻带等波纹。

5.4.4 Elliptic(椭圆滤波器 / Cauer 滤波器)

$$|H_a(j\Omega)|^2 = \frac{1}{1 + \varepsilon^2 , R_N^2!\left(\frac{\Omega}{\Omega_p}\right)}$$

其中 $R_N(\cdot)$ 为椭圆有理函数。特点:通带和阻带均等波纹,在四种原型中阶数最低,但过渡带特性最复杂。

原型对比

原型通带阻带同指标阶数过渡带陡度
Butterworth单调单调最高最缓
Chebyshev I等波纹单调中等中等
Chebyshev II单调等波纹中等中等
Elliptic等波纹等波纹最低最陡

工程建议:如果对波纹不敏感,优先选 Elliptic(最低阶数 = 最低计算量);如果需要平滑的通带响应,选 Butterworth。

5.5 双线性变换法

基本原理

双线性变换 (Bilinear Transform) 将 $s$ 平面映射到 $z$ 平面:

$$s = \frac{2}{T} \cdot \frac{z - 1}{z + 1}$$

其中 $T$ 为采样周期。该映射是一对一的,整个虚轴 $j\Omega$ 映射到单位圆,从根本上避免了脉冲响应不变法 (Impulse Invariance) 的频谱混叠问题。

频率预畸变 (Frequency Prewarping)

双线性变换引入了频率轴的非线性映射:

$$\Omega = \frac{2}{T} \tan!\left(\frac{\omega}{2}\right)$$

这意味着数字频率 $\omega$ 和模拟频率 $\Omega$ 之间不是线性关系。设计时必须先将数字指标"预畸变"到模拟频率,再设计模拟原型,这样经双线性变换映射回来的频率恰好落在目标位置。

1
2
3
4
5
6
7
# 频率预畸变伪代码
def prewarp(omega_digital, T):
    return (2.0 / T) * tan(omega_digital / 2.0)

# 使用
Omega_p = prewarp(omega_p, T)   # 预畸变后的通带边界
Omega_s = prewarp(omega_s, T)   # 预畸变后的阻带边界

为什么需要预畸变? 若直接用数字指标对应的线性模拟频率设计原型,经双线性变换后截止频率会发生偏移。预畸变通过"提前反向补偿"抵消这一非线性畸变。

5.6 IIR 滤波器的实现结构

同一种 $H(z)$ 可以用不同的信号流图 (Signal Flow Graph) 实现,数值性能差异显著。

5.6.1 直接 I 型 (Direct Form I)

分别实现 $B(z)$ 和 $1/A(z)$,需要 $M+N$ 个延迟单元。

5.6.2 直接 II 型 (Direct Form II / Canonical Form)

将 $B(z)$ 和 $1/A(z)$ 共享延迟单元,仅需 $\max(M, N)$ 个延迟单元。

问题:直接型将所有极点集中在一个高阶多项式中,系数量化误差可能导致极点漂移出单位圆——尤其在高阶时极不稳定。

5.6.3 级联型 (Cascade / Second-Order Sections)

将 $H(z)$ 分解为多个二阶节 (Biquad / SOS) 的级联:

$$H(z) = \prod_{i=1}^{K} \frac{b_{0i} + b_{1i} z^{-1} + b_{2i} z^{-2}}{1 + a_{1i} z^{-1} + a_{2i} z^{-2}}$$

优势:每个二阶节仅含一对共轭极点,系数量化敏感度大幅降低;可独立调整增益。

5.6.4 并联型 (Parallel Form)

将 $H(z)$ 部分分式展开为二阶节之和:

$$H(z) = C + \sum_{i=1}^{K} \frac{b_{0i} + b_{1i} z^{-1}}{1 + a_{1i} z^{-1} + a_{2i} z^{-2}}$$

优势:各支路并行计算,适合硬件实现;量化噪声各支路独立。

结构对比

结构延迟单元量化敏感度工程推荐
直接 I/II 型高(高阶危险)仅低阶可用
级联型 (SOS)最常用
并联型适合并行硬件

工程实践:绝大多数 DSP 库(MATLAB、SciPy)默认以级联二阶节 (SOS) 形式输出 IIR 滤波器系数。

5.7 工程应用

5.7.1 典型设计流程

graph TD
    A["确定滤波器指标
通带/阻带频率、衰减"] --> B["选择原型
Butterworth / Chebyshev / Elliptic"] B --> C["调用 scipy.signal 设计函数"] C --> D["转换为 SOS 形式"] D --> E["用 sosfilt 或 lfilter 滤波"] E --> F["验证频响与稳定性"] style A fill:#2d5a88,color:#fff style B fill:#4a7c59,color:#fff style C fill:#4a7c59,color:#fff style D fill:#4a7c59,color:#fff style E fill:#2d5a88,color:#fff style F fill:#8b4513,color:#fff

5.7.2 Python 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# ---- 设计指标 ----
fs = 1000          # 采样率 Hz
f_pass = 100       # 通带截止 Hz
f_stop = 150       # 阻带起始 Hz
A_pass = 1         # 通带最大衰减 dB
A_stop = 40        # 阻带最小衰减 dB

# ---- 方法一:Butterworth ----
order_b, Wn_b = signal.buttord(f_pass, f_stop, A_pass, A_stop, fs=fs)
sos_butter = signal.butter(order_b, Wn_b, btype='low', fs=fs, output='sos')

# ---- 方法二:通用 IIR 设计 ----
sos_ellip = signal.iirfilter(
    N=None, Wp=[f_pass], Ws=[f_stop], rp=A_pass, rs=A_stop,
    btype='low', ftype='ellip', fs=fs, output='sos'
)

# ---- 应用滤波 ----
t = np.arange(0, 1, 1/fs)
x = np.sin(2*np.pi*50*t) + 0.5*np.sin(2*np.pi*200*t)  # 50Hz + 200Hz
y = signal.sosfilt(sos_butter, x)

# ---- 验证频响 ----
w, h = signal.sosfreqz(sos_butter, worN=2048, fs=fs)
plt.semilogy(w, np.abs(h))
plt.axvline(f_pass, color='green', linestyle='--', label='通带边界')
plt.axvline(f_stop, color='red', linestyle='--', label='阻带边界')
plt.xlabel('频率 (Hz)'); plt.ylabel('增益')
plt.legend(); plt.title('Butterworth 低通频响')
plt.show()

# ---- 检查极点是否在单位圆内 ----
z, p, k = signal.sos2zpk(sos_butter)
print(f"最大极点半径: {max(abs(p)):.6f}")
assert max(abs(p)) < 1.0, "警告:存在不稳定极点!"

5.7.3 关键 API 速查

函数用途
signal.butter(N, Wn)Butterworth 滤波器设计
signal.cheby1(N, rp, Wn)Chebyshev I 型
signal.cheby2(N, rs, Wn)Chebyshev II 型
signal.ellip(N, rp, rs, Wn)椭圆滤波器
signal.buttord(wp, ws, …)自动计算 Butterworth 阶数
signal.iirfilter(N, Wp, …)通用 IIR 设计接口
signal.sosfilt(sos, x)SOS 级联滤波(推荐)
signal.sosfreqz(sos)SOS 频率响应
signal.sos2zpk(sos)SOS → 零极点增益(稳定性验证)

⚠️ 重要:始终使用 output='sos' 并配合 sosfilt() 而非 lfilter(b, a, x)。直接型传递函数在高阶时可能因浮点精度导致不稳定。

5.8 本章小结

  1. IIR 滤波器通过反馈实现无限冲激响应,以较低阶数实现陡峭过渡带,但一般不具备线性相位。
  2. 设计主流路线为模拟原型法:选择原型(Butterworth / Chebyshev / Elliptic)→ 频率预畸变 → 双线性变换。
  3. 双线性变换的频率预畸变是保证截止频率准确的关键步骤。
  4. 实现结构中,级联二阶节 (SOS) 是工程上最稳定、最推荐的形式。
  5. 工程实践中,始终验证极点位置($|p| < 1$),优先使用 sosfilt 而非直接型 lfilter

下一章:FIR 滤波器设计