一阶低通滤波(EMA)从假设到推导:为何有效、何时失效、如何选参

在各种机器人、传感、遥操作、VR 控制系统中,我们最常见的一类信号问题是——数据在抖动
不论是 IMU 姿态、机械臂角度,还是工业传感器输出,
你都会发现:值本身没错,但就是在高频地抖。
这种抖动的根源就是 高频噪声

而我们最经典的“平滑工具”,就是——一阶低通滤波(Exponential Moving Average, EMA)。

这篇文章将从噪声模型假设 → 理论推导 → 数学公式 → 工程直觉 → 适用与局限 → 实践实现
六个层面,完整讲清楚这条公式背后的原理。


一、噪声模型:为什么会需要一阶低通?

在工业、机器人或嵌入式系统中,常见的噪声类型包括:

噪声类型 来源 特性 对应频率
白噪声 / 电气干扰 模数转换、电源纹波 零均值、相邻采样独立 高频
量化噪声 ADC 精度不足 细微跳动、无偏性 高频
传感器抖动 IMU、编码器、压力传感器 高频抖动、随机波动 高频
通信抖动 UDP/TCP 报文延迟变化 时间抖动、数值随机 高频
温漂 / 偏置漂移 低质量传感器、外界温度 缓慢、系统性漂移 低频

👉 从频率角度看,
噪声主要集中在高频部分,而真实信号往往是低频平滑变化的。

此处“频率”在信号处理中,本质上描述的是

信号变化快慢的“节奏”或“密度”

  • 低频分量 → 变化缓慢,连续平滑(如温度、姿态角、位置趋势)。
  • 高频分量 → 变化剧烈、上下波动快(如随机电气噪声、抖动)。

而从时域到频域的转换,可通过傅里叶分解实现,此处仅对不太明确“频率”概念的,比如博主本人,做简单说明,详细转换不在此处展开,大致理解为什么噪声高频、真实低频即可。举个例子:

示例信号 表现 所属频率
体温(每秒变化0.01℃) 慢慢变 低频
手抖动加速度(每秒震动100次) 快速颤动 高频
机器振动叠加漂移 慢趋势+快波动 低频 + 高频混合

于是,我们希望构造一个滤波器,让它:

只保留信号中的低频部分(真实趋势),
抑制信号中的高频部分(随机抖动)。

这就是一阶低通滤波的出发点。


二、信号模型假设

我们假设观测到的信号为:
x[k]=s[k]+n[k] x[k] = s[k] + n[k] x[k]=s[k]+n[k]
其中:

  • s[k]s[k]s[k]:系统真实信号(低频变化);
  • n[k]n[k]n[k]:测量噪声(零均值、高频变化)。

基本假设如下:

假设 说明
零均值 E[n[k]] = 0(噪声不带偏移)
高频特性 n[k] 的变化速度远快于 s[k]
相邻独立 n[k] 与 n[k−1] 不相关
信号平滑 s[k] 在相邻采样间变化幅度较小

只要满足这四条,一阶低通滤波就非常有效。

三、一阶低通滤波的思路

假设我们每次采样都拿到一个新值 x[k]x[k]x[k]
但我们不想完全相信它,而是希望融合历史趋势 y[k−1]y[k-1]y[k1] 来得到一个更稳定的输出 y[k]y[k]y[k]

于是我们写出最朴素的加权形式:
y[k]=αx[k]+(1−α)y[k−1] y[k] = αx[k] + (1 - α)y[k-1] y[k]=αx[k]+(1α)y[k1]
其中:

  • y[k]y[k]y[k]:滤波后的输出
  • x[k]x[k]x[k]:当前输入(含噪声)
  • α∈(0,1)α \in (0,1)α(0,1):平滑系数(也叫滤波系数)

这条简单的递推公式,就是一阶低通滤波器(EMA)

但它不是凭空来的,而是有三种严谨的推导来源。
我们接下来一步步看清楚——为什么它科学、为什么它有效。

四、从不同角度推导一阶低通滤波

这一节是整篇文章的核心:
你将看到三种推导路径,它们分别来自统计学、物理系统、频域滤波三种思想。


(1)统计角度:最小化均方误差的加权估计

问题设定(最简单的一维线性融合)

