一个非常适合单片机的滤波算法

连接:http://bbs.21ic.com/icview-170880-1-1.html

 

-------------------------------------------------以下为原文 -------------------

连接:http://bbs.21ic.com/icview-170880-1-1.html

 

单片机大多资源小,算法占用的资源越小越好,现在介绍就是一个占用很小资源的算法,这个算法是本人在进行扫描仪设计,实现灰度转二值时实现动态阈值,当时为了跟踪灰度等级的变化,需要一个灰度积分跟踪电路,开始使用一个电容积分电路,用灰度信号对电容充电,放电时以该电容电压的比例进行,实现对输入信号的跟踪,但用电容的电路设计比较复杂。过后发现这种比例放电的思想用软件实现非常简单,且具有积分、微分的作用。
具体公式如下:
       SUM=SUM-SUM/n+S 
       其中:S为采样值,SUM为保存值,n是放电比例、最好选2的幂次数,单片机移位即可,不需要做除法,跟随后得到的值为SUM/n,SUM注意不溢出,预留的容量为采样数最大值的n倍,初始化时如果是跟踪一段时间后使用,可以是任何值,否则可以用采样值乘n初始化。使用值为SUM/n(下文中SA),实现SUM/n对S的跟踪。还有一个关键是计算周期T,即多长时间进行一次。
一、积分作用:
1.平滑滤波(滑动平均滤波)
由公式中可以看出,每次采样、计算后,当前采样的影响对SUM/n只有1/n,而且采到的值随次数的增加影响越来越小直至没有,相关性逐渐减弱,而且是连续相关。如果计算周期与采样周期相同,使用计算后的值对干扰有n倍的抑制,即积分的平滑滤波作用,如1ms采样一次,同时运算一次,
则使用值SA=SUM/n为抑制干扰的结果,且同样是1ms给出一个结果,使用两个变量实现平滑滤波,并且是即时使用的,与采样几次平均的平滑不同。


 

 

2.动态阈值
在很多应用中需要动态阈值,比如触摸按键的键阈值门限,血压计的心率检出,前面提到的灰度转二值黑白图像等(灰度转二值因为扫描速度2.5Mbyte/S,不能使用软件运算,但可以使用可编程逻辑实现)。动态阈值是对信号积分后得到的低频变化再与基本门限相加在触摸按键中增加动态阈值可以提高其适应性和可靠性。关键是根据按键反应时间和按键间隔确定按键积分参数,跟踪速度,n、T越大跟踪的越慢,积分效果越好。
 

3.锁相作用:把上边的积分运算,用于对时间上周期的信号,例如根据过零触发信号锁定交流电源周期,使用两次T时间不同,其它相同的运算,由于T不同,跟踪速度不同,当两次运算的结果相等时可以确认为锁定,这时得到的是准确的电源周期值,而相位偏差也很小。

二、微分作用:
公式中的SA趋近采样值S,如果S是线性的,SA的值是可控滞后于S,那么运算的间隔时间T不同,得到的跟踪曲线的滞后特性不同,这种滞后特性的差和间隔时间就是微分特性,表示曲线的变化规律。如电热水壶,温度的变化相当于采样时间是还相当慢的,局部可以作为线性变化来处理。下边以设计电热水壶的过程来说明微分作用。
电热水壶出口一直使用蒸汽开关这种需要交专利费的方式。不使用蒸汽开关检测压力只能使用热敏器件检测温度。
温度检测的环境要求:
1.        海拔高度不同的地区水开的温度不同。
2.        热敏器件的误差较大,必须克服,否则可生产性不足。
3.        环境温度不同,电源电压不同,装水量不同。
由要求1、2决定检测温度不能判别水开与否,需要检测温度的变化率,但温度变化率的判别又和要求3相关,下边曲线图为热水器的加热曲线。蓝线为即时温度,橙色为一次运算后的曲线。

图中加热过程中间添加了冷水,曲线有一段下降,过后的加热过程两个曲线有个差异滞后,同一个时间的两个曲线差表示了加热效率的变化,其中最大的加热效率体现了环境温度不同,电源电压不同,装水量不同的综合效果。由于滞后的时间可以通过计算周期T来调整,知道滞后时间又有相减的差,这就是微分效应,加热过程整个就是效率的变化过程。我们可以通过1秒钟计算一次,2秒钟计算一次,加上原始数据得到三个曲线,效率的变化一目了然。
        第一次的水开检测使用效率的方法,同时也会得到水开时的温度检测值,微分特性本身是可以预知变化趋势的,如果1秒钟计算一次,用当前检测值减去这次计算的结果,这个差与当前值相加,就可以做为当前1秒后的结果,也就是预知1秒后加热的检测值,结合第一次得到的水开温度检测值,以后的水开检测就有两个判断条件。

 

---------------------------------------------- 以下为匠人的分析-----------------------------

拨开迷雾看真相,作者的这个算法,本质上,就是一阶滤波(低通滤波)。

引用作者原来的公式
SUM=SUM-SUM/n+S
首先点破一下,等号前面的SUM代表的是本次运算结果,而等号后面的SUM代表的是上次运算结果。

且看匠人如何推导: 
设:
SUM=A
SUM/n=B=本次滤波结果
1/n=a (一阶滤波系数)
S=本次新采样值

则:
A=nB
B=A/n


另外:
A、B 代表本次值
A’、B’ 代表上次值

作者原公式逐步推导:
原始:SUM=SUM-SUM/n+S
第1步:A=A’ – A’/n +S
第2步:nB=nB’ – B’ +S
第3步:B= (nB’ – B’ +S)/n
第4步:B=B’ –B’/n +S/n
第5步:B=(1- 1/n)B’ + (1/n)*S
第6步:B= (1-a)B’+ a *S

推导到最后一步,是不是很眼熟啦?
呵呵,这就是经典的一阶滤波(低通滤波)的标准公式了

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AD滤波算法函数模块说明: 一、该模块包含滤波算法有:中位值滤波、中位值平均滤波、递推平均滤波、一阶滞后滤波。用户可根据项目不同情况选用不同的滤波算法。 1.1、中位值滤波:连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。适用范围能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。不过对流量、速度等快速变化的参数不宜。 1.2、中位值平均滤波:连续采用N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值。适用范围:对应偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。但是测量速度较慢, 比较浪费RAM。 1.3递推平均滤波:把连续取N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据,把队列中得N个数据进行算术平均运算,就可以获得新的滤波结果。 适用范围:对周期性干扰有良好的抑制作用,平滑度高,适用于高频振荡的系统。缺点是灵敏度低,对偶然出现的脉冲性干扰的抑制作用较差,不易消除由于脉冲干扰所引起的采样值偏差,不适用于脉冲干扰比较严重的场合。 1.4、一阶滞后滤波:对周期性干扰具有良好的抑制作用,适用于波动频率较高得场合。缺点就是相位滞后,灵敏度低,滞后程度取决于a的大小,不能消除滤波频率高于采样频率1/21/2的干扰信号。本次滤波结果result=(1-a)*本次采样值+a*上次值。a=(0~1)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值