移动平均值法

上传人:枫** 文档编号:493839229 上传时间:2023-12-21 格式:DOCX 页数:3 大小:9.82KB
返回 下载 相关 举报
移动平均值法_第1页
第1页 / 共3页
移动平均值法_第2页
第2页 / 共3页
移动平均值法_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《移动平均值法》由会员分享,可在线阅读,更多相关《移动平均值法(3页珍藏版)》请在金锄头文库上搜索。

1、防脉冲干扰移动平均值法数字滤波器的C语言算法及其实现在许多的数据采集系统中,现场的强电设备较多,不可避免 地会产生尖脉冲干扰,这种干扰一般持续时间短,峰值大,对这样 的数据进行数字滤波处理时,仅仅采用算术平均或移动平均滤波 时,尽管对脉冲干扰进行了 1/n的处理,但,其剩余值仍然较大。 这种场合最好的策略是:将被认为是受干扰的信号数据去掉,这 就是防脉冲干扰平均值滤波法的原理。防脉冲干扰平均值滤波法的算法是:对连续的n个数据进行排序, 去掉其中最大和最小的2 个数据,将剩余数据示平均值。在一般8051单片机的应用中为了加快数据处理速度,n可以取值6。而对于具有较快速度的处理器,则n值可以适当取

2、大一些。但最好是 n=2k+2,k为整数,因为这样在求平均值average=SUM/(n-2)=SUM/2k时,可以写成average=SUMk,用移位的方法,可以加快处理速度。上述算法显然还存在一个不足之处,就是每采集一个数据就要进行一次排序, 这样会大量占用系统宝贵的时间。这可以通过存储当前数据中的最大值和最小值 来改进。具体做法是:系统中用两个变量来存储当前n个数据的最大值和最小值在这个数组中的 偏移量(也就是数组下标,存储数组下标而直接不存储数据本身是因为:在一般的 系统中,n不会超无符号短整形的表示范围,因此用一个char形变量就可以存储了 而如果直接存储数据本身,则许多情况下要用

3、int 形变量,甚至更长的类型)。这样 只要在当前输入的数据将要覆盖的数据正好是当前的最大值或最小值时才在下个数 组中查找最大值或最小值,而其他情况下则只要将输入的数据与最大值和最小值比较 就可以修改下最大值和最小值了,而且不用进行数据排序。这个算法很简单,下面是对应的C语言代码实现,可以很方便的应用的具体的51单片机, 或其他处理器上,只须做少量的修改。i ncludestdio.h#define dtype unsigned int / 采集数据的数据类型#define uint8 char#define LEN 6/移动算术平均的个数+2=SHIFT2+2#define SHIFT 2

4、/2SHIFTuint8 pdata; /移动指针uint8 pmax,pmin; /记录数据表中最大值和最小值的位置,/在一般的数据采集系统中,数据的长度=8, /因此用指针记录而不是直接记录最大值和最小值 dtype datasLEN;dtype szlb(dtype _data)/ *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* / /* 在调用此子程序前必须对 */* pdata,datas数组,*/* pmax

5、,pmin 进行初始化 */ *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* *x* / /uint8 i;dtype average=0; /清零,用来计算平均值 pdata=(pdata+1)%LEN; /指针下标在 0 到 LEN-1 上滑动dataspdata=_data; /采样所得数据存入数据表中for(i=0;idataspmax)pmax=pdata; /得到最大值的指针else if(_datadataspmi

6、n)pmin=pdata; /得到最小值的指针if(pdata=pmax) /如果当前输入值将存入当前最大值的位置时 /由以上方法将不可行,必须从其他位置中查找极值for(i=0;idataspmax)pmax=i;else if(pdata=pmin)/如果当前输入值将存入当前最大值的位置时/由以上方法将不可行,必须从其他位置中查找极值for(i=0;iLEN;i+)if(datasiSHIFT); /求算术平均值/*以下是在 VC6.0 环境下运行的测试程序*/*通过手动输入来模拟数据采集过程*/void main()uint8 i;dtype _data;pdata=0;pmax=0;pmin=0;for(i=0;iLEN;i+)datasi=0;printf(数据:最大最小n);while(1)scanf(%u,&_data); szlb(_data);for(i=0;iLEN;i+)printf(%-3u ,datasi);printf( %-3u%-3u,dataspmax,dataspmin);printf(n);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号