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