经典滤波器设计:低通、高通、带通、带阻
滤波器设计,说白了就是给信号做「整形手术」。
我在刚入行那会儿,总觉得滤波器不就是把不要的频率砍掉吗?后来做高频数据降噪才发现,事情远没那么简单。你想想看,一个设计不当的滤波器,可能把有用信号也削掉一大截,或者引入奇怪的相位失真。
今天咱们就聊聊四种最基础的滤波器:低通、高通、带通、带阻。以及两种最经典的实现方式:巴特沃斯和切比雪夫。
四种滤波器的本质区别
先别急着看公式。咱们用大白话理解一下:
- 低通滤波器:让低频通过,砍掉高频。比如去掉传感器的高频噪声。
- 高通滤波器:让高频通过,砍掉低频。比如去掉心电信号中的基线漂移。
- 带通滤波器:只让某个频段通过。比如提取语音信号中的人声部分。
- 带阻滤波器:只砍掉某个频段。比如滤除50Hz工频干扰。
嗯,这里要注意:实际项目中,带阻滤波器往往比带通更难设计。为什么?因为你要精确地挖掉一个窄带,还不能影响旁边的频率。我曾经在电力监测项目中,为了滤除50Hz工频,折腾了整整两天。
巴特沃斯 vs 切比雪夫:怎么选?
这两种滤波器,是数字信号处理领域的老冤家。我个人的经验是:
| 特性 | 巴特沃斯 | 切比雪夫 |
|---|---|---|
| 通带平坦度 | 最平坦(无波纹) | 有波纹(I型通带波纹,II型阻带波纹) |
| 过渡带陡峭度 | 较缓 | 更陡(相同阶数下) |
| 相位响应 | 线性度较好 | 非线性更严重 |
| 适用场景 | 音频、生物信号 | 通信、需要锐截止的场景 |
说白了,如果你对信号波形保真度要求高(比如心电信号),选巴特沃斯。如果你只关心频率成分的有无,不介意一点点波纹,选切比雪夫。
核心原则:巴特沃斯保「形」,切比雪夫保「频」。
实战:用Python设计一个低通滤波器
咱们直接上代码。我习惯用scipy.signal库,它封装得很好。
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 设计参数
fs = 1000 # 采样率 1000Hz
fc = 100 # 截止频率 100Hz
order = 4 # 滤波器阶数
# 巴特沃斯低通
b_butter, a_butter = signal.butter(order, fc/(fs/2), btype='low')
# 切比雪夫I型低通(通带波纹0.5dB)
b_cheby, a_cheby = signal.cheby1(order, 0.5, fc/(fs/2), btype='low')
# 频率响应
w, h_butter = signal.freqz(b_butter, a_butter, worN=2000)
w, h_cheby = signal.freqz(b_cheby, a_cheby, worN=2000)
# 绘制对比
plt.figure(figsize=(10, 6))
plt.plot(w/np.pi*fs/2, 20*np.log10(abs(h_butter)), label='Butterworth')
plt.plot(w/np.pi*fs/2, 20*np.log10(abs(h_cheby)), label='Chebyshev I')
plt.axvline(fc, color='red', linestyle='--', label='Cutoff')
plt.legend()
plt.grid()
plt.show()
避坑指南:我曾经在阶数选择上吃过亏。阶数太高,计算量大不说,还会引入数值不稳定。一般4-6阶就够用了。除非你非要追求极致的陡峭度。
带通与带阻的设计要点
带通和带阻,其实就是低通+高通的组合。但要注意:
- 带通:指定两个截止频率(低端f1,高端f2),中间通过。
- 带阻:指定两个截止频率,中间被砍掉。
代码实现也很直接:
# 带通滤波器:100Hz - 200Hz
b_bp, a_bp = signal.butter(4, [100/(fs/2), 200/(fs/2)], btype='band')
# 带阻滤波器:砍掉 45Hz - 55Hz(工频干扰)
b_bs, a_bs = signal.butter(4, [45/(fs/2), 55/(fs/2)], btype='bandstop')
嗯,这里有个坑:带阻滤波器的阻带宽度不能太窄。我曾经试图用4阶滤波器滤除一个只有2Hz宽的窄带干扰,结果滤波器根本不起作用。后来把阶数提到8阶,才勉强有效。但代价是相位响应变得一塌糊涂。
知识体系图
下面这张图,是我自己总结的滤波器选型逻辑。你照着走,基本不会出错。
阶数选择的经验法则
阶数这东西,不是越高越好。我见过有人一上来就用10阶滤波器,结果信号延迟大得离谱,实时系统根本跑不起来。
我的经验是:
- 4阶:日常够用,相位失真可接受
- 6阶:需要更陡过渡带时
- 8阶以上:除非你真的很需要,否则别碰
警告:高阶滤波器在定点数实现时,容易出现数值溢出。如果你用嵌入式系统,建议先用浮点仿真,再转定点。
滤波器设计的常见误区
- 截止频率设得太靠近信号频率:我见过有人把低通截止频率设在信号频率的1.1倍,结果信号衰减了3dB。建议至少留2倍余量。
- 忽略相位响应:巴特沃斯虽然通带平坦,但相位非线性会扭曲波形。如果你做的是脉冲信号检测,建议用Bessel滤波器。
- 采样率不够高:滤波器设计时,截止频率不能超过采样率的一半(奈奎斯特定理)。但实际中,我建议截止频率不超过采样率的1/4,否则过渡带会很难看。
好了,关于经典滤波器设计,咱们就聊到这儿。记住一句话:没有最好的滤波器,只有最合适的滤波器。多试几次,找到那个平衡点。