中位值平均滤波法(又称防脉冲干扰平均滤波法) [pre lang="arduino" line="1"]/* 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 = Get_AD(); delay(1); } // 采样值从小到大排列(冒泡法) for(j = 0; j < FILTER_N - 1; j++) { for(i = 0; i < FILTER_N - 1 - j; i++) { if(filter_buf > filter_buf[i + 1]) { filter_temp = filter_buf; filter_buf = filter_buf[i + 1]; filter_buf[i + 1] = filter_temp; } } } // 去除最大最小极值后求平均 for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf; 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 = 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 > filter_max) filter_max=filter_buf; else if(filter_buf < filter_min) filter_min=filter_buf; filter_sum = filter_sum + filter_buf; filter_buf = 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; }*/[/pre]
#define N 12 char filter() { char countij; char value_buf[N]; int sum=0; for (count=0;count<N;count++) { value_buf[count] = get_ad(); delay(); } for (j=0;j<N-1;j++) { for (i=0;i<N-j;i++) { if ( value_buf[i]>value_buf[i+1] ) { temp = value_buf[i]; value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp; } } } for(count=1;count<N-1;count++) sum += value[count]; return (char)(sum/(N-2)); }
中位值平均滤波法就是采集N次数据去掉最大最小值,剩余的数据进行算数平均。
之类有一个本人在生产中用到的代码片段,可以参考。
for(i=0;i<10;i++){
中位值平均滤波法原理是:在连续采集到的N个数据中,去掉最大值和最小值,剩下的N-2个数据求和再算平均,这个平均值作为采样值。
看了这个应该就很清楚怎么做了,在N个数据中找到最大和最小,求个平均就行了。
中值平均滤波就是在采集的N个数据中去掉一个最大值和一个最小值,然后对剩下的数据求平均值。所以这个算法不需要对数据排序关键是计算最大值,最小值,求和,然后计算平均值。