信号预处理技术:去均值与归一化、滑动平均滤波、中值滤波与去噪
各位同学,咱们今天聊点实在的。
信号预处理,说白了就是给原始信号“洗个澡”。你从传感器、采集卡或者任何地方拿到的信号,基本都带着“脏东西”——直流偏置、噪声、异常毛刺。不处理干净,后面做特征提取、模型训练,全是白搭。
我做了十几年信号处理,踩过的坑比你们走过的路还多。有一次,一个师兄拿了一组振动数据给我看,频谱分析怎么都找不到故障频率。我一看原始波形,直流分量大得离谱,归一化都没做。去掉均值之后,故障特征清清楚楚。嗯,从那以后,预处理成了我雷打不动的第一步。
核心观点:预处理不是可选项,是必选项。它决定了你后续分析的“地基”稳不稳。
1. 去均值与归一化
先说说去均值。这玩意儿最简单,但也最容易被忽略。
传感器输出的信号,往往叠加了一个固定的直流偏置。比如加速度计,静止时输出可能不是0V,而是2.5V。这个偏置对分析没意义,反而会压低有效信号的动态范围。
去均值的公式很简单:
x_centered = x - mean(x)
我个人习惯,拿到数据第一件事就是画个时域图,看看均值是不是在零附近。如果不是,二话不说,先减掉。
归一化呢,是为了让不同量纲的信号能放在一起比较。比如你同时采集了温度(0-100℃)和振动(±5g),如果不归一化,机器学习模型会天然“偏爱”数值大的特征。
常用的归一化方法有两种:
| 方法 | 公式 | 适用场景 |
|---|---|---|
| Min-Max归一化 | x_norm = (x - min)/(max - min) | 信号范围已知,且无异常离群点 |
| Z-score标准化 | x_norm = (x - mean)/std | 信号有噪声,或存在离群值 |
我的经验:做机器学习时,我几乎只用Z-score。Min-Max对离群点太敏感,一个异常尖峰就能把整个信号压扁。你想想看,本来正常的振动幅值,被一个毛刺一拉,全变成0.1以下了,这还学个啥?
2. 滑动平均滤波
滑动平均,也叫移动平均。它是时域滤波里最朴素、最有效的方法之一。
原理很简单:用当前点前后N个点的平均值,代替当前点的值。公式长这样:
y[n] = (1/N) * sum(x[n-k] for k in range(N))
说白了,就是拿一个“窗口”在信号上滑,窗口里的数据取个平均。
我在项目中遇到过一个问题:采集心电信号时,50Hz工频干扰特别严重。用滑动平均滤波,窗口长度选为采样率的1/50,也就是一个工频周期内的点数。效果立竿见影,工频干扰几乎被完全消除。
注意:滑动平均会带来相位延迟。窗口越长,延迟越大。如果你做的是实时控制,这个延迟可能是致命的。我曾经在一个电机控制项目里,用了50点的滑动平均,结果相位滞后导致系统振荡,差点烧了驱动器。
滑动平均的另一个问题是:它对脉冲噪声(比如传感器瞬间跳变)的抑制效果很差。为什么?因为一个大的脉冲,即使被平均了,还是会“污染”周围的好几个点。这时候,就该中值滤波上场了。
3. 中值滤波与去噪
中值滤波,顾名思义,用窗口内所有点的中位数代替当前点。
它的核心优势:对脉冲噪声、椒盐噪声有奇效。而且,它不会像滑动平均那样模糊信号的边缘。
y[n] = median(x[n-k], ..., x[n], ..., x[n+k])
举个例子:你有一段语音信号,中间有几个“咔咔”的爆音。用滑动平均,爆音会被抹开,变成一段“嗡嗡”的模糊声。用中值滤波,爆音直接消失,周围的语音几乎不受影响。
我建议,处理传感器数据时,如果发现信号里有明显的“毛刺”或“跳点”,优先尝试中值滤波。窗口大小一般选3、5、7,奇数就行。窗口太大,会把有用的细节也滤掉。
避坑指南:我曾经在一个振动监测项目里,直接用滑动平均去噪,结果把轴承故障的冲击特征给平滑掉了。后来换成中值滤波,故障特征保留得非常好。记住:去噪不是越干净越好,保留有用信息才是关键。
4. 知识体系总览
下面这张图,是我自己梳理的信号预处理知识框架。你可以把它当作一个“检查清单”,每次处理信号前,对照着走一遍。
这张图把三个核心方法串起来了。你从原始信号出发,根据噪声类型和后续需求,选择对应的预处理手段。去均值与归一化是“基础操作”,几乎每次都要做。滑动平均适合处理平稳噪声,中值滤波专治脉冲干扰。
我的建议:实际项目中,这三种方法经常组合使用。比如:先去均值,再中值滤波去毛刺,最后滑动平均平滑。但顺序很重要——先中值后平均,比先平均后中值效果好得多。你可以自己试试看。
好了,这一章的内容就到这里。预处理是信号处理的基本功,也是机器学习模型能否学到有效特征的关键。下一章,我们会深入频域,看看傅里叶变换是怎么把信号从时间轴搬到频率轴的。