1、限幅滤波法(又称程序判断滤波法)
int Filter_Value;
int Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
Value = 300;
}
void loop() {
Filter_Value = Filter();
Value = Filter_Value;
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_A 1
int Filter() {
int NewValue;
NewValue = Get_AD();
if(((NewValue - Value) > FILTER_A) || ((Value - NewValue) > FILTER_A))
return Value;
else
return NewValue;
}
2、中位值滤波法
int Filter_Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_N 101
int Filter() {
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];
}
3、算术平均滤波法
int Filter_Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_N 12
int Filter() {
int i;
int filter_sum = 0;
for(i = 0; i < FILTER_N; i++) {
filter_sum += Get_AD();
delay(1);
}
return (int)(filter_sum / FILTER_N);
}
4、递推平均滤波法(又称滑动平均滤波法)
int Filter_Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_N 12
int filter_buf[FILTER_N + 1];
int Filter() {
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);
}
5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
int Filter_Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_N 100
int Filter() {
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);
}
6、限幅平均滤波法
#define FILTER_N 12
int Filter_Value;
int filter_buf[FILTER_N];
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
filter_buf[FILTER_N - 2] = 300;
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_A 1
int Filter() {
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);
}
7、一阶滞后滤波法
int Filter_Value;
int Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
Value = 300;
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_A 0.01
int Filter() {
int NewValue;
NewValue = Get_AD();
Value = (int)((float)NewValue * FILTER_A + (1.0 - FILTER_A) * (float)Value);
return Value;
}
8、加权递推平均滤波法
int Filter_Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#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 + 1];
int Filter() {
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] * coe[i];
}
filter_sum /= sum_coe;
return filter_sum;
}
9、消抖滤波法
int Filter_Value;
int Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
Value = 300;
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_N 12
int i = 0;
int Filter() {
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;
}
10、限幅消抖滤波法
int Filter_Value;
int Value;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
Value = 300;
}
void loop() {
Filter_Value = Filter();
Serial.println(Filter_Value);
delay(50);
}
int Get_AD() {
return random(295, 305);
}
#define FILTER_A 1
#define FILTER_N 5
int i = 0;
int Filter() {
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;
}
11、 卡尔曼滤波
float code Q_angle=0.001;
float code Q_gyro=0.003;
float code R_angle=0.5;
float code dt=0.01;
char code C_0 = 1;
float xdata Q_bias, Angle_err;
float xdata PCt_0, PCt_1, E;
float xdata K_0, K_1, t_0, t_1;
float xdata Pdot[4] ={0,0,0,0};
float xdata PP[2][2] = { { 1, 0 },{ 0, 1 } };
void Kalman_Filter(float Accel,float Gyro)
{
Angle+=(Gyro - Q_bias) * dt;
Pdot[0]=Q_angle - PP[0][1] - PP[1][0];
Pdot[1]=- PP[1][1];
Pdot[2]=- PP[1][1];
Pdot[3]=Q_gyro;
PP[0][0] += Pdot[0] * dt;
PP[0][1] += Pdot[1] * dt;
PP[1][0] += Pdot[2] * dt;
PP[1][1] += Pdot[3] * dt;
Angle_err = Accel - Angle;
PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP[0][1];
PP[0][0] -= K_0 * t_0;
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
Angle += K_0 * Angle_err;
Q_bias += K_1 * Angle_err;
Gyro_y = Gyro - Q_bias;
}
void Angle_Calcu(void)
{
Accel_x = GetData(ACCEL_XOUT_H);
Angle_ax = (Accel_x - 1100) /16384;
Angle_ax = Angle_ax*1.2*180/3.14;
Gyro_y = GetData(GYRO_YOUT_H);
Gyro_y = -(Gyro_y + 30)/16.4;
Kalman_Filter(Angle_ax,Gyro_y);
/*
Angle = Angle + (((Angle_ax-Angle)*0.5 + Gyro_y)*0.01);
}