ct007 发表于 2010-7-16 10:54:36

递推平均滤波法

A、方法:
把连续取N个采样值看成一个队列
队列的长度固定为N
每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4


B、优点:
对周期性干扰有良好的抑制作用,平滑度高
适用于高频振荡的系统

C、缺点:
灵敏度低
对偶然出现的脉冲性干扰的抑制作用较差
不易消除由于脉冲干扰所引起的采样值偏差
不适用于脉冲干扰比较严重的场合
比较浪费RAM



#define N 12
char value_buf;
char i=0;//滑动
bittk   // 采样10次完成才开始返回数值
char filter()
{
        char count;
        int sum=0;
      if(i<N)
        value_buf=get_ad();
      else{ i = 0;TK = 1; }
      if (TK ==1) {
          for ( count=0;count<N;count++)
          sum = value_buf;   
          return (char)(sum/N);
                  }
}

这是最基本实现的程序,写的很烂!给个引题,看看高手门怎么写,稍后我也奉上我自己写的!

mcu5i51 发表于 2010-7-16 13:13:09

楼上程序好像有问题
sum = value_buf;   
          return (char)(sum/N);
返回的应该是 参数的1/N吧



#define FI_N 8
int filter(int dat)
{
static int _buff;
static u8 i,cont,init = 0;
long tmp;

//初值
if(!init)for(i=0;i<FI_N;i++)_buff = dat; init = 1;
if(++cont >= FI_N) cont = 0;        //计数
_buff = dat;                                //装入
tmp = 0;
for(i=0;i<FI_N;i++) tmp += _buff;        //累加
return (int)(tmp / FI_N);                         //平均
}

chenqiyue 发表于 2010-8-18 16:40:11

1楼说的是对的

hkjzhlei 发表于 2014-8-8 21:31:51

这种滤波程序,说实话,对直流还好吧,但是交流就不行了,会有很大的跳动,我目前也在寻找好的滤波程序。。。。

TANK99 发表于 2014-8-9 10:27:44

可以先对第一个读数至N个读数累加得到SUM,满N个数后求得平均。

以后累加不需要全部重新加,就可以省略一点。减去一个最旧的数,加上一个新数,然后再平均就可以了。BUFF还是要的。
当然N是2^n最好,这样就用移位来完成了。

这两项一起的话效率会高很多。

czclg 发表于 2014-8-10 22:05:18

这个是叫滑动滤波吗

bangbangji 发表于 2014-8-10 22:11:35

hkjzhlei 发表于 2014-8-8 21:31
这种滤波程序,说实话,对直流还好吧,但是交流就不行了,会有很大的跳动,我目前也在寻找好的滤波程序。。 ...

你需要数字滤波器,fir或者iir,保留需要的频段。
平均值之类的,只适用于滤除高频保留低频的应用。

yanghuanchun 发表于 2015-4-9 21:16:50

mcu5i51 发表于 2010-7-16 13:13
楼上程序好像有问题
sum = value_buf;   
          return (char)(sum/N);


大神,请教一下你的N值选取的规律是什么
页: [1]
查看完整版本: 递推平均滤波法