滤波算法

来源:互联网 发布:必应输入法mac 编辑:程序博客网 时间:2024/05/20 01:10
//①,限幅滤波法,又称程序判断滤波法
/*int Filter_Value;
int Value;


void setup(void)
{
Serial.begin(9600);//初始化串口通信
randomSeed(ananlogRead(0));//产生随机种子
Value = 300;
}


void loop(void)
{
Filter_Value = Filter();//获得滤波器输出值
Value = Filter_Value;//最近一次有效采样的值,该变量为全局变量
Serial.println(Filter_Value);
delay(50);
}


int Get_AD(void)
{
return random(295, 305);
}


#define FILTER_A 1
int Filter(void)
{
int NewValue;
NewValue = Get_AD();
if (((NewValue - Value) > FILTER_A) || ((Value -  NewValue) > FILTER_A))
return Value;
else
return NewValue;
}


//②,中位值滤波法
#define FILTER_N 101
int Filter(void)
{
int filter_buf[FILTER_N];
int i, j;
int filter_temp;
for (i=0; i<FILTER_N; i++)
{
filter_buf[i] = Get_AD();
delay(1);
}
//冒泡法将采样值从小到大进行排列
for (j=0; j<FILTER_N-1; j++)
{
for (i=0; i<FILTER_N-1-j; i++)
{
if (filter_buf[i] > filter_buf[i+1])
{
filter_temp = filter_buf[i];
filter_buf[i] = filter_buf[i+1];
filter_buf[i+1] = filter_temp;
}
}
}
return filter_buf[(FILTER_N-1) / 2];
}


//③,算数平均滤波法
#define FILTER_N 12
int Fiter(void)
{
int i;
int filter_sum = 0;
for (i=0; i<FILTER_N; i++)
{
filter_sum += Get_AD;
delay(1);
}
return (int)(filter_sun / FILTER_N);
}


//④,递推平均滤波法,滑动平滑滤波法
#define FILTER_N 12
int filter_buf[FILTER_N + 1];
int Filter(void)
{
int i;
int filter_sum = 0;
filter_buf[FILTER_N] = Get_AD;
for (i=0; i<FILTER_N; i++)
{
filter_buf[i] = filter_buf[i+1];//所有数据左移,低位扔掉
filter_sum += filter_buf[i];
}
return (int)(filter_sum / FILTER_N);
}


//⑤,中位值平均滤波法,又称防脉冲干扰平均滤波
#define FILTER_N 100
int Filter(void)
{
int i, j;
int filter_temp, filter_sum = 0;
int filter_buf[FILTER_N];
for (i=0; i<FILTER_N; i++)
{
filter_buf[i] = Get_AD();
delay(1);
}
//冒泡法将采样值从小到大进行排列
for (j=0; j<FILTER_N-1; j++)
{
for (i=0; i<FILTER_N-1-j; i++)
{
if (filter_buf[i] > filter_buf[i+1])
{
filter_temp = filter_buf[i];
filter_buf[i] = filter_buf[i+1];
filter_buf[i+1] = filter_temp;
}
}
}
//去除最大最小极值后取平均值
for (i=1; i<FILTER_N-1; i++)
filter_sum += filter_buf[i];
return filter_sum/(FILTER_N-2);
}


//⑥,限幅平均滤波法
#define FILTER_N 12
#define FILTER_A 1
int filter_buf[FILTER_N];
int Filter(void)
{
int i;
int filter_sum = 0;
filter_buf[FILTER_N-1] = Get_AD;
if (((filter_buf[FILTER_N-1] - filter_buf[FILTER_N-2]) > FILTER_A) || ((filter_buf[FILTER_N-2]-filter_buf[FILTER_N-1]) > FILTER_A))
filter_buf[FILTER_N-1] = filter_buf[FILTER_N-2];
for (i=0; i<FILTER_N-1; i++)
{
filter_buf[i] = filter_buf[i+1];
filter_sum += filter_buf[i];
}
return (int)filter-sum/(FILTER_N-1);
}


//⑦,一阶滞后滤波法
#define FILTER_A 0.01
int Value;
int Filter(void)
{
int NewValue;
NewValue = Get_AD();
Value = (int)((float)NewValue*FILTER_A+(1.0-FILTER_A)*(float)Value);
return Value;
}


//⑧,加权递推平均滤波法
#define FILTER_N 12
int coe[FILTER_N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};//加权系数表
int sum_coe = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +11 +12;//加权系数和
int filter_buf[FILTER_N];
int Filter(void)
{
int i;
int filter_sum = 0;
for (i=0; i<FILTER_N; i++)
{
filter_buf[i] = filter_buf[i+1];
filter_sum += filter_buf[i]*coe[i];
}
filter_sum /= sum_coe;
return filter_sum;
}


//⑨,消抖滤波法
#define FILTER_N 12
int Value;
int i = 0;
int Filter(void)
{
int new_value;
new_value = Get_AD;
if (Value != new_value)
{
i++;
if (i > FILTER_N)
{
i = 0;
Value = new_value;
}
}
else 
i = 0;
return Value;
}


//十, 限幅消抖滤波法
#define FILTER_N 5
#define FILTER_A 1
int Value;
int i = 0;
int Filter(void)
{
int NewValue;
int new_value;
NewValue = Get_AD;
if (((NewValue-Value) > FILTER_A) || ((Value-NewValue) > FILTER_A))
new_value = Value;
else 
new_value = NewValue;
if (Value != new_value)
{
i++;
if (i > FILTER_N)
{
i = 0;
Value = new_value;
}
}
else 
    i = 0;
return Value;
}*/
0 0