4 char code sum_jp=1+2+3+4+5+6+7+8+9+10+11+12;
5 char filter_5()
6 {
7 char count;
8 char value_buf[N];
9 int sum=0;
10 for(count=0;count
11 {
12 value_buf[count]=get_data();
13 delay();
14 }
15 for(count=0;count
16 sum+=value_buf[count]*jq[count];
17 return (char)(sum/sum_jq);
18 }
1.4 中位值平均滤波
它相当于是“中位值滤波法”和“算术平均滤波法”的结合。它连续采样N个数据,然后去掉一个最大值和一个最小值,最后计算N-2个数据的算术平均值。一般N值的选取:3-14。
具体算法程序如下:
1 #define N 12
2 char filter()
3 {
4 char count,i,j;
5 char value_buf[N];
6 int sum=0;
7 for (count=0;count
8 {
9 value_buf[count] = get_ad();
10 delay();
11 }
12 for (j=0;j
13 {
14 for (i=0;i
15 {
16 if ( value_buf[i]》value_buf[i+1] )
17 {
18 temp = value_buf[i];
19 value_buf[i] = value_buf[i+1];
20 value_buf[i+1] = temp;
21 }
22 }
23 }
24 for(count=1;count
25 sum += value[count];
26 return (char)(sum/(N-2));
27 }
这种滤波方法兼容了移动平均滤波算法和中位值滤波算法的优点,所以无论对缓慢变化的信号,还是对快速变化的信号,都能取得较好的滤波效果。
1.5 限幅滤波
限幅滤波的基本原理是把两次相邻时刻(n和n-1)的采样值Yn和Yn-1相减,求出其差值,以绝对值表示,然后将这个差值与两次采样允许的最大偏差值ΔY比较,如果两次采样值的差值超过了允许的最大偏差值ΔY,则认为发生了随机干扰,并认为最后一次采样值Yn非法,应予剔除。剔除Yn后,可用Yn-1代替Yn;若未超过允许的最大偏差值范围,则认为本次采样值有效。可用如下公式表示:
|Yn-Yn-1|≤ΔY;则Yn有效
|Yn-Yn-1|>ΔY;则Yn-1有效
此算法的样例子程序如下:
此算法的样例子程序如下:
#define A 10 //A值可根据实际情况调整
char data; //上一次的数据
char filter_1()
{
char datanew; //新数据变量
datanew=get_data(); //获得新数据
//滤波算法
if ((datanew-data》A)||(data-datanew》A)
return data;
return datanew;
}
该算法主要用于处理变化比较缓慢的数据,如温度、物体的位置等。使用时关键在于最大偏差值的Δy的选择,通常可根据经验获得,也可按照输出参数可能的最大变化速度Vmax及采样周期T来决定ΔY的值,即ΔY=VmaxT。
1 #include
2 #include
3 #define uchar unsigned char