一个简单的滤波程序,用于滤掉不多的杂波

滤波程序网上有很多,例如

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;
}
 

猜你喜欢

转载自blog.csdn.net/farsight_2098/article/details/88898621