☰
指数移动平均与一阶低通滤波:一个递推式的两种视角
2026/9/25 7:59:42 网站建设 项目流程

“你到底是在做指数移动平均,还是在做一阶低通滤波?”这个问题我这两年反复被问到。搞数据分析的朋友把公式写在表格里,管它叫EMA,说历史权重按指数衰减;搞嵌入式或信号链路的同事在示波器上扫频,管同样的递推式叫一阶低通滤波,说要压制高频噪声。两边聊不到一起,但代码抄下来几乎一模一样,只是系数符号差了一层皮。这个现象很有意思,因为指数移动平均和一阶低通滤波本质上是同一个递推关系,只是从时间域和频率域两个角度描述同一件事。只要把这个关系看透,你在调平滑参数时就能同时用上“时间常数”和“截止频率”两套语言,工程上会顺手很多。

下面我按自己实际调参和排查问题的顺序来拆这件事,内容包括数学等价性推导、α/τ/fc参数换算表、噪声抑制与延迟的定量关系,以及落地时容易踩的几个坑。适合正在处理传感器数据平滑、控制回路反馈或时序去抖的工程师和数据方向的朋友。

1. 两个名字,一条递推式:统计与电路在这里合流

1.1 统计侧:指数移动平均是“旧记忆按比例遗忘”

指数移动平均的标准写法是:

y[n] = α · x[n] + (1 − α) · y[n−1]

x[n]是当前输入样本,y[n]是滤波输出,α通常是一个0到1之间的系数。如果α很小,比如0.05,那就意味着新样本对输出影响很小,输出主要依赖历史积累;如果α接近1,滤波几乎没有平滑作用,输出基本就是当前输入。

把它展开成历史加权和会看得更清楚:

y[n] = α·x[n] + α·(1−α)·x[n−1] + α·(1−α)²·x[n−2] + ...

每一代之前的样本,权重都会乘一个(1−α)。这是一个等比数列,权重随样本年龄指数递减,所以叫“指数移动平均”。做量化的人喜欢用这个概念来估计价格的中短期趋势,做传感器处理的人喜欢用它来平滑读数波动。大家嘴上说的是“平均”,但实际上这是一个带遗忘机制的递归状态,不是简单地把过去N个数加起来除N。

这里有个非常容易混淆的符号问题:有些文章把α写成“新样本权重”,也就是我这篇用的定义;有些文章则把α写成“记忆保持率”,那么公式会变成y[n] = α·y[n−1] + (1−α)·x[n]。两种写法在数值上差了很大,调参时一定要先看清楚别人代码里0.9到底是乘在历史项上还是乘在新样本上,否则同样的α值,一个接近不过滤,一个平滑到几乎不动。

1.2 电路侧:一阶低通是“输出往输入方向挪一步”

一阶低通滤波从电路或者控制系统里来,最经典的模型是RC低通。输入电压经过一个电阻和一个电容,电容上的电压就是输出。频率低的时候,输出基本跟随输入;频率高的时候,电容不断被充放电,输出幅度越来越小。描述它的微分方程是:

τ · (dy/dt) + y = x

这里的τ就是时间常数,单位是秒,数值等于R×C。时间常数越大,响应越慢,能通过的频率越低。

把上面这个连续微分方程做一阶离散化,会得到什么?用差分替换微分,采样周期是Ts:

(τ/Ts) · (y[n] − y[n−1]) + y[n] = x[n]

整理一下:

y[n] = [Ts/(Ts+τ)]·x[n] + [τ/(Ts+τ)]·y[n−1]

令α = Ts/(Ts+τ),式子就变成:

y[n] = α·x[n] + (1−α)·y[n−1]

这就是指数移动平均。所以一阶低通滤波经过离散化以后,得到的递推式和EMA完全相同。控制领域还喜欢写成另一种等价形式:

y[n] = y[n−1] + α·(x[n] − y[n−1])

这种写法非常直观:当前

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询