1. 滤波基础:信号与噪声的概念、滤波的本质与分类、时域与频域基础
各位工程师朋友,咱们开始聊滤波。说实话,滤波这词儿在咱们这行天天挂嘴边,但真要把它讲透,得从最根儿上的概念说起。我做了十几年信号处理,见过太多人上来就调参数,结果噪声没滤掉,信号先废了。所以这一章,咱们把地基打牢。
1.1 信号与噪声:一对冤家
信号是什么?说白了,就是你想从系统里提取的有用信息。比如传感器测的温度、麦克风收的语音、雷达回波里的目标距离。噪声呢?就是所有你不想要的、干扰你提取信息的乱七八糟的东西。
核心观点:滤波的本质,就是在信号和噪声之间做取舍。你不可能把噪声全干掉,只能让信号尽量干净。
我在项目中遇到过一件事:一个振动监测系统,传感器采集的数据里有个50Hz的尖峰。客户非说是设备故障,我一看波形——嗯,典型的工频干扰。加个陷波器就解决了。你看,不认识噪声的“长相”,就容易误判。
噪声的种类很多,我习惯把它们分成几类:
- 热噪声:电阻里电子热运动产生的,白噪声的一种。躲不掉,只能靠滤波压。
- 工频干扰:50Hz/60Hz的交流电串扰。我见过最离谱的案例,是信号线跟电源线绑在一起走的,那波形简直没法看。
- 量化噪声:ADC采样时精度不够带来的。你想想看,12位ADC和16位ADC,量化噪声差了一个数量级。
- 冲击噪声:突然的尖峰,比如电机启动、开关切换。这种噪声最烦人,因为它能量大、频带宽。
| 噪声类型 | 频域特征 | 常见来源 | 应对思路 |
|---|---|---|---|
| 热噪声 | 全频段均匀分布 | 电阻、半导体 | 低通滤波 + 降低带宽 |
| 工频干扰 | 集中在50/60Hz | 电源线、地环路 | 陷波器 + 屏蔽 |
| 量化噪声 | 近似白噪声 | ADC采样 | 提高分辨率 + 过采样 |
| 冲击噪声 | 宽频带、短时 | 开关动作、静电 | 中值滤波 + 限幅 |
我的小习惯:拿到一个信号,先别急着设计滤波器。花5分钟看看时域波形和频谱,搞清楚噪声的“脾气”,再动手。这步省了,后面全是坑。
1.2 滤波的本质:不是“去掉”,而是“选择”
很多人觉得滤波就是把噪声去掉。这个说法不准确。滤波的本质,是根据频率选择性地保留或衰减信号成分。你想想看,一个低通滤波器,它只是让低频通过、高频衰减,并不是把高频“删掉”了——它只是把高频的能量压低了。
我记得刚入行时,带我的老工程师说过一句话:“滤波器是个筛子,不是个垃圾桶。” 这句话我记到现在。筛子只让小于筛孔的东西过去,大的留在上面;滤波器只让特定频率的成分通过,其他的被衰减。但衰减不等于消失,只是能量变小了。
滤波器的分类,我习惯从两个维度看:
按处理方式分
- 模拟滤波:用电阻、电容、电感、运放搭出来的电路。实时性好,但精度受元器件误差影响。我以前调一个四阶巴特沃斯低通,电容值差了5%,截止频率直接偏了10%。
- 数字滤波:在DSP、FPGA或MCU里用算法实现。灵活、精度高,但有延迟和计算量的问题。
按频率特性分
- 低通:让低频过,拦高频。最常用,比如去噪、平滑。
- 高通:让高频过,拦低频。比如去掉直流偏置、提取边缘。
- 带通:只让某个频段过。比如通信里的选频。
- 带阻:拦住某个频段,其他全放行。比如陷波器去工频干扰。
注意:数字滤波有个“预失真”的问题。你设计的数字滤波器,在离散域里是准确的,但映射到连续域时,频率响应会变形。尤其是IIR滤波器,双线性变换带来的频率弯曲,必须提前补偿。我曾经吃过这个亏,设计了一个截止频率100Hz的低通,仿真没问题,上板一测,实际截止频率只有92Hz。
1.3 时域与频域:看问题的两个角度
做滤波,离不开时域和频域这两个视角。我个人的理解是:时域告诉你“发生了什么”,频域告诉你“为什么发生”。
时域里,信号是随时间变化的曲线。你看到波形有毛刺、有抖动、有尖峰——这些都是直观的。但光看时域,你很难判断这些毛刺是哪个频率的噪声。
频域里,信号被分解成不同频率的正弦波叠加。傅里叶变换就是干这个活的。你看频谱,能一眼看出哪个频率的能量高、哪个频率有干扰。
举个例子:一个心电信号,时域上看,P波、QRS波、T波清清楚楚。但如果混入了50Hz工频干扰,时域波形上就是一堆细小的锯齿。你光看时域,可能觉得是基线噪声。但一拉频谱,50Hz处一个尖峰,真相大白。
一句话总结:时域是“表象”,频域是“本质”。做滤波设计,两个域都得看,缺一不可。
下面这张图,是我自己总结的滤波知识体系框架。它把信号、噪声、滤波分类、时频域分析串在了一起。你把它记在脑子里,后面学什么参数设计都不会迷路。
1.4 时域和频域的数学工具
做滤波设计,有几个数学工具你得会用。不用背公式,但得理解它们干了什么。
傅里叶变换
把时域信号变成频域信号。连续信号用傅里叶变换,离散信号用离散傅里叶变换(DFT)。实际工程里,我们用的都是快速傅里叶变换(FFT)。
我个人的习惯是:拿到一个信号,先做FFT看频谱。这步花不了几毫秒,但能帮你省下几小时的调试时间。
卷积
滤波的本质就是卷积。输入信号和滤波器的冲激响应做卷积,得到输出信号。时域的卷积等于频域的乘法——这个关系是滤波理论的基石。
频率响应
滤波器对不同频率的增益和相位变化。用幅频响应和相频响应来描述。设计滤波器,说白了就是设计它的频率响应形状。
一个实用技巧:用Python的scipy.signal.freqz可以快速画出数字滤波器的频率响应。我每次设计完滤波器,第一件事就是画幅频和相频曲线,确认截止频率、通带纹波、阻带衰减都达标了,再往下走。
# Python示例:画一个低通滤波器的频率响应
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 设计一个4阶巴特沃斯低通,截止频率0.2(归一化)
b, a = signal.butter(4, 0.2, 'low')
# 计算频率响应
w, h = signal.freqz(b, a)
# 画幅频响应
plt.figure()
plt.plot(w / np.pi, 20 * np.log10(abs(h)))
plt.xlabel('归一化频率 (×π rad/sample)')
plt.ylabel('幅度 (dB)')
plt.title('4阶巴特沃斯低通滤波器幅频响应')
plt.grid(True)
plt.show()
这段代码我用了不知道多少次。每次调参数,改一下截止频率和阶数,看曲线变化,心里就有数了。
1.5 避坑指南:新手最容易犯的三个错误
做了这么多年,见过太多人在滤波上栽跟头。我总结三个最常见的坑:
- 不看频谱就设计滤波器。 你都不知道噪声在哪个频段,怎么设计?我曾经有个同事,花了两天调一个带通滤波器,结果发现噪声根本不在通带里——白干了。
- 滤波器阶数越高越好。 错!阶数越高,相位延迟越大,系统稳定性越差。我见过一个项目,用了10阶IIR滤波器,信号是干净了,但相位扭曲得没法用。后来换成4阶,效果反而更好。
- 忽略采样率的影响。 数字滤波器的性能跟采样率直接相关。采样率太低,滤波器过渡带会变宽,甚至出现混叠。我建议采样率至少是信号最高频率的5倍以上。
特别提醒:IIR滤波器有稳定性问题。设计完一定要检查极点是否都在单位圆内。我曾经在FPGA上实现一个IIR滤波器,系数量化后极点跑到了单位圆外,输出直接发散。那次排查花了我整整一天。
好了,这一章的基础就这些。信号和噪声的概念、滤波的本质、时域和频域的分析方法——这些是后面所有参数设计方法的根基。你把这些吃透了,后面学什么截止频率选择、过渡带优化、阻带衰减设计,都会轻松很多。