在许多的数据采集系统中,现场的强电设备较多,不可避免
地会产生尖脉冲干扰,这种干扰一般持续时间短,峰值大,对这样
的数据进行数字滤波处理时,仅仅采用算术平均或移动平均滤波
时,尽管对脉冲干扰进行了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 dtypeunsigned int//采集数据的数据类型
#define uint8char
#define LEN6//移动算术平均的个数+2=SHIFT<<2+2
#define SHIFT2//2^SHIFT
uint8 pdata;//移动指针
uint8 pmax,pmin;//记录数据表中最大值和最小值的位置,
//在一般的数据采集系统中,数据的长度>=8,
//因此用指针记录而不是直接记录最大值和最小值
dtype datas[LEN];
dtype szlb(dtype _data)
{
/****************************/
/*在调用此子程序前必须对*/
/*pdata,datas[]数组,*/
/*pmax,pmin进行初始化*/
/****************************/
uint8 i;
dtype average=0;//清零,用来计算平均值
pdata=(pdata+1)%LEN;//指针下标在0到LEN-1上滑动
datas[pdata]=_data;//采样所得数据存入数据表中
for(i=0;i<LEN;i++)
average+=datas[i];//求所有数据总和
/*******去除被认为是脉冲的数据******/
if(_data>datas[pmax])
pmax=pdata;//得到最大值的指针
else if(_data<datas[pmin])
pmin=pdata;//得到最小值的指针
if(pdata==pmax)//如果当前输入值将存入当前最大值的位置时
{//由以上方法将不可行,必须从其他位置中查找极值
for(i=0;i<LEN;i++)
if(datas[i]>datas[pmax])
pmax=i;
}
else if(pdata==pmin)//如果当前输入值将存入当前最大值的位置时
{//由以上方法将不可行,必须从其他位置中查找极值
for(i=0;i<LEN;i++)
if(datas[i]<datas[pmin])
pmin=i;
}
average=average-datas[pmax]-datas[pmin];//减去脉冲
return (average>>SHIFT);//求算术平均值
}
/******以下是在VC++6.0环境下运行的测试程序**/
/***通过手动输入来模拟数据采集过程****/
void main()
{
uint8 i;
dtype _data;
pdata=0;
pmax=0;
pmin=0;
for(i=0;i<LEN;i++)
datas[i]=0;
printf("数据: 最大 最小/n");
while(1)
{
scanf("%u",&_data);
szlb(_data);
for(i=0;i<LEN;i++)
printf("%-3u ",datas[i]);
printf(" %-3u %-3u",datas[pmax],datas[pmin]);
printf("/n");
}
}
分享到:
相关推荐
防脉冲干扰移动平均值法数字滤波器的C语言算法及其实现.doc
1. 掌握利用脉冲响应不变法设计IIR数字滤波器的原理和具体方法。2. 加深理解数字滤波器与连续时间滤波器之间的技术指标转化。3. 掌握脉冲响应不变法设计IIR数字滤波器的优缺点及使用范围
IIR数字滤波器的设计分为直接法与间接法,但一般采用间接法(即脉冲响应不变法和双线性变换法),但应用最广泛的双极性变换法。此次实验掌握了IIR数字滤波器的基本设计过程:先将给定的数字滤波器的指标转换成过渡...
FIR滤波器与无限持续时间脉冲响应 (IIR) 滤波器相比,具有有限持续时间脉冲响应的数字滤波器(全零或 FIR 滤波器)既有优点又有缺点。 主要优点: 1. 具有精确的线性相位 2. 始终稳定 3. 设计方法通常是线性的 ...
在许多的数据采集系统中,现场的强电设备较多,不可避免 地会产生尖脉冲干扰,这种干扰一般持续时间短,峰值大,对这样 的数据进行数字滤波处理时,仅仅采用算术平均或移动平均... 就是防脉冲干扰平均值滤波法的原理。
设计IIR数字滤波器一般采用间接法(脉冲响应不变法和双线性变换法),应用最广泛的是双线性变换法。基本设计过程是:①先将给定的数字滤波器的指标转换成过渡模拟滤波器的指标; ②设计过渡模拟滤波器;③将过渡模拟...
基于C与arduino的中位值平均滤波法(防脉冲干扰平均滤波法)设计与实现
简单实用的传感器滤波算法 1、限幅滤波法(又称...5、中位值平均滤波法(又称防脉冲干扰平均滤波法) 6、限幅平均滤波法 7、一阶滞后滤波法 8、加权递推平均滤波法 9、消抖滤波法 10、限幅消抖滤波法 11、IIR滤波???
卡尔曼滤波,扩展卡尔曼滤波,无迹...中位值平均滤波(防脉冲干扰平均滤波法)纯属看心情附赠哈哈,单独需要的可以看我的博文https://blog.csdn.net/weixin_42859360/article/details/105695648,里面有代码直接copy!
已知通带导带、以及纹波系数、衰减增益等参数,利用matlab展示脉冲响应不变法设计数字滤波器的过程,
在许多的数据采集系统中,现场的强电设备较多,不可避免 地会产生尖脉冲干扰,这种干扰一般持续时间短,峰值大,对这样 的数据进行数字滤波处理时,仅仅采用算术平均或移动平均... 就是防脉冲干扰平均值滤波法的原理。
用C语言实现数字滤波,程序判数滤波 中值滤波 滑动算术平均值滤波 滑动加权平均值滤波 防脉冲干扰平均值滤波 低通数字滤波
脉冲响应不变法设计IIR数字滤波器
限幅滤波法、中位值滤波法、算术平均滤波法、递推平均滤波法(又称滑动平均滤波法)、中位值平均滤波法(又称防脉冲干扰平均滤波法)、限幅平均滤波法、一阶滞后滤波法、加权递推平均滤波法、消抖滤波法、限幅消抖...
无限脉冲响应数字滤波器的设计
脉冲响应不变法设计IIR数字滤波器.doc