滤波入门:从零开始理解滤波
滤波入门:从零开始理解滤波
滤波是信号处理中的一个重要概念,它的目的是去除数据中的噪声,提取有用的信息。本文将从零开始,详细介绍四种基本的滤波方法:均值滤波、中值滤波、指数滤波和高斯滤波。通过理论解释、数学公式、示例代码和优缺点对比,帮助读者理解滤波的基本概念和应用场景。
1. 什么是滤波?
滤波(Filtering)是信号处理中的一个重要概念,它的目的是去除数据中的噪声,提取有用的信息。在很多应用场景中(如传感器数据处理、室内定位、图像处理等),原始数据通常会受到外部环境的干扰,导致数据波动较大,影响后续计算和分析。滤波技术能够减少这些误差,使数据更加平滑、稳定、精准。
1.1 滤波的作用
- 去除噪声:减少数据中的随机波动,使信号更加稳定。
- 平滑数据:在轨迹计算、姿态估计等应用中,滤波可以消除突变点,使曲线更平滑。
- 提高定位精度:在 GNSS、UWB、WiFi、蓝牙等定位系统中,滤波可以减少信号的干扰,提高定位准确性。
- 优化传感器数据:如加速度计、陀螺仪的数据通常有噪声,滤波可以使数据更接近真实值。
2. 最简单的滤波:均值滤波
均值滤波(Mean Filtering)是最基础、最容易理解的滤波方法。
2.1 均值滤波的原理
它的基本思想是取某个时间窗口(或区域)内的数据的平均值,然后用这个均值代替当前值,从而减少数据中的高频噪声,使数据更平滑。
数学表达式
其中:
- N是窗口大小(如 3、5、7)。
- x(j) 是原始数据。
- y(i) 是滤波后的数据。
示例
假设有一组传感器数据: x=[10,12,14,50,16,15,14,13]
使用窗口大小 N=3 进行均值滤波:
- 未滤波数据(包含异常值 50):10,12,14,50,16,15,14,13
- 滤波后数据(50 被平滑):11,12,25.33,26.66,27,15,14,13
优点
✅ 计算简单,适用于大多数数据平滑场景。
✅ 在信号变化较平稳的环境下效果较好。
缺点
❌对突变噪声(如 50 这样的离群值)不够鲁棒,容易被极端值拉偏。
❌会导致信号延迟,特别是窗口变大时,滤波后的数据可能滞后于真实值。
3. 解决极端值问题:中值滤波
中值滤波(Median Filtering)是一种比均值滤波更鲁棒的方法,特别适用于有突变噪声的情况。
3.1 中值滤波的原理
与均值滤波不同,中值滤波不计算均值,而是取窗口内数据的中位数,这样就能有效去除突变噪声。
数学表达式
其中:
- median 表示取中位数,即排序后的中间值。
示例
假设原始数据: x=[10,12,14,50,16,15,14,13]
使用窗口大小 N=3 进行中值滤波:
窗口滑动计算如下:
- 未滤波数据(包含异常值 50):10,12,14,50,16,15,14,13
- 中值滤波后数据(50 被替换成相邻的中位数):10,12,14,16,16,15,14,13
优点
✅对突变噪声(如 50 这样的异常值)更鲁棒,不会像均值滤波一样被极端值影响。
✅适用于非正态分布数据(即数据分布不均匀的情况)。
缺点
❌无法平滑随机噪声,如果噪声是高斯分布(均匀分布的噪声),均值滤波可能更合适。
❌计算稍复杂,需要对窗口内数据排序。
4. 指数滤波(Exponential Filtering)
指数滤波(Exponential Filtering)是一种加权的均值滤波,它的特点是越新的数据权重越大,可以减少数据延迟的问题。
4.1 指数滤波的原理
在计算新数据点时,不是取简单平均,而是按照指数衰减赋予新数据更高的权重:
其中:
- α 是平滑因子(0 < α < 1),决定了新旧数据的权重:
- α 越大,新数据的影响越大,反应更灵敏。
- α 越小,平滑效果更明显,但数据更新较慢。
- x(i) 是当前数据,y(i−1) 是上一时刻的滤波值。
示例
设原始数据: x=[10,12,14,50,16,15,14,13] 取 α=0.3:
y(1)=10
y(2)=0.3×12+0.7×10=10.6
y(3)=0.3×14+0.7×10.6=11.62
优点
✅不会产生明显的信号延迟,比均值滤波快。
✅可以调整平滑因子 α\alphaα 来控制平滑程度。
缺点
❌对剧烈变化的数据仍然可能滞后,例如瞬间跳变的信号。
5. 高斯滤波(Gaussian Filtering)
高斯滤波(Gaussian Filtering)是一种更加平滑的滤波方法,它对数据的影响是基于高斯分布进行加权的。
5.1 高斯滤波的原理
- 计算方式类似均值滤波,但加权方式不同,使用高斯函数进行加权:
- 类似于均值滤波和中值滤波,高斯滤波也使用滑动窗口(通常为 3×3、5×5、7×7),但窗口内的数据加权不同。
- 权重由高斯函数决定,而不是简单的均值计算。
5.2 计算高斯加权值
窗口内的值并不是等权相加,而是根据高斯函数计算权重。
例如,窗口大小 N=3,对应的高斯权重矩阵(核)可能是:
权重中心最大,远离中心的数值权重逐渐降低。
- 将窗口内的数据与对应的高斯权重矩阵相乘。
- 计算所有数值的加权平均,作为新的数据值。
- 用计算出的新值替换窗口中心的原值。
5.3 具体示例
我们使用相同的窗口大小 3,原始数据:
x=[10,12,14,50,16,15,14,13]
第一步:选取窗口
- 例如在窗口[10, 12, 14]里,我们用高斯权重进行加权平均计算:
(10×0.06+12×0.098+14×0.06)/(0.06+0.098+0.06)
最终得到新的值**≈12**。
第二步:计算窗口内数据的高斯加权均值
对于包含50的窗口:
- 原始窗口:[12, 14, 50]
- 高斯加权后: (12×0.06+14×0.098+50×0.06)/(0.06+0.098+0.06)=16.7
为什么高斯滤波比均值滤波好?
- 减少异常值的影响
- 均值滤波 直接计算均值,容易被极端值拉偏,如 50 导致均值 25.33。
- 高斯滤波 给予中心点更高权重,使得 50 影响降低,最终数值只是 16.7,保留了更多的真实信息。
- 平滑效果更好
- 均值滤波 可能会导致数据突然变化,高斯滤波可以让数据平滑过渡,不会突变。
- 不会导致过度平滑
- 均值滤波 可能会导致细节信息丢失,而高斯滤波能够保留更多特征信息。
优点
✅效果比均值滤波更好,能去除高频噪声,同时保留信号的关键特征。
✅适用于图像、轨迹数据的平滑处理。
缺点
❌计算量比均值滤波大,不适用于对实时性要求较高的系统。
四种方法优缺点
代码实现
# 1. 均值滤波(Mean Filter)
def mean_filter(signal, window_size=3):
return np.convolve(signal, np.ones(window_size)/window_size, mode='same')
# 2. 中值滤波(Median Filter)
def median_filter(signal, window_size=3):
return np.array([np.median(signal[max(0, i - window_size//2): min(len(signal), i + window_size//2 + 1)])
for i in range(len(signal))])
# 3. 指数滤波(Exponential Filter)
def exponential_filter(signal, alpha=0.3):
filtered = np.zeros_like(signal)
filtered[0] = signal[0] # 初始化第一个值
for i in range(1, len(signal)):
filtered[i] = alpha * signal[i] + (1 - alpha) * filtered[i - 1]
return filtered
# 4. 高斯滤波(Gaussian Filter)
def gaussian_filter(signal, sigma=1):
return gaussian_filter1d(signal, sigma)