打印

防脉冲干扰移动平均值法数字滤波器的C语言算法及其实现

[复制链接]
1749|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qwe890asd|  楼主 | 2018-12-22 12:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
防脉冲干扰移动平均值法数字滤波器的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;   //
记录数据表中最大值和最小值的位置,
       //
在一般的数据采集系统中,数据的长度>=8,
       //
因此用指针记录而不是直接记录最大值和最小值
dtype datas[LEN];

dtype szlb(dtype _data)
{
/****************************/
/*
在调用此子程序前必须对 */
/* pdata,datas[]
数组,  */
/* pmax,pmin
进行初始化  */
/****************************/

uint8 i;
dtype average=0;  //
清零,用来计算平均值
pdata=(pdata+1)%LEN; //
指针下标在0LEN-1上滑动
datas[pdata]=_data;  //
采样所得数据存入数据表中
for(i=0;i<LEN;i++)
         average+=datas; //
求所有数据总和
/*******去除被认为是脉冲的数据******/
if(_data>datas[pmax])
      pmax=pdata;   //得到最大值的指针
else if(_data<datas[pmin])
      pmin=pdata;   //得到最小值的指针
if(pdata==pmax)   //如果当前输入值将存入当前最大值的位置时
{      //由以上方法将不可行,必须从其他位置中查找极值
      for(i=0;i<LEN;i++)
          if(datas>datas[pmax])
          pmax=i;
}
else if(pdata==pmin)//如果当前输入值将存入当前最大值的位置时
{      //由以上方法将不可行,必须从其他位置中查找极值
     for(i=0;i<LEN;i++)
          if(datas<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=0;
printf("数据:                          最大       最小\n");
while(1)
{
      scanf("%u",&_data);
      szlb(_data);
      for(i=0;i<LEN;i++)
      printf("%-3u  ",datas);
      printf("    %-3u      %-3u",datas[pmax],datas[pmin]);
      printf("\n");
}
}
算术平均滤波

所谓算术平均滤波就是把n个采样值相加,然后取其算术平均值作为本次有效的采样信号

PUSH  PSW   ;现场保护

      PUSH  A

      MOV   FLAG,#00H    ;进位位清零

      MOV   R0,DATA  ;设置数据存储区首址

      MOV   R7,#08H   ;设置采样数据个数

      CLR    A   ;清累加器

LOOP: ADD   A,@R0     ;两数相加

      JNC     NEXT ;无进位,转NEXT

      INC     FLAG ;有进位,进位位加1

NEXT: INC     R0 ;数据指针加1

      DJNZ  R7, LOOP ;未加完,继续加

      MOV   R7,#03H   ;设置循环次数



DIVIDE:    MOV   TEMP,A    ;保存累加器中的内容

      MOV   A,FLAG   ;累加结果除2

      CLR    C

      RRC   A

      MOV   FLAG,A

      MOV   A,TEMP

      RRC   A

      DJNZ  R7,DIVIDE     ;未结束,继续执行

      MOV   SAMP,A   ;保存结果至SAMP中

      POP    A   ;恢复现场

      POP    PSW

      RET


限幅滤波程序

设在顺序采样时刻T1、T2、T3所采集的数据分别为Y1、Y2、Y3,则当

∣Y2-Y1∣≤△y,则Y2作为采样值;

∣Y2-Y1∣>△y, 则保留Y2,但不作为采样值,继续采样得Y3;

如果∣Y3-Y2∣≤△y,则Y3作为采样值;

∣Y3-Y2∣>△y, 则取作为采样值。

程序

PUSH    PSW      ;保护现场

       PUSH    A

       CLR       C    ;进位标志位清零

       MOV     DATA,DATA2         

       MOV     A,DATA1

       SUBB    A,DATA ;求Yn-1 -Yn

       JNC       COMPARE  ;如果Yn-1 -Yn≥0,转COMPARE

       CPL       A    ;如果Yn-1 -Yn<0, 求补      

       INC       A   

COMPARE:  CLR       C

       SUBB    A,LIMIT       ;│Yn-Yn-1│和△y比较

       JC   OVER    ;如果│Yn-Yn-1│≤△y,DATA2→DATA

       MOV     DATA,DATA1      ;如果│Yn-Yn-1│>△y,DATA1→DATA

OVER:   POP       A    ;恢复现场

       POP       PSW

       RET       ;返回


相关帖子

沙发
gygp| | 2018-12-22 21:16 | 只看该作者
均值滤波和中值滤波的内容非常基础

使用特权

评论回复
板凳
chenci2013| | 2018-12-22 21:16 | 只看该作者
中值滤波的优点是可以很好的过滤掉噪声

使用特权

评论回复
地板
biechedan| | 2018-12-22 21:16 | 只看该作者
取平均值就是滤除任何有具有频率的变化分量的信号。

使用特权

评论回复
5
wangdezhi| | 2018-12-22 21:17 | 只看该作者
算数平均滤波,就是求出k次采样值的总和,再除以k

使用特权

评论回复
6
xietingfeng| | 2018-12-22 21:17 | 只看该作者
平均值法较常用。

使用特权

评论回复
7
suzhanhua| | 2018-12-22 21:18 | 只看该作者
中值滤波是选择适当的点来替代污染点的值

使用特权

评论回复
8
mituzu| | 2018-12-22 21:18 | 只看该作者
应该是硬件滤波和软件滤波两大类。

使用特权

评论回复
9
hellosdc| | 2018-12-22 21:19 | 只看该作者
可参考《滑动平均数字滤波参数研究》。

使用特权

评论回复
10
uiint| | 2018-12-22 21:19 | 只看该作者
最基本的应用算法如高通滤波,低通滤波,维纳滤波,相位相关等等。

使用特权

评论回复
11
xietingfeng| | 2018-12-22 21:19 | 只看该作者
数字滤波器的算法到底有几种?

使用特权

评论回复
12
gygp| | 2018-12-22 21:19 | 只看该作者
均值滤波相当于低通滤波

使用特权

评论回复
13
isseed| | 2018-12-22 21:20 | 只看该作者
中值滤波法,是把k个采样值按照从小到大排列顺序,然后找到位于最中间的那个值

使用特权

评论回复
14
chenci2013| | 2018-12-22 21:20 | 只看该作者
数字滤波器的原理有多种,取平均值是其中的一种。

使用特权

评论回复
15
wangdezhi| | 2018-12-22 21:20 | 只看该作者
这个有算法吗?      

使用特权

评论回复
16
biechedan| | 2018-12-22 21:20 | 只看该作者
硬件上可采用滤波技术

使用特权

评论回复
17
uiint| | 2018-12-22 21:20 | 只看该作者
均值滤波是对是对信号进行局部平均

使用特权

评论回复
18
hellosdc| | 2018-12-22 21:20 | 只看该作者
算术平均值法、 中位值滤波法、 限幅滤波法、 惯性滤波法。

使用特权

评论回复
19
mituzu| | 2018-12-22 21:20 | 只看该作者
低通滤波器怎样实现球平均值?

使用特权

评论回复
20
suzhanhua| | 2018-12-22 21:20 | 只看该作者
处理效果好。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

455

主题

583

帖子

5

粉丝