把上一步的平滑结果 y[k−1]y[k-1]y[k1] 视作对 s[k]s[k]s[k]先验估计,其误差为
ep=s[k]−y[k−1]e_p = s[k]-y[k-1]ep=s[k]y[k1],记方差 P=Var(ep)P=\mathrm{Var}(e_p)P=Var(ep)
测量方程 x[k]=s[k]+n[k]x[k]=s[k]+n[k]x[k]=s[k]+n[k],噪声方差 R=Var(n[k])R=\mathrm{Var}(n[k])R=Var(n[k])

在两者之间做线性加权:
y[k]=a x[k]+(1−a) y[k−1],a∈(0,1) y[k]=a\,x[k]+(1-a)\,y[k-1],\quad a\in(0,1) y[k]=ax[k]+(1a)y[k1],a(0,1)
目标:aaa 最小化均方误差 MSE=E[(y[k]−s[k])2]\mathrm{MSE}= \mathbb{E}[(y[k]-s[k])^2]MSE=E[(y[k]s[k])2]

展开误差:
y[k]−s[k]=a(s[k]+n[k])+(1−a)y[k−1]−s[k]=(a−1)s[k]+(1−a)y[k−1]+an[k]=(a−1)(s[k]−y[k−1])+an[k]=(a−1)ep+an[k] \begin{aligned} y[k]-s[k] &= a(s[k]+n[k])+(1-a)y[k-1]-s[k] \\ &= (a-1)s[k] + (1-a)y[k-1] + a n[k] \\ &= (a-1)(s[k]-y[k-1]) + a n[k] \\ &= (a-1)e_p + a n[k] \end{aligned} y[k]s[k]=a(s[k]+n[k])+(1a)y[k1]s[k]=(a1)s[k]+(1a)y[k1]+an[k]=(a1)(s[k]y[k1])+an[k]=(a1)ep+an[k]
取方差(独立&零均值)

注意此处要满足:

(A)n[k]n[k]n[k]epe_pep 相互独立
(B)二者都是 零均值随机变量
(C)其方差分别为 R=Var(n[k])R = \mathrm{Var}(n[k])R=Var(n[k])P=Var(ep)P = \mathrm{Var}(e_p)P=Var(ep),且为常数或平稳可估计

有了这三个假设,才能写出:
MSE(a)=E[(a−1)2ep2+a2n[k]2]=(a−1)2P+a2R \mathrm{MSE}(a)=E[(a-1)^2 e_p^2 + a^2 n[k]^2] = (a-1)^2P + a^2R MSE(a)=E[(a1)2ep2+a2n[k]2]=(a1)2P+a2R
这一步如果噪声不独立或不零均值,就不能直接相加方差

一阶条件求极小:
ddaMSE=2(a−1)P+2aR=0  ⇒  a=PP+R \frac{d}{da}\mathrm{MSE}=2(a-1)P + 2aR = 0 \;\Rightarrow\; a=\frac{P}{P+R} dadMSE=2(a1)P+2aR=0a=P+RP
得到最优线性权重:
 y[k]=PP+R⏟αx[k]+(1−PP+R)⏟1−αy[k−1]  \boxed{\,y[k]=\underbrace{\frac{P}{P+R}}_{\alpha} x[k] + \underbrace{\Big(1-\frac{P}{P+R}\Big)}_{1-\alpha} y[k-1]\,} y[k]=α P+RPx[k]+1α (1P+RP)y[k1]

结论 :在“先验方差 PPP”与“测量噪声方差 RRR”条件下,最小均方误差的线性解就是 EMA,α=PP+R\alpha=\dfrac{P}{P+R}α=P+RP
直觉:测量越吵(RRR 大)→ α\alphaα 越小(更信历史);信号越可能变(PPP 大)→ α\alphaα 越大(更信新值)。

接着给出信号模型假设的必要性分析:

