在一些设备中,我们需要对一些高频信号进行滤波,例如AD值读取。滤波分为软件滤波与硬件滤波,在实际开发中,硬件滤波往往不够,所以,我们需要掌握一些滤波算法。
本文分享:1,常用的软件滤波算法,2,开发中的经验。
软件滤波算法
1,中位值滤波法
原理:连续采样N次(N为奇数),对N次采样值进行大小排序,去中间值为本次采样值。
优点:能有效克服因偶然因素引起的波动干扰;
缺点:对温度、液位的变化缓慢的被测参数有良好的滤波效果。
2,平均值滤波法(去除MAX,MIN)
原理:连续采样N次,N次总和 - MAX - MIN 后,求平均值
当n较大时,信号的平滑度较高,但灵敏度较低
当n较小时,信号的平滑度较低,但灵敏度较高
优点:适用于对一般具有随机干扰的信号进行滤波;
缺点:因涉及到除法运算,在一些没有除法指令的MCU下,运算会比较慢。
3,递推平均滤波法
原理:把连续取得的N个采样值看成一个队列,队列的长度固定为N,
每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),
把队列中的N个数据进行算术平均运算,获得新的滤波结果。
优点:
平滑度高,
适用于数值会有微弱波动的情况。
缺点:
不易于消除干扰所引起的采样值偏差
不适用于脉冲干扰比较严重的场合;
涉及到队列,比较浪费RAM,ROM,
4,限幅滤波法(又称程序判断滤波法)
方法:
根据经验判断,确定两次采样允许的最大偏差值(设为A),
每次检测到新值时判断:
如果本次值与上次值之差<=A,则本次值有效,
如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。
优点:可以有效的克服因偶然因素而引起的脉冲干扰
缺点:不能抑制周期性的干扰而且平滑度较差。
5,限幅平均滤波法
方法:
相当于“限幅滤波法”+“递推平均滤波法”;
每次采样到的新数据先进行限幅处理,
再送入队列进行递推平均滤波处理。
优点:
融合了两种滤波法的优点;
对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。
开发经验:
以上就是常用的滤波算法,在实际开发中,如果不需要将数据显示出来,可根据项目情况使用1,2,3,4方法。如若需显示数据,则需要使用5方法去处理。让数据稳定的显示,当然,你也可以用降低数据读取的频率方法,但不推荐。
以下分享一个实际经验:
这个项目需要将电流显示出来,采样频率5KHz(200ms),每次采样10次,去除最大最小值后,求平均值,读出的数据显示,发现1个单位(100mA)的数据浮动,例如:1.1,1.2的数据不断变化。
在这里有两个解决方案:
1,可以使用降低采样频率来缓解这个问题,但是治标不治本。
2,后面添加了限值滤波,逻辑如下。
-
/* 限值滤波
-
现值(Temp)与上一个参数(Save)比较
-
1,相差数值大于1,则更新数值,AddCount = DelCount = 0
-
2,相差数值 = +1,
-
2.1 若AddCount < 1;则AddCount++;
-
2.2 若AddCount >=1;则AddCount =0;则更新数值
-
3, 相差数值 = -1
-
3.1 若DelCount< 1;则DelCount++;
-
3.2 若DelCount>=1;则DelCount=0;则更新数值 */
使用方案2,可以有效解决数据浮动的现象。在实际开发中,根据自己的需求更改相差值大小,Addcount以及DelCount来调节,可以得到很好的效果。
本文链接:https://blog.csdn.net/qq_31247231/article/details/80930525