防脉冲干扰移动平均值法数字滤波器的C语言算法及其实现
在许多的数据采集系统中,现场的强电设备较多,不可避免
地会产生尖脉冲干扰,这种干扰一般持续时间短,峰值大,对这样
的数据进行数字滤波处理时,仅仅采用算术平均或移动平均滤波
时,尽管对脉冲干扰进行了1/n的处理,但,其剩余值仍然较大。
这种场合最好的策略是:将被认为是受干扰的信号数据去掉,这
就是防脉冲干扰平均值滤波法的原理。
防脉冲干扰平均值滤波法的算法是:对连续的n个数据进行排序,
去掉其中最大和最小的2个数据,将剩余数据示平均值。
在一般8051单片机的应用中为了加快数据处理速度,n可以取值6。
而对于具有较快速度的处理器,则n值可以适当取大一些。但最好是
n=2^k+2, k为整数,因为这样在求平均值average=SUM/(n-2)=SUM/2^k时,
可以写成average=SUM>>k,用移位的方法,可以加快处理速度。
上述算法显然还存在一个不足之处,就是每采集一个数据就要进行一次排序,
这样会大量占用系统宝贵的时间。这可以通过存储当前数据中的最大值和最小值
来改进。具体做法是:
系统中用两个变量来存储当前n个数据的最大值和最小值在这个数组中的
偏移量(也就是数组下标,存储数组下标而直接不存储数据本身是因为:在一般的
系统中,n不会超无符号短整形的表示范围,因此用一个char形变量就可以存储了
而如果直接存储数据本身,则许多情况下要用int形变量,甚至更长的类型)。这样
只要在当前输入的数据将要覆盖的数据正好是当前的最大值或最小值时才在下个数
组中查找最大值或最小值,而其他情况下则只要将输入的数据与最大值和最小值比较
就可以修改下最大值和最小值了,而且不用进行数据排序。
这个算法很简单,下面是对应的C语言代码实现,可以很方便的应用的具体的51单片机,
或其他处理器上,只须做少量的修改。
#i nclude"stdio.h"
#define dtype unsigned int // 采集数据的数据类型
#define uint8 char
#define LEN 6 //移动算术平均的个数+2=SHIFT<<2+2
#define SHIFT 2 //2^SHIFT
uint8 pdata; //移动指针
uint8 pmax,pmin; //记录数据表中最大值和最小值的位置,
//在一般的数据采集系
上一篇:DES算法程序