时域上的滤波有很多常用的算法,这里总结一下。
噪声幅度大
- 限幅滤波法
- 中值滤波法
噪声频率与信号频率有明显差异
- 高频噪声(俗称毛刺)
- 算术平均
- 消抖滤波法
- 加权滑动平均
- 一阶滞后滤波法
- 巴特沃斯/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实现