滤波入门:从零开始理解滤波

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,对应的 高斯权重矩阵(核) 可能是:

权重中心最大,远离中心的数值权重逐渐降低
  1. 将窗口内的数据与对应的高斯权重矩阵相乘。
  2. 计算所有数值的 加权平均,作为新的数据值。
  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.四种方法优缺点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值