假设 作用 若不满足会怎样
零均值 (E[n]=0, E[e_p]=0) 让估计在均值上无偏(即 E[y]=E[s]) 若噪声有偏(非零均值),输出将产生系统性偏差,即滤波结果会“偏离真实值”
独立性 (E[e_p n]=0) 允许误差方差直接相加:Var(ae_p + bn)=a²Var(e_p)+b²Var(n) 若相关,交叉项 (2ab,\mathrm{Cov}(e_p,n)) 会导致最优权重失真,α 不再是 P/(P+R),甚至可能>1或<0
方差可定义且稳定 使得“权重”可解释为相对置信度 若噪声方差不稳定(时变或未知),α 失去统计意义,只能经验调参(自适应滤波才行)

实际情况可能的结果分析如下:

1、非零均值噪声(存在漂移)

假设 n[k]=0.1+w[k]n[k] = 0.1 + w[k]n[k]=0.1+w[k],即观测恒偏高。

结果:
滤波输出 y[k]y[k]y[k] 永远偏大约 0.1。
滤波“稳定”但不再正确——会形成长期漂移误差

这就是为什么单独对 IMU 做 EMA 会出现姿态慢慢偏移:噪声里混了偏置(bias)。


2、噪声与预测误差相关(系统误差未建模)

如果 n[k]n[k]n[k]epe_pep 有正相关(例如信号预测模型有残留误差、或传感器受状态相关噪声影响):
E[epn[k]]≠0 E[e_p n[k]] \neq 0 E[epn[k]]=0
则展开平方时会出现额外项:
MSE(a)=(a−1)2P+a2R+2a(a−1)Cov(ep,n[k]) \mathrm{MSE}(a) = (a-1)^2P + a^2R + 2a(a-1)\mathrm{Cov}(e_p,n[k]) MSE(a)=(a1)2P+a2R+2a(a1)Cov(ep,n[k])
最优解变为:
a=P−Cov(ep,n[k])P+R−2Cov(ep,n[k]) a = \frac{P - \mathrm{Cov}(e_p,n[k])}{P + R - 2\mathrm{Cov}(e_p,n[k])} a=P+R2Cov(ep,n[k])PCov(ep,n[k])
→ 如果协方差未知或符号不确定,a 的取值可能超出 (0,1),
导致滤波放大噪声或出现发散

这种情况在非线性系统或动态耦合系统中很常见,因此需要卡尔曼滤波显式维护协方差项。


3、噪声方差变化(时变或非平稳)

如果测量环境不断变化(例如 IMU 在震动中、或摄像头亮度突变),则 R 不再固定。
固定 α=const 的一阶低通无法动态响应,表现为:

  • 噪声变大时 → α 应该减小(信历史多)但没变 → 结果输出抖动;
  • 噪声变小时 → α 应该增大(信当前多)但没变 → 输出滞后。

这时就需要自适应低通滤波(adaptive EMA),或者让 α 随时间或加速度变化动态调整。此处实现方法要根据实际问题做适配,因此不做过多概述。

综上所述,对于符合前面信号模型假设定义的噪声,可通过寻找协方差矩阵来确定 α 值,从而使均方误差最小。后续的两种理解需要一定基础,因此仅给出推导过程,以及在该种视角下如何确定 α 是合理的。


(2)物理角度:一阶惯性系统的离散化

1. 什么是一阶惯性系统?

这是物理系统中最常见的一种动态形式:

“系统不会立刻响应输入,而是逐渐跟随。”

典型例子:

  • 电路中的 RC 滤波器;
  • 水箱液位对进水量的响应;
  • 机械臂的末端跟随目标点的动作。

其连续时间方程为:
τdy(t)dt+y(t)=x(t) τ \frac{dy(t)}{dt} + y(t) = x(t) τdtdy(t)+y(t)=x(t)
其中:

  • τ:系统时间常数,决定了“反应速度”;
  • x(t):输入信号;
  • y(t):输出信号。

这方程的意思是:

输出不会立刻等于输入,而是以一定惯性(τ)缓慢逼近。


2. 离散化得到数字滤波公式

