ADC常用的十大滤波算法(C语言)

简介: ADC常用的十大滤波算法(C语言)

a018ce63d517444183b79f1527863608.png


一、限幅滤波法


1、方法:

  • 根据经验判断两次采样允许的最大偏差值(设为A)
  • 每次检测到新值时判断:

a. 如果本次值与上次值之差<=A,则本次值有效

b. 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值


2、优点:

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


3、缺点

  • 无法抑制那种周期性的干扰
  • 平滑度差
/* A值根据实际调,Value有效值,new_Value当前采样值,程序返回有效的实际值 */
#define A 10
char Value;
char filter()
{
    char new_Value;
    new_Value = get_ad(); // 获取采样值
    if( abs(new_Value - Value) > A)   
        return Value;     // abs()取绝对值函数
    return new_Value;
}


二、中位值滤波法


1、方法:

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


2、优点:

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


3、缺点:

  • 对流量、速度等快速变化的参数不宜
#define N 11
char filter()
{
    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];
}


三、算术平均滤波法


1、方法:

  • 连续取N个采样值进行算术平均运算
  • N值较大时:信号平滑度较高,但灵敏度较低
  • N值较小时:信号平滑度较低,但灵敏度较高
  • N值的选取:一般流量,N=12;压力:N=4


2、优点:

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


3、缺点:

  • 对于测量速度较慢或要求数据计算速度较快的实时控制不适用
  • 比较浪费RAM
#define N 12
char filter()
{
    int sum = 0;
    for(count = 0; count < N; count++)
    {
        sum += get_ad();
    } 
    return (char)(sum/N);
}


四、递推平均滤波法


1、方法:

  • 把连续取N个采样值看成一个队列
  • 队列的长度固定为N
  • 每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
  • 把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
  • N值的选取:流量,N=12;压力:N=4;液面,N=4 ~ 12;温度,N=1 ~ 4


2、优点:

  • 对周期性干扰有良好的抑制作用,平滑度高
  • 适用于高频振荡的系统


3、缺点:

  • 灵敏度低
  • 对偶然出现的脉冲性干扰的抑制作用较差
  • 不易消除由于脉冲干扰所引起的采样值偏差
  • 不适用于脉冲干扰比较严重的场合
  • 比较浪费RAM
#define N 10
u16 value_buf[N];
u16 sum=0;
u16 curNum=0;
u16 moveAverageFilter()
{
    if(curNum < N)
    {
        value_buf[curNum] = getValue();
        sum += value_buf[curNum];
        curNum++;
        return sum/curNum;
    }
    else
    {
        sum -= sum/N;
        sum += getValue();
        return sum/N;
    }
}


五、中位值平均滤波法


1、方法:

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


2、优点:

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


3、缺点:

  • 测量速度较慢,和算术平均滤波法一样
  • 比较浪费RAM
char filter()
{
    char count, i, j;
    char Value_buf[N];
    int sum = 0;
    for(count = 0; count < N; count++)
    {
        Value_buf[count] = get_ad();
    } 
    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_buf[count];
    }
    return (char)(sum/(N-2));
}


六、限幅平均滤波法


1、方法:

  • 相当于“限幅滤波法”+“递推平均滤波法”
  • 每次采样到的新数据先进行限幅处理,
  • 再送入队列进行递推平均滤波处理


2、优点:

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


3、缺点:

  • 比较浪费RAM
#define A 10
#define N 12
char value, i = 0;
char value_buf[N];
char filter()
{
    char new_value, sum = 0;
    new_value = get_ad();
    if(Abs(new_value - value) < A)  
        value_buf[i++] = new_value;
    if(i==N)  
        i=0;
    for(count = 0; count < N; count++)
    {
        sum += value_buf[count];
    }
    return (char)(sum/N);
}


七、一阶滞后滤波法


1、方法:

  • 取a=0~1
  • 本次滤波结果=(1-a)本次采样值+a上次滤波结果


2、优点:

  • 对周期性干扰具有良好的抑制作用
  • 适用于波动频率较高的场合


3、缺点:

  • 相位滞后,灵敏度低
  • 滞后程度取决于a值大小
  • 不能消除滤波频率高于采样频率的1/2的干扰信号
/*为加快程序处理速度,取a=0~100*/
#define a 30
char value;
char filter()
{
    char new_value;
    new_value = get_ad();
    return ((100-a)*value + a*new_value);
}


八、加权递推平均滤波法


1、方法:

  • 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
  • 通常是,越接近现时刻的数据,权取得越大。
  • 给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低


2、优点:

  • 适用于有较大纯滞后时间常数的对象
  • 和采样周期较短的系统


3、缺点:

  • 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
  • 不能迅速反应交易系统当前所受干扰的严重程度,滤波效果差
/* coe数组为加权系数表 */
#define N 12
char code coe[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
char code sum_coe = {1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12};
char filter()
{
    char count;
    char value_buf[N];
    int sum = 0;
    for(count = 0; count < N; count++)
    {
        value_buf[count] = get_ad();
    }
    for(count = 0; count < N; count++)
    {
        sum += value_buf[count] * coe[count];
    } 
    return (char)(sum/sum_coe);
}


九、消抖滤波法


1、方法:

  • 设置一个滤波计数器
  • 将每次采样值与当前有效值比较:
  • 如果采样值=当前有效值,则计数器清零
  • 如果采样值>或<当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
  • 如果计数器溢出,则将本次值替换当前有效值,并清计数器


2、优点:

  • 对于变化缓慢的被测参数有较好的滤波效果,
  • 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动


3、缺点:

  • 对于快速变化的参数不宜
  • 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入交易系统
#define N 12
char filter()
{
    char count = 0, new_value;
    new_value = get_ad();
    while(value != new_value)
    {
        count++;
        if(count >= N) 
            return new_value;
        new_value = get_ad();
    }
    return value;
}


十、限幅消抖滤波法


1、方法:

  • 相当于“限幅滤波法”+“消抖滤波法”
  • 先限幅,后消抖


2、优点:

  • 继承了“限幅”和“消抖”的优点
  • 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统


3、缺点:

  • 对于快速变化的参数不宜
#define A 10
#define N 12
char value;
char filter()
{
    char new_value, count = 0;
    new_value = get_ad();
    while(value != new_value)
    {
        if(Abs(value - new_value) < A)
        {
            count++;
            if(count >= N) 
                return new_value;
            new_value = get_ad();
        }
        return value;
    }
}


目录
相关文章
|
27天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
52 4
|
4月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
110 1
|
29天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
78 8
|
29天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
76 7
|
5月前
|
算法
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
304 12
|
6月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
6月前
|
算法 C语言
C语言----判断n是否是2的次方数,利用到按位与&,算法n&(n-1)
C语言----判断n是否是2的次方数,利用到按位与&,算法n&(n-1)
|
6月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
123 7
|
6月前
|
算法 Java C语言
Java中的算法与C语言中的函数
Java中的算法与C语言中的函数
46 2
|
6月前
|
传感器 算法 定位技术
技术心得记录:常用的滤波算法
技术心得记录:常用的滤波算法
44 0