DSP复习指南 ## 🌟 欢迎来到第15讲:FIR数字滤波器设计 (对应课本第10章内容)
大家好!在前几讲,我们详细探讨了IIR滤波器的设计,那是一个"间接"且充满数学技巧的过程。今天,我们将转向另一大类重要的滤波器——FIR(有限冲激响应)滤波器。FIR的设计方法更加直接和直观,并且能轻易实现IIR难以企及的严格线性相位。
本讲的核心是窗函数设计法。我们将学习如何从一个"完美"的理想滤波器出发,通过"加窗"操作,在理想性能和物理可实现性之间做出优雅的权衡。我们还将深入理解加窗过程中不可避免的"副作用"——吉布斯现象,并学会如何选择不同的窗函数来抑制它。
核心学习目标:
- 掌握窗函数设计法:理解其核心思想——对理想滤波器的无限长冲激响应进行截断(加窗)。
- 理解吉布斯现象:明白吉布斯现象的成因(时域截断 ⇔ 频域卷积),以及其在截止频率附近产生固定超调的特性。
- 认识常用窗函数:熟悉矩形窗、汉宁窗、汉明窗、布莱克曼窗等常用窗函数的时域形状和频域特性(主瓣宽度 vs 旁瓣衰减)。
- 掌握设计流程:能够根据给定的滤波器指标(过渡带宽、阻带衰减),选择合适的窗函数并确定所需的滤波器阶数。
- 能够动手设计:通过具体示例,完整地走完从指标到最终FIR滤波器系数的计算全过程。
📚 本讲知识地图 #
graph TD
A["理想滤波器 H_d(e^jω)
(例如: 理想低通)"] --> B["理想冲激响应 h_d[n]
(IDTFT)"];
B -- "特性: 无限长、非因果" --> C{"问题: 物理不可实现"};
C --> D{"解决方案: 窗函数法"};
subgraph "窗函数设计法核心"
D -- "操作: 时域截断(加窗)" --> E["h[n] = h_d[n] * w[n]"];
E --> F["实际FIR滤波器 h[n]
(有限长、因果)"];
end
subgraph "频域视角:卷积效应"
A -- "频域卷积" --> G["H(e^jω) = H_d(e^jω) * W(e^jω)"];
G --> H["吉布斯现象 (Gibbs)
(纹波 & 过渡带)"];
end
subgraph "窗函数 w[n] 的选择"
W["窗函数 w[n]"] -- "频域特性" --> W_Spec["主瓣宽度 & 旁瓣衰减"];
W_Spec -- "决定" --> Filter_Perf["滤波器过渡带 & 纹波"];
W --> W_Rect["矩形窗 (Rectangular)"];
W --> W_Han["汉宁窗 (Hann)"];
W --> W_Ham["汉明窗 (Hamming)"];
W --> W_Black["布莱克曼窗 (Blackman)"];
W --> W_Kaiser["凯泽窗 (Kaiser) - 可调"];
end
I["设计指标
(Δω, α_s)"] --> J{"设计步骤"};
J --> K["1. 选窗函数 (据α_s)"];
J --> L["2. 确定阶数N (据Δω)"];
J --> M["3. 计算h_d[n] & 加窗"];
M --> F;
style D fill:#f9f,stroke:#333,stroke-width:2px
style J fill:#ccf,stroke:#333,stroke-width:2px
📝 本讲主要内容 #
1. FIR滤波器设计概述 #
- 回顾FIR特性:
- 优点:总是稳定、可实现严格线性相位。
- 缺点:为达到同等性能,阶数通常远高于IIR。
- 设计思路:与IIR不同,FIR滤波器设计不借助模拟原型,而是直接在数字域进行。最常用的方法就是窗函数法。
2. FIR滤波器设计的窗函数法 #
2.1 💡 理论背景:从"理想"到"现实" #
-
第一步:定义理想 我们从一个具有完美"砖墙"特性的理想滤波器频率响应 $H\_d(e^{j\omega})$ 出发。
-
第二步:求其冲激响应 通过逆傅里叶变换(IDTFT),得到理想滤波器的冲激响应 $h\_d[n]$。例如,理想低通滤波器的 $h\_d[n]$ 是一个Sinc函数。 $$ h_{LP}[n] = \frac{\sin(\omega_c n)}{\pi n}, \quad -\infty < n < \infty $$ 【图片:理想低通滤波器的Sinc函数形状冲激响应 (参考PPT P19)】

-
第三步:面对现实的困境 这个 $h\_d[n]$ 有两个致命问题:
- 无限长: 需要无限的存储和计算。
- 非因果: 对于 $n<0$ 不为零,需要预知未来。 因此,它物理不可实现。
-
第四步:窗函数的解决方案 最简单直接的解决方法就是"砍掉"远处的部分,只保留中间最重要的部分。这个"砍"的动作,在数学上就是将 $h\_d[n]$ 乘以一个有限长度的窗函数 $w[n]$。 $$ h[n] = h_d[n] \cdot w[n] $$ 最简单的窗就是矩形窗,它在 $[-M, M]$ 区间内为1,其余为0。
2.2 ⚠️ 吉布斯现象 (Gibbs Phenomenon) #
- 时域的乘积 ⇔ 频域的卷积 对 $h\_d[n]$ 加窗,在频域上等效于将理想的频率响应 $H\_d(e^{j\omega})$ 与窗函数的频谱 $W(e^{j\omega})$ 进行卷积。 $$ H(e^{j\omega}) = \frac{1}{2\pi} \int_{-\pi}^{\pi} H_d(e^{j\theta}) W(e^{j(\omega-\theta)}) d\theta $$
- 现象解读:
- 矩形窗的频谱 $W(e^{j\omega})$ 是一个Sinc函数,它有一个窄的主瓣和无穷多的旁瓣。
- 理想的"砖墙"响应与这个Sinc函数卷积后,原来的突变边缘会被"涂抹"开,形成一个过渡带(由主瓣宽度决定),并且在通带和阻带内产生涟漪般的波纹(由旁瓣引起)。
- 这种在不连续点附近产生的固定的、不会随窗长增加而消失的过冲(Overshoot)和振荡,就是吉布斯现象。对于矩形窗,这个过冲约为9%(约0.8dB)。
【图片:Gibbs现象示例图,展示矩形窗截断Sinc函数后,频响在截止频率附近的纹波和过冲 (参考PPT P23, P26, P27)】

- 如何改善吉布斯现象?
吉布斯现象的主要由它时域的长尾震荡引起。
- 频域: 在通带跟阻带之间设计一个光滑的过渡带,
- 时域: 选一个可调的窗,调整它主瓣跟旁瓣的面积关系 >消除做不到,只能减少。
2.3 🎨 常用窗函数及其性能 #
为了减小吉布斯现象,人们设计了各种形状更平滑的窗函数。它们以牺牲过渡带宽度(主瓣更宽)为代价,换取更大的旁瓣衰减(更小的纹波)。
| 窗函数 | 时域形状 | 主瓣宽度 (近似) | 最小阻带衰减(dB) | 特点 |
|---|---|---|---|---|
| 矩形 (Rectangular) | 平顶 | $\frac{4\pi}{N}$ | 21 dB | 过渡带最窄,纹波最大 |
| 汉宁 (Hann) | 余弦拱形,两端为0 | $\frac{8\pi}{N}$ | 44 dB | 性能适中,常用 |
| 汉明 (Hamming) | 抬高的余弦拱形 | $\frac{8\pi}{N}$ | 53 dB | 旁瓣衰减优于汉宁 |
| 布莱克曼(Blackman) | 更复杂的余弦组合 | $\frac{12\pi}{N}$ | 74 dB | 旁瓣衰减极大,过渡带宽 |
| 凯泽 (Kaiser) | 可调参数 | 可变 | 可变 | 最灵活,可根据指标精确设计 |
2.4 📝 窗函数法设计步骤 #
- Step 1: 确定理想滤波器 根据要求(低通/高通…),写出理想滤波器的频率响应 $H\_d(e^{j\omega})$ 及其冲激响应 $h\_d[n]$。确定截止频率 $\omega\_c$ (通常取通带和阻带频率的中心)。
- Step 2: 选择窗函数并确定滤波器长度M a. 根据最小阻带衰减 $\alpha\_s$ 的要求,从窗函数性能表中选择一个合适的窗函数 $w[n]$。 b. 根据过渡带宽 $\Delta\omega = \omega\_s - \omega\_p$ 的要求,利用所选窗函数的"过渡带与长度关系"公式,计算所需的滤波器半长度M(或总长N)。 $$ \Delta\omega \approx \frac{C}{M} \implies M \approx \frac{C}{\Delta\omega} $$ 其中C是与窗函数相关的常数(如矩形窗C≈2π,汉宁窗C≈4π)。
- Step 3: 加窗并实现因果化 a. 计算实际的FIR滤波器冲激响应:$h[n] = h\_d[n] \cdot w[n]$,范围是 $-M \le n \le M$。 b. 为了实现因果系统,将 $h[n]$ 整体右移M个单位:$\hat{h}[n] = h[n-M]$,范围是 $0 \le n \le 2M$。此时滤波器阶数为 $N=2M$。
3. 设计实例 #
【例1: 低通滤波器设计】 (参考PPT P39) * 指标: $\omega\_p=0.3\pi, \omega\_s=0.5\pi, \alpha\_s \ge 40\text{dB}$。
- 选窗: $\alpha\_s=40\text{dB}$,查表可知,汉宁窗(44dB)满足要求,且在满足条件的窗中主瓣最窄(过渡带最小),因此阶数最低。选择汉宁窗。
- 定长: * 过渡带宽 $\Delta\omega = 0.5\pi - 0.3\pi = 0.2\pi$。 * 汉宁窗的过渡带宽近似为 $3.11\pi/M$ (来自更精确的表格)。 * $M \ge \frac{3.11\pi}{0.2\pi} = 15.55$。向上取整,得 M=16。滤波器阶数 $N=2M=32$。
- 计算系数: * 理想截止频率 $\omega\_c = (0.3\pi+0.5\pi)/2 = 0.4\pi$。 * 理想冲激响应 $h\_d[n] = \frac{\sin(0.4\pi n)}{\pi n}$。 * 汉宁窗 $w[n] = 0.5 + 0.5\cos(\frac{2\pi n}{33}), -16 \le n \le 16$ (注意窗长是2M+1=33)。 * 最终因果冲激响应 $\hat{h}[n] = h\_d[n-16] \cdot w[n-16], 0 \le n \le 32$。
【例2: 高通滤波器设计】 (参考PPT P40) * 指标: $F\_p=1400\text{Hz}, F\_s=1200\text{Hz}, F\_T=4000\text{Hz}, \delta\_p=\delta\_s=0.01$。
- 指标转换: * $\alpha\_s = -20\log\_{10}(0.01) = 40\text{dB}$。 * $\omega\_p = 2\pi(1400/4000) = 0.7\pi$。 * $\omega\_s = 2\pi(1200/4000) = 0.6\pi$。
- 选窗定长: * $\alpha\_s=40\text{dB}$,选汉宁窗。 * $\Delta\omega = 0.7\pi - 0.6\pi = 0.1\pi$。 * $M \ge \frac{3.11\pi}{0.1\pi} = 31.1$。取 M=32。
- 计算系数: * 理想截止频率 $\omega\_c = (0.7\pi+0.6\pi)/2 = 0.65\pi$。 * 理想高通冲激响应 $h\_d[n] = \delta[n] - \frac{\sin(0.65\pi n)}{\pi n}$。 * 后续加窗和因果化步骤同上。
🔗 知识关联与应用 #
-
承上启下: 窗函数法是FIR滤波器设计最基础、最直观的方法。它的思想——通过某种方式逼近理想响应——贯穿于所有FIR设计技术中。虽然它不是最优的(在同等阶数下,其性能不如Parks-McClellan等优化算法),但其简单性和鲁棒性使其在许多场合仍然非常实用。
-
现实应用:
- 快速原型设计: 当需要快速设计一个性能要求不高的FIR滤波器时,窗函数法是最便捷的选择。MATLAB中的
fir1函数就是基于窗函数法实现的。 - 信号分析: 在频谱分析中,对数据段加窗(如汉宁窗、汉明窗)可以有效抑制频谱泄漏,提高频率分辨率。这背后的原理和我们今天学习的完全一样:时域加窗是为了改善频域特性。
- 快速原型设计: 当需要快速设计一个性能要求不高的FIR滤波器时,窗函数法是最便捷的选择。MATLAB中的
🤔 引导式提问 #
- 吉布斯现象告诉我们,简单地增加矩形窗的长度(即增加滤波器阶数N)并不能减小通带和阻带的纹波幅度。这是为什么?增加N到底改善了滤波器的什么性能?
- 给你两个窗函数,A窗的主瓣比B窗窄,B窗的第一旁瓣比A窗低。用这两个窗设计同阶数的低通滤波器,哪个滤波器的过渡带更窄?哪个滤波器的阻带衰减更大?这体现了滤波器设计中的什么核心权衡?
- 为什么在设计高通或带通滤波器时,我们仍然从理想低通滤波器的冲激响应Sinc函数出发,而不是直接使用它们各自复杂的理想冲激响应公式? (提示:思考设计流程的简化和统一性)
💡 本讲总结 #
今天,我们系统地学习了FIR滤波器设计的窗函数法,这是一个在理想与现实之间寻求最佳平衡的经典工程方法。 * 核心思想: 对无法实现的理想滤波器冲激响应 $h\_d[n]$ 进行加窗截断,得到一个有限长的、可实现的FIR滤波器 $h[n]$。 * 理论基础: 时域的乘法(加窗)等效于频域的卷积。 * 必然代价: 卷积效应导致了理想响应的"模糊",产生了过渡带和纹波(吉布斯现象)。 * 设计艺术: 通过选择不同的窗函数,我们可以在过渡带宽度(由主瓣宽度决定)和纹波大小(由旁瓣衰减决定)之间进行权衡。 * 设计流程: 这是一个标准化的"查表-计算"过程:根据阻带衰减选窗,根据过渡带定长,然后计算系数。
🔍 相关缩写 #
| 缩写 | 全称 | 中文含义 |
|---|---|---|
| FIR | Finite Impulse Response | 有限冲激响应 |
| IIR | Infinite Impulse Response | 无限冲激响应 |
| LPF | Low-Pass Filter | 低通滤波器 |
| HPF | High-Pass Filter | 高通滤波器 |
| SOS | Second-Order Sections | 二阶节 |