在嵌入式项目中,ADC作为信号采集的途径,使用频率极高。基本上哪里有信号采集哪里就有ADC。
但是用ADC直接采集的信号值并不完全可靠。受具体环境的影响,信号值中掺有或多或少的噪声。
红线:滤波前 蓝线:滤波后
这个时候就需要硬件或者软件对信号进行滤波。
对于纯软件来说做算法要考虑两个方面–时间复杂度和空间复杂度。
换句话说要求程序运行的速度和内存。
而单片机,用过的朋友都了解,频率以Mhz为单位,内存按KB计。计算资源和内存资源都很有限。
NUC100选型图
如果在单片机项目中需要用到算法,不能像纯软件编程:只考虑时间和空间复杂度,还要考虑硬件的支持能力。
今天给大家介绍一种非常适合在单片机上运行的滤波算法。
先给出公式:
filtered_val = ( filtered_val*(n-1) + val ) / n;
其中filtered_val 为滤波后的值,val为实时测得的值。n为滤波用的参数。这个参数不仅仅影响滤波的效果而且会影响计算得到的信号与实际信号的滞后。n越大滤波后的波形会愈加平滑但同时滞后也愈加严重。
比如上图示例中显示的蓝线的n值比黄线的n值大。相应的,蓝线的平滑效果更明显但是对原信号的跟踪就更慢。
n的取值,阿星建议各位使用2的幂次。例如使用2的3次幂为n计算时公式可以替代成下式:
filtered_val = ( filtered_val*(8-1) + val ) >>3;
用移位代替除法,处理速度会更快。
容易看出公式对噪声的抑制是n倍的效果。若应用场景对滞后有要求可调节采样数据的时间周期T。
这种算法占用的资源极少,理论上迭代收敛,实践上有两个可控变量操作性强,在工控领域比如需要使用PID控制的运动机器人,能显示出优良的滤波特性。
再为小伙伴们给出一个等价公式:
sum = sum - sum/n + val;
从它的等价公式我们也能看出每次滤波后对实时信号值的影响只有1/n并且随着采样次数不断增大将愈来愈小。
这个公式不仅能平滑滤波,在处理动态阈值时,也有它的用武之地。
比如触摸按键的动态阈值。
使用上述公式对信号积分计算再加上静态阈值可以让触摸按键有相对更高的适应性可靠性。
最后为还不过瘾想深入了解的小伙伴们提供一个搜索的关键词:滑动平均滤波。
公式的作用不仅仅在于公式本身也在于使用的开发人员自己的摸索,相信小伙伴们可以发现它的更多特性。
想了解更多物联网信息,请长按二维码关注我们
物联网信息交流群 QQ:985441916
一种适合单片机的滤波算法
最新推荐文章于 2022-04-21 09:00:36 发布