跳至内容
返回工具箱

EMA / 滑动平均

平滑系数、窗口响应、延迟与 C 实现。

正在准备工具…

EMA

yn=yn−1+α(xn−yn−1)y_n=y_{n-1}+\alpha(x_n-y_{n-1}),保存一个历史输出。α 越小,平滑越强、响应越慢。

按离散 −3 dB 截止频率求系数,令 s=sin⁡(πfc/fs)s=\sin(\pi f_{\mathrm c}/f_{\mathrm s}):

α=2s1+s2+s \alpha=\frac{2s}{\sqrt{1+s^2}+s} fs=1000 Hz,fc=10 Hzα≈0.0608792 \begin{gathered} f_{\mathrm s}=1000\,\mathrm{Hz},\quad f_{\mathrm c}=10\,\mathrm{Hz}\\ \alpha\approx0.0608792 \end{gathered}

低频群延迟为 (1−α)/(αfs)(1-\alpha)/(\alpha f_{\mathrm s}),随频率变化。

滑动平均

最近 N 个样本取均值,群延迟为 (N−1)/(2fs)(N-1)/(2f_{\mathrm s});N ≥ 2 时,第一个零点为 fs/Nf_{\mathrm s}/N。−3 dB 截止频率由离散频响求解。

fs=1000 Hz,N=16τg=7.5 ms,fzero=62.5 Hz \begin{gathered} f_{\mathrm s}=1000\,\mathrm{Hz},\quad N=16\\ \tau_{\mathrm g}=7.5\,\mathrm{ms},\quad f_{\mathrm{zero}}=62.5\,\mathrm{Hz} \end{gathered}

N=1N=1 为直通。滑动平均有旁瓣,适合平滑及抑制与窗口对齐的周期干扰。

C 接口

每通道一个 Filter,以 fs 调用 filter_step()。filter_reset(&state, 0) 从零开始;传入首个样本值则从该直流值开始。

滑动平均采用固定环形缓冲区;浮点版使用 double 累加器,定点版使用 int64_t 累加器。16 点 float 缓冲区占 64 字节,另加累加器和索引。两种头文件使用同名 API,按所需算法选用。

Q 定点

在“数值格式”中选 Q 定点,可设 16 / 32 位与小数位数。Qm.fQm.f 的 mm 包含符号位,原始整数 rr 表示 r/2fr/2^f。默认 Q4.28Q4.28,范围 −8≤x<8-8\le x<8,分辨率 2−282^{-28}。

下载 fl_filter.h 和公共 fl_q.h,放在同一包含路径。公共头的完整源码、下载和编译示例见Q定点数C库。FilterSample 是原始定点整数;fl_q_from_double(x, filter_q) / fl_q_to_double(y, filter_q) 用于单位转换,采样循环只做整数运算。

乘积最近舍入,半值远离零;宽累加后饱和。EMA 使用两项加权和,滑动平均保留精确整数和后除以 N。模拟器执行同一整数递推,超限时显示累计饱和次数。频响是量化系数的线性响应,限幅和极限环在时域波形中观察。

二阶低通、高通、带通和陷波见 二阶数字滤波器。