滤波程序网上有很多,例如
1、限幅滤波法(又称程序判断滤波法)
2、中位值滤波法
3、算术平均滤波法
4、递推平均滤波法(又称滑动平均滤波法)
5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
6、限幅平均滤波法
7、一阶滞后滤波法
8、加权递推平均滤波法
9、消抖滤波法
10、限幅消抖滤波法
11、IIR滤波???
那么我的一个小小的滤波程序的出发点是这样的,例如100个数字,理想状况下都是5,但是实际上,还不连续分布几个6,那么怎么滤掉这几个6呢,我的想法是 这样的:
举个例子:把这个100个数字一次插入循环队列,并且每次插入都进行比较,如果循环队列中的值都相等,那么就认为此时值为真实值,
比如,buf[0] = 5;buf[1] = 5;buf[2] = 5;buf[3] = 5;那么此时就是5,如果buf[0] = 5;buf[1] = 5;buf[2] = 5;buf[3] = 6;呢,不相等了,那么就先是使用上次的值5,继续插入,buf[0] = 5;buf[1] = 5;buf[2] = 6;buf[3] = 5,再继续buf[0] = 5;buf[1] = 6;buf[2] = 5;buf[3] = 5,再继续buf[0] = 6;buf[1] = 5;buf[2] = 5;buf[3] = 5,再继续buf[0] = 5;buf[1] = 5;buf[2] = 5;buf[3] = 5,波动值6就被移出了循环队列。
这样就可以得到稳定的值5,而不受6的影响,
如果多个连续数组需要进行滤波,并且各自的稳定值不相同的话,比如上图中的组1和组2,例如组2大部分是8,偶尔有几个7,那么也是同样适用,依然是插入循环队列,
不过,这样的做法太简单,自然也会带来很大问题,就是如果杂波是连续的,等值的,那么就不好处理了,就要使用一些儿复杂的滤波方式,
这里我写了一个简单的代码,仅供参考:
//循环队列(顺序队列)的实现
#include <stdio.h>
#include <stdlib.h>
#define N 4
//定义数据类型
typedef int datatype_t;
//定义结构体
typedef struct{
datatype_t data[N];
int front;
int rear;
}sequeue_t;
//创建一个空的队列
sequeue_t *sequeue_create()
{
sequeue_t *sq = (sequeue_t *)malloc(sizeof(sequeue_t));
sq->front = sq->rear = 0;
return sq;
}
//判断队列是否为空
int sequeue_empty(sequeue_t *sq)
{
return sq->front == sq->rear ? 1 : 0;
}
//判断队列是否为满
int sequeue_full(sequeue_t *sq)
{
return (sq->rear + 1) % N == sq->front ? 1 : 0;
}
//入队
int sequeue_push(sequeue_t *sq, datatype_t value)
{
if(sequeue_full(sq))
{
sequeue_pop(sq);
}
sq->data[sq->rear] = value;
sq->rear = (sq->rear + 1) % N;
return 0;
}
//出队
datatype_t sequeue_pop(sequeue_t *sq)
{
if(sequeue_empty(sq))
{
printf("sequeue is empty\n");
return (datatype_t)-1;
}
datatype_t value;
value = sq->data[sq->front];
sq->front = (sq->front + 1) % N;
return value;
}
int buf[20] = {1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1};
int main(int argc, const char *argv[])
{
sequeue_t *sq = sequeue_create();
int i,T_vlaue = 0;
for(i=0;i<20;i++){
sequeue_push(sq, buf[i]);
if(sq->data[0] == sq->data[1] && sq->data[1] == sq->data[2] && sq->data[2] == sq->data[3] ){
T_vlaue = sq->data[0];
}
printf("-------稳定值为-%d-----------\n",T_vlaue);
}
putchar(10);
return 0;
}