5.中位值平均濾波法
/*
A、名稱:中位值平均濾波法(又稱防脈衝干擾平均濾波法)
B、方法:
采一組隊列去掉最大值和最小值後取平均值,
相當於“中位值濾波法”+“算術平均濾波法”。
連續采樣N個數據,去掉一個最大值和一個最小值,
然後計算N-2個數據的算術平均值。
N值的選取:3-14。
C、優點:
融合了“中位值濾波法”+“算術平均濾波法”兩種濾波法的優點。
對於偶然出現的脈衝性干擾,可消除由其所引起的采樣值偏差。
對周期干擾有良好的抑制作用。
平滑度高,適於高頻振蕩的系統。
D、缺點:
計算速度較慢,和算術平均濾波法一樣。
比較浪費RAM。
E、整理:shenhaiyu 2013-11-01
*/
int Filter_Value;
void setup() {
Serial.begin(9600); // 初始化串口通信
randomSeed(analogRead(0)); // 產生隨機種子
}
void loop() {
Filter_Value = Filter(); // 獲得濾波器輸出值
Serial.println(Filter_Value); // 串口輸出
delay(50);
}
// 用於隨機產生一個300左右的當前值
int Get_AD() {
return random(295, 305);
}
// 中位值平均濾波法(又稱防脈衝干擾平均濾波法)(算法1)
#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);
}
// 中位值平均濾波法(又稱防脈衝干擾平均濾波法)(算法2)
/*
#define FILTER_N 100
int Filter() {
int i;
int filter_sum = 0;
int filter_max, filter_min;
int filter_buf[FILTER_N];
for(i = 0; i < FILTER_N; i++) {
filter_buf[i] = Get_AD();
delay(1);
}
filter_max = filter_buf[0];
filter_min = filter_buf[0];
filter_sum = filter_buf[0];
for(i = FILTER_N - 1; i > 0; i--) {
if(filter_buf[i] > filter_max)
filter_max=filter_buf[i];
else if(filter_buf[i] < filter_min)
filter_min=filter_buf[i];
filter_sum = filter_sum + filter_buf[i];
filter_buf[i] = filter_buf[i - 1];
}
i = FILTER_N - 2;
filter_sum = filter_sum - filter_max - filter_min + i / 2; // +i/2 的目的是為了四舍五入
filter_sum = filter_sum / i;
return filter_sum;
}*/