在嵌入式系统中,数据采集和处理常常面临随机误差的干扰。虽然单片机在复杂算法运算方面存在局限性,但通过合理的数字滤波技术仍能有效提升数据质量。以下是关于单片机实现数字滤波的技术说明:
一.数字滤波算法的优势及常用方法
数字滤波算法通过软件实现信号处理,相比硬件滤波具有以下显著优点:
-
低成本、高可靠性
- 无需额外的硬件电路,仅通过计算即可实现滤波,节省成本。
- 不存在模拟滤波器的阻抗匹配问题,系统稳定性更高。
-
低频信号处理能力强
- 可有效滤除低频干扰(如温度漂移、缓慢波动信号),而模拟滤波器对低频信号处理效果较差。
-
灵活性强、复用性高
- 通过调整算法参数或修改程序即可改变滤波特性,适应不同应用场景。
- 多个输入通道可共享同一滤波程序,降低系统开销。
二.单片机系统中常用的数字滤波算法
在嵌入式系统中,常见的数字滤波方法包括:
- 限幅滤波法(消除突发性脉冲干扰)
- 中值滤波法(抑制椒盐噪声)
- 算术平均滤波法(平滑随机波动)
- 加权平均滤波法(提高近期数据的权重)
- 滑动平均滤波法(动态更新数据窗口,适应信号变化)
这些算法可根据实际需求组合使用,以在保证实时性的同时提高信号质量。
2.1 限幅滤波算法
该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。
A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。
算法的程序代码如下:
说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。
2.2 中值滤波算法
该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。算法的程序代码如下:
说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。
2.3 算术平均滤波算法
该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。算法的程序代码如下:
说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。
信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。
2.4 加权平均滤波算法
由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。
它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。
各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。
其中加权平均数字滤波的数学模型是:式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。
加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。
加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。样例程序代码如下:
2.5 滑动平均滤波算法
以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。
这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。
如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。
程序代码如下:
2.6 低通滤波
将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:
由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算:
当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,
低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。
虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。
浙公网安备 33010602011771号