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)

6.四种方法优缺点