一阶低通滤波到底滤掉了什么?从高频噪声到最优融合的全景解释
在机器人、工业控制与嵌入式系统中,传感器信号往往伴随高频噪声和随机抖动。一阶低通滤波(Exponential Moving Average, EMA)以极低计算量实现平滑输出,却常被视为“经验公式”。本文从统计、物理、频域三种视角系统推导 EMA 的原理,揭示其实质是最小均方误差估计、一阶惯性系统离散化及维纳滤波的近似形式。同时说明噪声假设、参数 α 的确定方法、延迟机理及自适应实现策略,并结合
一阶低通滤波(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[k−1] 来得到一个更稳定的输出 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[k−1]
其中:
- 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[k−1] 视作对 s[k]s[k]s[k] 的先验估计,其误差为
ep=s[k]−y[k−1]e_p = s[k]-y[k-1]ep=s[k]−y[k−1],记方差 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]+(1−a)y[k−1],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])+(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]
取方差(独立&零均值):
注意此处要满足:
(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[(a−1)2ep2+a2n[k]2]=(a−1)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(a−1)P+2aR=0⇒a=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−α
(1−P+RP)y[k−1]
结论 :在“先验方差 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)=(a−1)2P+a2R+2a(a−1)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+R−2Cov(ep,n[k])P−Cov(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[k−1]+(1−e−Δt/τ)x[k]
定义:
α=1−e−Δt/τ α = 1 - e^{-Δt/τ} α=1−e−Δt/τ
于是:
y[k]=αx[k]+(1−α)y[k−1] \boxed{y[k] = αx[k] + (1 - α)y[k-1]} y[k]=αx[k]+(1−α)y[k−1]
👉 意义:
- τ 越大(系统更“重”)→ α 越小 → 平滑更强;
- τ 越小(系统更“轻”)→ α 越大 → 反应更快。
这说明 EMA 完全对应于一个物理上一阶惯性响应系统。
所以这不是凭空定义,而是物理上最自然的平滑过程。
3.小算例
采样周期 Δt=0.01 s,若取 α=0.2:
-
由 α=1−e−Δt/τ\alpha = 1 - e^{-\Delta t/\tau}α=1−e−Δt/τ 得 τ=Δt−ln(1−α)≈0.0447\tau = \frac{\Delta t}{-\ln(1-\alpha)} \approx 0.0447τ=−ln(1−α)Δt≈0.0447 s
-
截止频率 fc=12πτ≈3.56f_c = \frac{1}{2\pi\tau} \approx 3.56fc=2πτ1≈3.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.01≈0.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+jωτ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[k−1]
参数 α 的含义:
| 参数 | 解释 | 对应关系 |
|---|---|---|
| α | 平滑系数(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[k−1]+K(x[k]−y[k−1])
这与 EMA 完全同形,其中 K ≈ α。
因此,EMA 可以看作 稳态卡尔曼滤波在一维白噪声模型下的简化形式。
当你知道过程噪声 Q 与测量噪声 R 时,
可以近似取:
α=QQ+R α = \frac{Q}{Q + R} α=Q+RQ
📘 十、总结
| 视角 | 关键词 | 对应解释 |
|---|---|---|
| 统计 | 最小化误差方差 | 平衡新数据与旧估计 |
| 物理 | 一阶惯性 | 输出带惯性,抗快变 |
| 频域 | 低通特性 | 保留低频,抑制高频 |
| 工程 | 计算极简 | 一行代码即可实时运行 |
📌 适合的信号:
高频噪声 + 低频趋势 的任何场景。
📌 不适合的信号:
低频漂移、极值毛刺、强相关噪声。
💬 结语
一阶低通滤波的核心不是“平均”,而是“信任的平衡”。
它让系统在稳定与响应之间找到最优解,
简单,但从未过时。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)