这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ADC采样滤波系列之滑动窗口滤波

共3条 1/1 1 跳转至

ADC采样滤波系列之滑动窗口滤波

院士
2026-08-20 18:18:07     打赏
ADC采样滤波系列之滑动窗口滤波

哲学上讲,世界万物都在不断变化之中,只有变化是不变的。ADC采样亦如此,只是我们仍然在追求一个更高阶的相对稳定而已。

ADC采样的原理限定了采样结果一定会在几个LSB范围内反复波动。在嵌入式系统开发的实现电路中,ADC采集到的原始电压值往往不是干净的。这种噪声来源复杂:电源纹波耦合(开关电源的高频噪声会耦合到信号链路)、数字电路串扰(外部干扰源EMI)、传感器自身热噪声、以及ADC固有的量化噪声,都会叠加在采样值上。

如果直接使用原始采样值,往往无法满足实际应用需求。例如在电池电压监测中,显示值频繁跳动会影响用户体验;在温度控制系统中,采样波动可能导致加热器控制逻辑误触发等。

在软件层面对ADC采样数据做滤波处理正是解决这类问题最基础方法,也是嵌入式研发人员的基本功之一。今天我来分享滑动窗口滤波算法原理与基于STM32F407的实战经验。

滑动窗口滤波的原理

滑动窗口滤波的核心思想是:维护一个固定长度的采样值队列,每次新采样值入队时,丢弃队列中最旧的那个值,然后对队列中所有值取算术平均作为本次滤波输出。

滑动窗口示意图

其数学表达式如下

$$ y[n] = \frac{1}{N}\sum_{i=0}^{N-1} x[n-i] $$

$$ N 为窗口大小,x[n] 为当前采样值,y[n] 为滤波输出 $$

窗口就像一段固定长度的历史记录,始终保留最近N次采样,输出的是这N次采样的平均值。新数据不断推入,旧数据不断移出,窗口随时间向前滑动,因此得名“滑动窗口”。

实战代码实现

搞定滑动窗口的原理与数学公式之后,接下来就是代码实现了。

#define WINDOW_SIZE 8   // 这个须为2的幂级数

typedef struct
{
  uint16_t buffer[WINDOW_SIZE];
  uint8_t index;
  uint32_t sum;
  uint8_t count;
} SlidingWindowFilter_t;

void SlidingWindow_Init(SlidingWindowFilter_t *filter)
{
  memset(filter->buffer, 0, sizeof(filter->buffer));
  filter->index = 0;
  filter->sum = 0;
  filter->count = 0;
}

uint16_t SlidingWindow_Update(SlidingWindowFilter_t *filter, uint16_t new_sample)
{
  // 移除旧值
  filter->sum -= filter->buffer[filter->index];

  // 存入新值
  filter->buffer[filter->index] = new_sample;
  filter->sum += new_sample;

  // 环形指针自增
  filter->index = (filter->index + 1) % WINDOW_SIZE;

  // 初始时,使用平均滤波
  if (filter->count < WINDOW_SIZE)
  {
    filter->count++;
  }

  return (uint16_t)(filter->sum / filter->count);
}

窗口WindowSize选择策略

窗口大小是滑动窗口滤波最关键的参数,直接影响平滑度与响应速度的平衡。

窗口大小平滑效果响应速度适用场景
4点轻度平滑快速快速变化的信号,如音频采样
8点中等平滑适中通用场景,如电压监测
16点较强平滑较慢缓慢变化的信号,如温度采集
32点强平滑高噪声环境下的慢变信号

选择原则

  • 信号变化越快,窗口应越小,避免引入过大滞后

  • 噪声越大,窗口应越大,保证足够的平滑效果

  • 窗口大小建议取2的幂次,便于用移位替代除法

总结

滑动窗口滤波的优点明显:

  • 实现简单:代码逻辑清晰,易于理解和维护

  • 计算开销可控:只需维护一个累加和,每次更新仅做一次减法和一次加法

  • 平滑效果稳定:对高斯白噪声有良好的抑制效果

  • 内存占用确定:缓冲区大小固定,不会动态增长

但其不足也要注意:

  • 对脉冲干扰敏感:单个异常值会留在窗口中影响多个输出周期

  • 存在固定滞后:窗口越大,对阶跃信号的响应越慢

  • 无法区分信号突变与噪声:真实的信号跳变也会被平滑掉

滑动窗口滤波适合噪声以随机波动为主、对脉冲干扰不敏感的场景。如果环境中存在明显的脉冲噪声,建议结合中值滤波使用,先用中值滤波剔除异常值,再用滑动窗口平滑随机噪声。

欢迎大家关注我,我是你们的老朋友jobs





关键词: 采样     滤波     滑动窗口    

高工
2026-08-20 19:40:40     打赏
2楼

加了个sum参数,减少了计算次数,这思路不错


院士
2026-08-21 14:34:14     打赏
3楼

学习了,谢谢分享。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]