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;

}*/