第 4 章 FIR 滤波器 / FIR Filters

4.1 FIR 滤波器的定义

FIR(Finite Impulse Response,有限冲激响应)滤波器的冲激响应 $h[n]$ 只有有限个非零值

差分方程

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

系统函数:$H(z) = \sum_{k=0}^{M} h[k] , z^{-k}$,无反馈(分母为 1),本质稳定

FIR vs IIR

特性FIRIIR
稳定性总是稳定需要设计保证
相位特性可实现严格线性相位一般非线性
阶数通常较高较低
计算量较大较小

4.2 线性相位 / Linear Phase

线性相位保证所有频率分量延迟相同,信号波形不失真:

$$\angle H(e^{j\omega}) = -\alpha\omega + \beta \implies \tau_g = \alpha = \text{const}$$

对称条件

类型对称性长度适用
I 型偶对称,偶阶$M$ 偶所有类型
II 型偶对称,奇阶$M$ 奇不能高通
III 型奇对称,偶阶$M$ 偶微分器/希尔伯特
IV 型奇对称,奇阶$M$ 奇同 III 型

4.3 窗函数设计法

核心思想:构造理想冲激响应 → 窗函数截断 → 移位因果化。

$$h[n] = h_d\left[n - \frac{N-1}{2}\right] \cdot w[n], \quad n = 0, 1, \ldots, N-1$$

flowchart TD
    A["确定指标
ωc、过渡带宽、阻带衰减"] --> B["计算理想冲激响应 hd[n]"] B --> C["选择窗函数类型"] C --> D["确定窗长度 N"] D --> E["h[n] = hd[n-α]·w[n]"] E --> F["验证频率响应"] F --> G{"满足指标?"} G -- 是 --> H["设计完成"] G -- 否 --> D style A fill:#1565C0,color:#fff style E fill:#E65100,color:#fff style H fill:#228B22,color:#fff

4.4 常见窗函数对比

窗函数主瓣宽度最大旁瓣最小阻带衰减
矩形窗$4\pi/N$-13 dB21 dB
Hanning$8\pi/N$-31 dB44 dB
Hamming$8\pi/N$-41 dB53 dB
Blackman$12\pi/N$-57 dB74 dB
Kaiser ($\beta$可调)可变可变可调

Kaiser 窗:$w[n] = I_0(\beta\sqrt{1-(\frac{2n}{N-1}-1)^2}) / I_0(\beta)$,唯一可连续调节的窗。

4.5 频率响应分析

$$H(e^{j\omega}) = \sum_{n=0}^{M} h[n] , e^{-j\omega n}$$

FIR 极点全在 $z=0$(总稳定),零点最多 $M$ 个。线性相位 FIR 零点具有共轭+镜像双重对称。

4.6 等波纹设计 / Equiripple Design

Parks-McClellan 算法基于切比雪夫最佳一致逼近,使通带和阻带误差等波纹分布,给定阶数下性能最优。

1
2
3
4
from scipy.signal import remez
h = remez(numtaps=51,
          bands=[0, 800, 1200, 2000, 2400, 4000],
          desired=[0, 1, 0], fs=fs)

4.7 工程应用

四种基本滤波器

类型firwin 用法
低通firwin(N, fc)
高通firwin(N, fc, pass_zero=False)
带通firwin(N, [f1, f2])
带阻firwin(N, [f1, f2], pass_zero=False)

阶数估算(Kaiser)

$$N \approx \frac{A_s - 8}{2.285 \cdot \Delta\omega}$$

完整验证示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import numpy as np
from scipy.signal import firwin, freqz

fs = 44100; fc = 4000; N = 101
h_hann = firwin(N, fc, fs=fs, window='hann')
w, H = freqz(h_hann, worN=4096, fs=fs)

import matplotlib.pyplot as plt
plt.plot(w, 20*np.log10(np.abs(H)))
plt.axvline(fc, color='r', linestyle='--')
plt.xlabel('频率 (Hz)'); plt.ylabel('幅度 (dB)')
plt.ylim(-100, 5); plt.grid(True); plt.show()

小结

  • FIR 始终稳定,可实现严格线性相位
  • 窗函数法:简单直观,选窗控制衰减,选长控制过渡带
  • 等波纹法:给定阶数下最优
  • 工程工具:scipy.signal.firwin()remez()
  • 部署需考虑对称性优化、定点量化、多相分解