中位值滤波法能有效克服偶然因素引起的波动或采样不稳定引起的误码等脉冲干扰;
对温度、液位等缓慢变化的被测参数用此法能收到良好的滤波效果 ,但是对于流量压力等快速变化的参数一般不宜采用中位值滤波法;
基本方法:对某一被测参数连续采样 n次(一般 n 取奇数) ,然后再把采样值按大小排列 ,取中间值为本次采样值。
下面是中位值滤波程序:
#include <stdio.h>
// 定义滤波数据类型
typedef int filter_type;
// 函数声明
filter_type filter(filter_type value_buf[], int num);
// 中位值滤波函数
filter_type filter(filter_type value_buf[], int num)
{
int i,j;
// 冒泡排序
for (j=0; j<num-1; j++)
{
for (i=0; i<num-1-j; i++)
{
// 异或交换数
if (value_buf[i] > value_buf[i+1])
{
value_buf[i] ^= value_buf[i+1];
value_buf[i+1] ^= value_buf[i];
value_buf[i] ^= value_buf[i+1];
}
}
}
return value_buf[(num-1)/2];
}
//打印测试
void main()
{
filter_type mid;
filter_type a[5]= {55, 44, 88, 99, 11};
mid = filter(a, sizeof(a)/sizeof(filter_type));
printf("%d", mid);
}
运行结果: