这里写目录标题
- 一、滑动滤波
- 1、定义
- 2、公式
- 3、代码
- 4、优缺点
- 二、算术平均滤波
- 1、原理
- 2、公式
- 3、代码
- 三、加权平均滤波算法
- 1、原理
- 2、公式
- 3、代码
- 四、限幅滤波
- 1、原理
- 2、代码
- 3、适用场合
一、滑动滤波
1、定义
滑动平均滤波就是把连续取得的N个采样值看成一个队列,队列的长度固定为N,每次采样得到一个新数据放到队尾,并丢掉原来队首的一次数据,把队列中的N个数据进行平均运算,就可以获得新的滤波结果。 经过滑动滤波之后,波形整体变得平滑。
2、公式
式中:m为正整数,L=2m+1为滤波器阶数,等于滑动窗口的宽度。
3、代码
char value_buff[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buff[i++]=get_data();
if(i==N)
i=0;
for(count=0;count<N;count++)
sum=value_buff[count];
return (char)(sum/N);
}
其中get_data()是指你采集到的数据值。
4、优缺点
优点:算法简单,对周期性干扰有良好的抑制作用,平滑度高,适用于高频振动的系统。
缺点:对异常信号的抑制作用差,无法消除脉冲干扰的影响。
二、算术平均滤波
1、原理
连续取N次采样值后进行算术平均。
算术平均滤波算法适用于对具有随机干扰的信号进行滤波。
2、公式
3、代码
char filter()
{
int sum=0;
for(count=0;count<N;count++)
{
sum+=get_data();
delay():
}
return (char)(sum/N);
}
三、加权平均滤波算法
1、原理
在算术平均的基础上增加了加权系数。
可突出一部分信号,抵制另一部分信号,以提高采样值变化的灵敏度。
2、公式
y为n个采样值的加权平均值:Xi为第i次采样值;N为采样次数;Ci为加权系数。
加权系数Ci体现了各种采样值在平均值中所占的比例。
3、代码
char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区
char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buff[N];
int sum=0;
for(count=0;count<N;count++)
{
value_buff[count]=get_data();
delay();
}
for(count=0;count<N;count++)
sum+=value_buff[count]*jq[count];
return (char)(sum/sum_jq);
}
四、限幅滤波
1、原理
该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定。
如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。
2、代码
#define A //允许的最大差值
char data; //上一次的数据
char filter()
{
char datanew; //新数据变量
datanew=get_data(); //获得新数据变量
if((datanew-data)>A||(data-datanew>A))
return data;
else
return datanew;
}
3、适用场合
限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。