假设采样周期为 Δt,
连续系统每 Δt 秒更新一次。
用零阶保持(ZOH)离散化,可得:
y[k]=e−Δt/τy[k−1]+(1−e−Δt/τ)x[k] \boxed{y[k] = e^{-Δt/τ}y[k-1] + (1 - e^{-Δt/τ})x[k]} y[k]=eΔt/τy[k1]+(1eΔt/τ)x[k]
定义:
α=1−e−Δt/τ α = 1 - e^{-Δt/τ} α=1eΔt/τ
于是:
y[k]=αx[k]+(1−α)y[k−1] \boxed{y[k] = αx[k] + (1 - α)y[k-1]} y[k]=αx[k]+(1α)y[k1]
👉 意义:

  • τ 越大(系统更“重”)→ α 越小 → 平滑更强;
  • τ 越小(系统更“轻”)→ α 越大 → 反应更快。

这说明 EMA 完全对应于一个物理上一阶惯性响应系统

所以这不是凭空定义,而是物理上最自然的平滑过程。

3.小算例

采样周期 Δt=0.01 s,若取 α=0.2:

  • α=1−e−Δt/τ\alpha = 1 - e^{-\Delta t/\tau}α=1eΔt/ττ=Δt−ln⁡(1−α)≈0.0447\tau = \frac{\Delta t}{-\ln(1-\alpha)} \approx 0.0447τ=ln(1α)Δt0.0447 s

  • 截止频率 fc=12πτ≈3.56f_c = \frac{1}{2\pi\tau} \approx 3.56fc=2πτ13.56 Hz

  • 低频近似群时延(EMA 的等效滞后):
    delay≈1−αα Δt=0.80.2×0.01≈0.04 s \text{delay} \approx \frac{1-\alpha}{\alpha}\,\Delta t = \frac{0.8}{0.2}\times0.01 \approx 0.04\text{ s} delayα1αΔt=0.20.8×0.010.04 s


(3)频域角度:维纳滤波的工程近似

在信号的频率分解中:

  • 低频部分代表慢变化(例如姿态角缓慢变化);
  • 高频部分代表快速波动(例如抖动噪声)。

理想的“低通滤波器”应该让低频通过、高频被削弱。


⚙️ 维纳近似的含义

维纳滤波(Wiener Filter)是一种“最优线性滤波”,
它假设信号和噪声的功率谱已知,
最优滤波器的频率响应为:
H(ω)=Ss(ω)Ss(ω)+Sn(ω) H(ω) = \frac{S_s(ω)}{S_s(ω) + S_n(ω)} H(ω)=Ss(ω)+Sn(ω)Ss(ω)
其中:

  • Ss(ω)S_s(ω)Ss(ω):信号的能量分布;
  • Sn(ω)S_n(ω)Sn(ω):噪声的能量分布。

当噪声是白噪声(即 Sn(ω)S_n(ω)Sn(ω) 为常数),
而信号能量集中在低频,
则这个式子的形状恰好类似于:
H(ω)=11+jωτ H(ω) = \frac{1}{1 + jωτ} H(ω)=1+τ1
这就是一阶低通滤波器的频率响应形式。

于是我们就可以用简单的一阶递推式近似维纳滤波。
EMA 正是这种近似的时域实现形式


💡 四、公式物理含义与参数关系

最终我们得到的递推公式:
y[k]=αx[k]+(1−α)y[k−1] \boxed{y[k] = αx[k] + (1 - α)y[k-1]} y[k]=αx[k]+(1α)y[k1]
参数 α 的含义:

参数 解释 对应关系
α 平滑系数(0~1) 越大响应越快、越灵敏
τ 系统时间常数 α = Δt / (τ + Δt)
fc 截止频率 α = (2πfcΔt) / (1 + 2πfcΔt)

根据三种推导,理解实际中的工业需求,即可使用对应的关系来选择合适的参数。

同样此处也给出直觉理解:

α值 效果 场景
0.1 平滑、滞后大 传感器长期趋势提取
0.5 平衡 普通实时平滑
0.9 灵敏、抑噪弱 高动态姿态跟踪

图像示意如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图像对应代码如下:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 1️⃣ 生成信号
t = np.linspace(0, 5, 500)
true_signal = np.sin(2 * np.pi * 0.5 * t)           # 真实信号(0.5Hz)
noise = 0.4 * np.random.randn(len(t))               # 高斯噪声
x = true_signal + noise                             # 含噪信号

# 2️⃣ 定义一阶低通滤波
def ema_filter(signal, alpha):
    y = np.zeros_like(signal)
    y[0] = signal[0]
    for k in range(1, len(signal)):
        y[k] = alpha * signal[k] + (1 - alpha) * y[k - 1]
    return y

