由于要进行数据处理,就利用网络资源总结各种滤波方法以便日后查阅。
文章目录
一、限幅滤波法
实现步骤:
- 根据经验法选择最大偏差值E。
- |value_now - value_before| <= E,value_now有效,否则其无效且将其舍弃,最后令value_now = value_before。
实现程序:
#define E 10 //value取值范围为90~110
int value_init = 100;
int filter(int value_now)
{
if ((value_now - value_before > E) || (value_before - value_now) > E)
{
return value_before;
}
return value_now;
}
滤波优缺点:
优:可克服偶然误差。
缺:无法抑制周期性干扰;平滑度差。
二、中位值滤波法
实现步骤:
- 连续采样N次(N为奇数)
- 将其排序(任选一种排序算法)
- 只取中间值
实现程序:
#define N 5 //根据传感器性能和主控芯片性能进行设置
int filter(void)
{
int *buf = (int*)malloc(N * sizeof(int));
char count, i, j, temp;
for (count = 0; count < N; count++)
{
buf[count] = get_val(); //获取新的采样值
delay(); //采样间隔
}
for (j = 0; j<N - 1; j++) //采用冒泡排序
{
for (i = 0; i<N - j - 1; i++)
{
if (buf[i]>buf[i + 1])
{
temp = buf[i];
buf[i] = buf[i + 1];
buf[i + 1] = temp;
}
}
}
freebuf); //释放内存块
return buf[(N - 1) / 2]; //返回中间值
}
滤波优缺点:
优:可克服偶然误差;对缓慢变化的数据有很好的滤波效果。
缺:不适用于快速变化的数据。
三、算术平均滤波法
实现步骤:
- 取N个数据求均值
N大 --> 平滑度高,灵敏度低
N小 --> 平滑度低,灵敏度高
通常,流量N=12,压力N=4,液面,N=412,温度N=14
实现程序:
#define N 10
int filter(void)
{
int sum = 0, count;
for (count = 0; count < N; count++)
{
sum += get_val(); //获取采样值并求和
delay();
}
return (sum / N);
}
滤波优缺点:
优:适用于对一般具有随机干扰的信号进行滤波,信号会在此平均值附近上下波动。
缺:不适用于测量速度慢或要求数据计算快的实时控制;浪费运行内存。
四、中位值平均滤波法(二三结合)
实现步骤:
- 采样N个数据并排序
- 去掉数组头和尾(去除最大最小值)
- 计算(N-2)个数的平均数
实现程序:
#define N 12
int get_val(); //传感器采集数据函数
int filter()
{
char count, i, j;
int buf[N];
int sum = 0, temp;
for (count = 0; count < N; count++)
{
buf[count] = get_val(<