递推平均滤波法
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);
}
}
这是最基本实现的程序,写的很烂!给个引题,看看高手门怎么写,稍后我也奉上我自己写的! 楼上程序好像有问题
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); //平均
} 1楼说的是对的 这种滤波程序,说实话,对直流还好吧,但是交流就不行了,会有很大的跳动,我目前也在寻找好的滤波程序。。。。 可以先对第一个读数至N个读数累加得到SUM,满N个数后求得平均。
以后累加不需要全部重新加,就可以省略一点。减去一个最旧的数,加上一个新数,然后再平均就可以了。BUFF还是要的。
当然N是2^n最好,这样就用移位来完成了。
这两项一起的话效率会高很多。 这个是叫滑动滤波吗 hkjzhlei 发表于 2014-8-8 21:31
这种滤波程序,说实话,对直流还好吧,但是交流就不行了,会有很大的跳动,我目前也在寻找好的滤波程序。。 ...
你需要数字滤波器,fir或者iir,保留需要的频段。
平均值之类的,只适用于滤除高频保留低频的应用。 mcu5i51 发表于 2010-7-16 13:13
楼上程序好像有问题
sum = value_buf;
return (char)(sum/N);
大神,请教一下你的N值选取的规律是什么
页:
[1]