常用数字滤波算法(一)

一、限幅滤波法
优点:
能有效克服因偶然因素引起的脉冲干扰。
缺点:
无法抑制那种周期性的干扰,且平滑度差。

/*
1、限幅滤波
A值可根据实际情况调整
value为有效值,new_value为当前采样值
滤波程序返回有效的实际值
 */
#define A 10
char value

char filter(void) {
    char new_value;
    new_value = get_ad();
    if((new_value - value > A) || (value - new_value > A)) {
        return value;
    } else {
        return new_value;
    }
}

二、中位值滤波法
优点:
能有效克服因偶然因素引起的波动干扰;
对温度、液位等变化缓慢的被测参数有良好的滤波效果。
缺点:
对流量,速度等快速变化的参数不宜。

/*
2、中位值滤波法
N值可根据实际情况调整
排序采用冒泡法
 */
#define N 11

char filter(void) {
    char value_buf[N];
    char i, j, temp;
    for(i = 0; i < N; i++) {
        value_buf[i] = 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;
            }
        }
    }
    return value_buf[(N - 1) / 2];

算数平均滤波法

/*
3、算数平均滤波法
 */
#define N 11

char filter(void) {
    int sum = 0, i = 0;
    for(i = 0; i < N; i++) {
        sum += get_ad();
        delay();
    }
    return (char)(sum / N);
}

四、递推平均滤波法
说明:
把连续N个采样值看成一个队列,队列长度固定为N;
每次采样到一个新数据放入队尾,并扔掉队首的一次数据。把队列中的N各数据进行平均运算,即获得新的滤波结果。
优点:
对周期性干扰有良好的抑制作用,平滑度高;
适用于高频振荡的系统。
缺点:
灵敏度低;
对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干扰较严重的场合 不适合用于开关电源电路。

/*
4、递推平均滤波法
 */
#define N 12

char value_buf[N];
char i = 0;

char filter(void) {
    char count = 0;
    int sum = 0;

    value_buf[i++] = get_ad();
    if(i == N) {
        i = 0;    //先进先出
    }
    for(count = 0; count < N; count++) {
        sum += value_buf[count];
    }
    return (char)(sum / N);
}

五、中位值平均滤波法

说明:
采一组队列去掉最大值和最小值。
优点:
融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。
对周期干扰有良好的抑制作用,平滑度高,适于高频振荡的系统。
缺点:
测量速度慢。

/*
5、中位值平均滤波法
 */
#define N 12

char filter(void) {
    char i = 0, j = 0, temp = 0;
    char value_buf[N];
    int sum = 0;

    for(i = 0; i < N; i++){
        value_buf[i] = 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(i = 1; i < N - 1; i++) {
        sum += value_buf[i];
    }
    return (char)(sum / (N - 2));
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼金怪z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值