# 3️⃣ 计算不同 α 下结果
alphas = [0.2, 0.5, 0.9]
colors = ['#1f77b4', '#ff7f0e', '#2ca02c']
titles = [
    'α = 0.2:平滑强,延迟大',
    'α = 0.5:平衡,适中响应',
    'α = 0.9:灵敏快,噪声多'
]

# 4️⃣ 绘制三张独立图
for i, alpha in enumerate(alphas):
    y = ema_filter(x, alpha)
    plt.figure(figsize=(10, 4))
    plt.plot(t, x, color='gray', alpha=0.4, label='原始信号(含噪声)')
    plt.plot(t, y, color=colors[i], linewidth=2.5, label=f'滤波结果 α={alpha}')
    plt.xlabel('时间 (s)', fontsize=12)
    plt.ylabel('信号幅值', fontsize=12)
    plt.title(f'一阶低通滤波效果:{titles[i]}', fontsize=14)
    plt.legend(loc='upper right')
    plt.grid(True, linestyle='--', alpha=0.5)
    plt.tight_layout()
    plt.savefig(f'ema_alpha_{alpha}.png', dpi=200)   # 🔹自动保存为PNG文件
    plt.show()

🧠 五、核心滤波原理总结

EMA 本质上是一种低通权衡机制

  • 在时间域: 每次更新只让“新测量”影响一小部分结果;
  • 在统计意义上: 最小化估计方差;
  • 在物理意义上: 给信号加“惯性”;
  • 在频域意义上: 压制高频、保留低频。

所以,这个“看似简单的叠加公式”,其实隐含了统计优化 + 物理惯性 + 频谱选择 的三重依据。


🧩 六、适用条件与失效边界

条件 说明
噪声特性 零均值、近白、高频、相邻样本独立
信号特性 缓慢变化(低频)
系统需求 实时性强、计算量低、易实现
低频漂移 EMA 无法抑制温漂/偏置漂移
孤立毛刺 单次极值会污染若干采样,可先用中值滤波
强相关噪声 若噪声本身有低频特征,应改用卡尔曼或互补滤波

⚙️ 七、工程实现示例

def ema_filter(signal, alpha, y0=0.0):
    y = y0
    output = []
    for x in signal:
        y = alpha * x + (1 - alpha) * y
        output.append(y)
    return output

若你已知期望截止频率 fc(Hz)与采样周期 Δt:

alpha = (2 * np.pi * fc * Δt) / (1 + 2 * np.pi * fc * Δt)

📍 八、应用举例与原因

场景 噪声来源 一阶低通的作用
VR 手柄姿态 手抖 + IMU 噪声 平滑姿态数据,消除镜头抖动
机械臂关节角 编码器电气噪声 平滑控制输入,减少伺服震动
工业传感器 ADC 量化误差 提取长期趋势,抑制微抖

总结一句话:

它适合“信号慢、噪声快”的任何场景。


🔍 九、与卡尔曼滤波的关系

当你把一阶随机游走模型的卡尔曼滤波展开,会得到:
y[k]=y[k−1]+K(x[k]−y[k−1]) y[k] = y[k-1] + K(x[k] - y[k-1]) y[k]=y[k1]+K(x[k]y[k1])
这与 EMA 完全同形,其中 K ≈ α
因此,EMA 可以看作 稳态卡尔曼滤波在一维白噪声模型下的简化形式
当你知道过程噪声 Q 与测量噪声 R 时,
可以近似取:
α=QQ+R α = \frac{Q}{Q + R} α=Q+RQ


📘 十、总结

视角 关键词 对应解释
统计 最小化误差方差 平衡新数据与旧估计
物理 一阶惯性 输出带惯性,抗快变
频域 低通特性 保留低频,抑制高频
工程 计算极简 一行代码即可实时运行

📌 适合的信号:

高频噪声 + 低频趋势 的任何场景。

📌 不适合的信号:

低频漂移、极值毛刺、强相关噪声。


💬 结语

一阶低通滤波的核心不是“平均”,而是“信任的平衡”。
它让系统在稳定与响应之间找到最优解,
简单,但从未过时。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