时域上的滤波有很多常用的算法,这里总结一下。

噪声幅度大

  • 限幅滤波法
  • 中值滤波法

噪声频率与信号频率有明显差异

  • 高频噪声(俗称毛刺)
  • 算术平均
  • 消抖滤波法
  • 加权滑动平均
  • 一阶滞后滤波法
  • 巴特沃斯/FIP低通滤波器
  • 低频噪声
  • 巴特沃斯/FIP高通滤波器

噪声频率与信号频带重叠

  • 信号和噪声的统计特性先验已知
  • 维纳滤波(参数是固定的,适合于平稳随机信号。)
  • 卡尔曼滤波(参数是时变的,适合于非平稳随机信号。)
  • 特性未知
  • 自适应去噪 (simplified,Nomalized) LMS / RLS (在维纳滤波理论上运用速下降法后的优化延伸)。RLS的收敛速率要快一些,非平稳信号的适应性也高一些。
  • 小波去噪
  • 经验模态分解EMD(解决了小波基不好选取的问题)

复合算法

  • 中位值平均滤波法
  • 限幅平均滤波法
  • 限幅消抖滤波法

在这些方法中,用得最多的还是移动平均。但是移动平均有一个问题:计算大,内存大。(相对于资源有限的终端来说)。
这里有一个思路,是移动平均的变种,可以大大降低计算和内存占用。

初始化:C为信号序列,A为平滑后的序列,初始值=C1,S=A*N,N为滑动窗口的大小
S = S - A + C
A = S / N
就这么简单,三个变量(N可以是常数),只要 S 的量程足够,N可以任意调整。
可以看出,此算法是从队列平均值算法演变而来,因没有了队列,每次计算时不知道该丢弃的最老的一个采样值是多少,这里用了个替代的办法,丢弃上次计算出的平均值。
去掉了缓存维护,节省内存空间,同时也将运算量压缩到了最小,执行效率非常高。调试时容易修改采样数。

优化算法:
此算法的核心思想还是平均值滤波,虽然改进了运算量和内存占用,但同样继承了平均值滤波法 N 值较大时平滑度好,反应迟钝的特点。
为此,对算法引入 S7-200 系统滤波程序中死区的概念:采样值偏差在死区范围内时,进行滤波计算,采样值偏差在死区范围以外时直接使用采样值,达到快速反应的效果。(设置滤波门槛,保持数据敏感度)
再溶合限幅滤波法去掉偶然的干扰脉冲:采样值偏差在限幅范围内时,进行滤波计算,采样值偏差在限幅范围以外时直接丢弃,使用上次滤波输出值。显然,限幅值应该大于死区值。


Reference:
方法介绍与C语言版
方法介绍与C语言版2
以上两个链接代码仅供参考,可能有错误。
用于Arduino的C语言版
matlab实现