前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常见的几种AD滤波算法

常见的几种AD滤波算法

作者头像
正念君
发布2019-11-27 15:57:56
1.7K0
发布2019-11-27 15:57:56
举报
文章被收录于专栏:嵌入式大杂烩嵌入式大杂烩

在进行AD采样时,常常都会对采样数据进行滤波,以达到更好一点的效果。下面分享几种较简单而常用的滤波算法:

限幅滤波法

限幅滤波法又称程序判断滤波法 。该方法根据经验判断,确定两次采样允许的最大偏差值(设为 A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效;如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。

实例程序:

代码语言:javascript
复制
/* 
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;
    return new_value;
}

优点:

能有效克服因偶然因素引起的脉冲干扰。

缺点:

无法抑制那种周期性的干扰,平滑度差 。

中位值滤波法

连续采样 N 次(N 取奇数)把 N 次采样值按大小排列取中间值为本次有效值。

实例程序:

代码语言:javascript
复制
/* 
N 值可根据实际情况调整
排序采用冒泡法
*/

#define N 11
char filter(void)
{
    char value_buf[N];
    char count,i,j,temp;
    for (count=0; count<N; count++)
    {
        value_buf[count] = 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];
}

优点:

能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果。

缺点:

对流量、速度等快速变化的参数不宜。

算术平均滤波法

连续取 N 个采样值进行算术平均运算。 N 值较大时:信号平滑度较高,但灵敏度较低。N 值较小时:信号平滑度较低,但灵敏度较高。

实例程序:

代码语言:javascript
复制
#define N 12
char filter(void)
{
    int sum = 0;
    for (count=0; count<N; count++)
    {
        sum + = get_ad();
        delay();
    }
    return (char)(sum/N);
}

优点:

适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。

缺点:

对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费 RAM 。

中位值平均滤波法

相当于“中位值滤波法”+“算术平均滤波法”连续采样 N 个数据,去掉一个最大值和一个最小值然后计 算 N-2 个数据的算术平均值。

实例程序:

代码语言:javascript
复制
#define N 12
char filter(void)
{
    char count,i,j;
    char value_buf[N];
    int sum=0;

    for (count=0;count<N;count++)
    {
        value_buf[count] = 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(count=1;count<N-1;count++)
        sum += value[count];

    return (char)(sum/(N-2));
}

优点:

融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。

缺点:

测量速度较慢,和算术平均滤波法一样比较浪费 RAM 。

End:以上就是本次的分享。滤波算法有很多种,本文分享的是几种较为简单但却实用的。如有错误,欢迎指出!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 限幅滤波法
  • 中位值滤波法
  • 算术平均滤波法
  • 中位值平均滤波法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档