FIR滤波器设计从指标到验证:窗函数与等波纹方法的完整指南

发布时间:2026/10/15 20:53:20
FIR滤波器设计从指标到验证:窗函数与等波纹方法的完整指南 数字滤波器系列写到第六篇前面几篇把 IIR、模拟原型、双线性变换、频响分析这些基础都过了一遍后台留言里最集中的问题反而回到了 FIR很多人说现成的设计函数一条命令就能出系数但真到了要自己动手设计一个 FIR 滤波器时阶数怎么定、窗怎么选、截止频率放在哪、为什么指标不达标心里还是没底。这篇就把 FIR 滤波器设计从头到尾拆开讲重点落在“每一步为什么要这么做”上。文章不需要你预先掌握多少高深数学只要知道采样率、截止频率、通带阻带这些基本概念就能跟下来我会把一个完整低通滤波器的设计过程一步步演算出来。1. 设计 FIR 前先把指标翻译成人话1.1 四个必填指标边界、波纹、衰减和过渡带不管用什么方法设计 FIR第一步永远是明确指标。工程上最常用的定义是这么一组采样率 Fs比如 48 kHz通带边界 fp希望信号完整保留的频率上限阻带边界 fs希望信号被压掉的频率下限通带波纹 Ap通带内幅度波动的允许值单位 dB阻带最小衰减 As阻带内必须压到的衰减量单位 dB过渡带宽度 Δf fs - fp介于通带和阻带之间的那段过渡区域。这组指标翻译成滤波器语言就是一句话在通带内尽量平、在阻带内尽量低、中间这段过渡带尽量窄。但这三件事是互拆的过渡带越窄需要的系数越多衰减要求越高窗函数就越要讲究波纹要求越严设计难度也越大。所以真正动手写代码之前先逼着自己把这几个数字写清楚后面所有设计参数都是从它们推导出来的。1.2 FIR 的线性相位优势从哪来FIR有限冲激响应滤波器之所以在很多领域不可替代核心是相位特性。只要系数满足对称性 h[n] h[N-1-n]FIR 就能实现严格线性相位也就是说滤波器对通带内所有频率引入的延迟是一个常数不会让不同频率成分到达的时间不一样。这个性质在音频信号对齐、通信解调、心电和脑电等生物电信号处理里极其宝贵因为波形形状本身可能就是诊断依据。另一个优势是稳定性。FIR 没有反馈结构冲激响应长度有限只要系数是有限值它就永远不会发散。IIR 滤波器在极点靠近单位圆时很容易因为系数量化或者计算截断而抖动甚至震荡FIR 在这方面的容错性就好得多。当然代价也很直接达到同样的衰减和过渡带指标FIR 通常需要比 IIR 多得多的系数这在硬件实现里意味着延迟、存储和乘法器资源的增加。1.3 阶数不是越高越好很多新手拿到指标后第一反应是把阶数往大了设觉得反正越精确越好。其实这是最常见的误区。FIR 的系数个数 N 与滤波器阶数 N-1 直接决定群延迟一个 N 系数的对称 FIR群延迟是 (N-1)/2 个采样周期。N 越大延迟越明显实时系统里可能直接导致“听起来变浑浊”或“控制回路滞后太多”。同时系数越多处理器每个采样点要做的乘加运算越多功耗和成本跟着涨。所以 FIR 设计本质上是一个优化问题在满足误差指标的前提下用尽可能少的系数去逼近理想频响。下面介绍的三种设计方法本质上就是解决这个问题的三条不同路线。2. 三类主流设计方法窗函数法、频率采样法、等波纹法2.1 窗函数法最容易下手的起点窗函数法也叫傅里叶级数法思路非常直观。理想低通滤波器在频域是一个矩形门它的冲激响应是一个无限长的 sinc 函数hd[n] sin(ωc(n - M)) / (π(n - M))其中 n ≠ Mn M 时取 ωc/π。这里 ωc 2πfc/Fs 是归一化截止频率M (N-1)/2 是滤波器的中心点。这个无限长的序列没法直接实现所以要截成有限长。直接截断等同于乘一个矩形窗会出现著名的吉布斯现象阻带衰减只能做到大约 21 dB。解决办法是用一个两边慢慢衰减的窗函数 w[n] 去截断让频谱的旁瓣压低h[n] hd[n] · w[n]这时的阻带衰减主要由窗函数的旁瓣高度决定过渡带宽主要由窗的主瓣宽度决定。不同窗的典型指标大致如下窗函数主瓣宽度(近似)最高旁瓣阻带衰减约值过渡带近似(N为系数个数)矩形窗4π/N-13 dB21 dB0.9/N汉宁窗8π/N-31 dB44 dB3.1/N海明窗8π/N-41 dB53 dB3.3/N布莱克曼窗12π/N-57 dB74 dB5.5/N凯泽窗可调可调可调由 β 和 N 决定窗函数法的优点是简单、可手算、代码写起来就是几行循环特别适合快速做原型验证。缺点是用同一扇窗同时处理通带波纹和阻带衰减自由度有限同样指标下需要的阶数往往比其他方法高。2.2 频率采样法适合任意幅频形状频率采样法的做法是把理想频响在单位圆上均匀取 N 个点直接做 IDFT 得到 N 个系数。这样设计出来的滤波器在采样点上的频响完全准确但采样点之间的频响不可控可能在两个采样点之间出现明显的凸起或凹陷。为了改善工程上会把过渡带里的几个采样点设成自由变量用优化方法去调整这就是“过渡带采样优化”的由来。这种方法今天用得不多但在两个场景里仍然有价值一是需要设计任意形状的幅频响应比如匹配滤波器、特殊整形滤波器二是频率采样点本身就有物理意义比如刚好要压掉某些特定频率的窄带干扰。通用低通、带通这类常规滤波器一般不会首选它。2.3 等波纹法用优化换最低阶数等波纹设计也叫切比雪夫逼近、Parks-McClellan 算法走的是另一条路不先定窗而是直接指定通带波纹、阻带衰减、边界频率让算法在允许的误差范围内把误差均匀铺开使最大误差最小化。得到的频响在通带和阻带里都是上下等幅波动的形状因此叫“等波纹”。它的最大优势是同指标下阶数最低。同样一组指标窗函数法可能需要 159 个系数等波纹法往往能压到 120 上下。这在硬件资源紧张、系数存储贵、乘法器数量有限的场景里很有吸引力。缺点是参数多要指定通带和阻带的权重还要小心选择边界频率设计经验不足的人容易把过渡带调得奇形怪状或者在边界附近出现意外的尖峰。设计方法优点缺点最适用场景窗函数法简单直观、公式可手算、快速原型阶数偏高、参数自由少快速验证、教学演示、资源不敏感频率采样法可设计任意幅频形状点间误差难控制、需优化过渡点任意频响、专用匹配滤波等波纹法指标相同时阶数最低参数多、边界和权重敏感硬件资源紧张、窄过渡带3. 实操一个 48kHz 低通 FIR 的完整设计过程3.1 把指标写成设计参数我们用一个具体例子把所有公式走一遍。假设要设计一个低通滤波器采样率 Fs 48 kHz通带 0 到 4 kHz阻带从 5 kHz 起通带波纹要求 1 dB阻带衰减至少 50 dB。先把频率折算成归一化值。截止频率取通带和阻带的中间点这是窗函数法的经验做法fc (fp fs) / 2 4.5 kHz这样理想低通的阶跃点正好落在过渡带中央通带边缘和阻带边缘能比较对称地逼近指标。归一化截止角频率ωc 2π · fc / Fs 2π · 4500 / 48000 ≈ 0.5890 rad/sample过渡带宽Δf fs - fp 1 kHz Δω 2π · Δf / Fs 2π · 1000 / 48000 ≈ 0.1309 rad/sample这个 Δω 是下面定阶数的关键。3.2 选窗和定阶数阻带要求 50 dB查窗函数表海明窗的阻带衰减约 53 dB正好够用汉宁窗只有 44 dB不够布莱克曼窗 74 dB 富余太多会浪费阶数。所以先选海明窗。阶数估算用经验公式N ≈ 3.3 / (Δf / Fs) 3.3 / (1000 / 48000) 158.4取 N 159。为什么取奇数因为对称系数 FIR 按长度和对称性分为四种线性相位类型奇数长度加对称系数对应 Type I频响在 0 到 Nyquist 之间没有天然约束最适合做普通低通。偶数长度 Type II 在 Nyquist 频率处天然有一个零点对“高频必须压掉”的应用来说没问题但为了通用和省心习惯上低通都取奇数长度。于是滤波器阶数就是 158群延迟是 (N-1)/2 79 个采样点在 48 kHz 采样率下对应 79/48000 ≈ 1.65 ms。这个数在选型阶段就得心里有数。3.3 生成理想冲激响应、加窗、归一化下面这段代码不依赖任何第三方库用标准数学函数就能跑翻译成 C 语言也只是一层循环from math import pi, sin, cos fs 48000.0 fc 4500.0 N 159 M (N - 1) / 2.0 wc 2.0 * pi * fc / fs h [] for n in range(N): if abs(n - M) 1e-12: hd wc / pi else: hd sin(wc * (n - M)) / (pi * (n - M)) w 0.54 - 0.46 * cos(2.0 * pi * n / (N - 1)) h.append(hd * w) s sum(h) h [v / s for v in h]这里有几个细节值得说明。第一n 刚好等于 M 时公式里是 0/0必须单独处理理想冲激响应在中心点的值是 ωc/π也就是 0.1875。第二海明窗系数用 0.54 - 0.46cos(2πn/(N-1)) 生成注意不是 0.5 - 0.5cos那是汉宁窗差了 4 个 dB容易搞混。第三最后归一化那一步特别重要把全部系数除以它们的和确保直流增益正好是 1。如果不做这一步整个滤波器的通带增益会偏后面验证的时候就会看到莫名其妙的整体衰减。3.4 频响验证设计完必须回头验指标系数算完不等于设计完必须算一次频响确认指标。简单做法是把 h 补零到 2048 点做 FFT横轴频率对应关系是 bin k 的频率 k / 2048 · 48 kHz。然后分两段检查通带 0 到 4 kHz 内幅度最大和最小的差值是否小于 1 dB阻带 5 kHz 到 24 kHzNyquist内幅度是否全部低于 -50 dB。海明窗 159 阶做这个例子实测通常阻带最差点在 -52 dB 到 -55 dB 之间通带波纹远小于 1 dB各项指标都能压住。如果验证发现阻带差一点到 -50 dB优先把 N 加一点比如 165 到 170再验一次。这比换窗更可控因为海明窗旁边瓣已经接近理论极限。还有一点要养成习惯不要只看幅度谱也要看群延迟。把相位对频率求导理想情况下应该是平的一条线数值约等于 79 个采样点。看到群延迟在通带内起伏很小才说明线性相位是真的。4. 进阶Kaiser 窗和等波纹设计到底怎么选4.1 Kaiser 窗的 beta 和阶数公式海明窗好用但只有一个窗型指标一变就得重新试。Kaiser 窗给了两个自由度阶数 N 控制过渡带宽形状参数 β 控制旁瓣高度也就是阻带衰减。β 越大旁瓣越低但主瓣也越宽。工程上按阻带衰减 A单位 dB来选 βA ≤ 21 时β 021 A ≤ 50 时β 0.5842·(A - 21)^0.4 0.07886·(A - 21)A 50 时β 0.1102·(A - 8.7)。阶数估算用N ≈ (A - 7.95) / (2.285 · Δω)回到我们的例子A 50Δω 0.1309代入得到 N ≈ (50 - 7.95) / (2.285 × 0.1309) ≈ 140.6取 141按第二条公式算 β ≈ 4.53。同样的指标海明窗要 159 阶Kaiser 只要 141 阶这就是多一个调节参数的收益。4.2 等波纹设计的工程取舍Kaiser 已经能省不少阶数但等波纹设计理论上才是阶数最低的。同一个低通指标等波纹设计通常能压到 120 阶左右这对大规模部署时节省每一路滤波器的乘法器非常关键。但是省阶数的代价是设计过程变麻烦要指定通带权重和阻带权重权重比不同结果差异很大边界频率如果卡得太死算法会在过渡带边缘给出一个极宽的“肩”反而把过渡带撑大。我的习惯是分两步走先用窗函数法在几分钟内拿到一个能跑的版本连上信号验证延时和频响都符合直觉再拿同一组指标去跑等波纹设计两边的结果互相对照。等波纹给出的阶数如果比窗函数法小太多反而要警惕是不是边界设得有问题而不是开心地直接用。4.3 一个常被忽略的细节线性相位类型对称 FIR 按 N 奇偶和对称方式分四类不同类的频响约束不同。Type IN 奇数对称最灵活普通低通带通都用它Type IIN 偶数对称在 Nyquist 频率有零点适合不需要 Nyquist 处响应的场合Type III 和 Type IV 是反对称零点分别在 0 频率和 Nyquist 频率专门用来做微分器和希尔伯特变换不能用来做普通低通。新手最容易犯的错是随手生成长度没审视的类型结果低频或高频响应被天然零点吃掉还以为是算法写错了。5. 避坑清单设计完不达标的典型场景5.1 阻带衰减不够先查窗再查阶数阻带衰减不达标是最常见的问题。如果用的是矩形窗几乎不可能做到 50 dB因为矩形窗旁瓣理论极限只有约 21 dB。这时候换窗是第一优先级海明窗、Kaiser 窗都能显著改善。如果已经是海明窗还差一点那再看阶数阶数太小会让过渡带太宽把阻带边界推远了。还有一个隐蔽原因截止频率 fc 没放在过渡带中间而是放在了通带边缘导致阻带边缘离理想阶跃点太远或太近衰减提前不够。5.2 通带增益不对先检查归一化设计完发现整个通带增益不是 0 dB 而是 -2 dB或者通带里出现明显波纹第一件事是算一下 sum(h)。理想低通加完窗之后如果没做归一化直流增益是 0.54 上下而不是 1频响整体就偏了。归一化就是把每个系数除以系数和一行代码的事。另外如果定点实现里为节省运算把系数缩放成一个固定整数别忘了在累加器里做匹配的补偿否则通带增益会跟设计值差得很稳定但就是不对。5.3 波形畸变先查对称性和类型线性相位靠的是系数对称只要在代码里顺手加一个断言检查 abs(h[n] - h[N-1-n]) 是否在容差之内就能排除 90% 的相位问题。如果系数不对称群延迟就不是常数波形自然会变形。另一种情况是滤波器的类型选错了比如用 Type III 做低通直流直接被零点干掉输出完全没有直流分量时域波形当然对不上。5.4 定点化以后性能劣化先看位宽和累加器浮点设计完美一量化到定点就劣化这也是高频问题。阻带衰减对系数精度最敏感通常 16 位系数能把 50 dB 的设计守到 45 dB 上下不够就要加位宽。另外累加器宽度也要算清楚N 个系数乘加位宽不够会溢出。工程上有个悲观的估计法则每个系数位宽减少 1 bit阻带衰减大约会恶化 6 dB所以真正的硬件设计一般不会卡着指标去选位宽而是留着余量。5.5 问题速查参考现象优先检查常见解决办法过渡带太宽阶数 N、窗型增大 N或换 Kaiser 窗阻带衰减不够窗的旁瓣水平换窗、增大 β、增加 N通带增益不对归一化、DC 增益除以 sum(h)波形畸变系数对称性检查 Type强制对称定点后劣化系数位宽、累加器宽度加位宽、加累加器余量最后分享一个小经验。我早期设计 FIR 的时候总想着一步到位直接上等波纹算法结果经常因为边界频率和权重设置不对拿到一个在频响图上很好看、一接真实信号就露馅的滤波器。后来改成固定的工作流窗函数法快速原型 → 粗略确认延时和边界 → 需要省资源时再换等波纹收敛阶数整个过程顺畅得多。另外无论设计工具给出的指标曲线多完美落地前一定记得拿一段真实的含噪信号过一遍。频谱上的数字和时域里的主观感受有时候真的是两码事。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询