一阶低通滤波

2023-11-16

一阶低通滤波

前言:在使用单片机开发中,常常会用到的外设包括ADC采样。而采样必然会伴随这随机干扰引起的毛刺噪声,对于需要捕捉采样值突变的系统来说尤其需要减小毛刺突变的影响。从硬件电路和软件算法上都能一定程度的减少噪声达到滤波的目的,本文主要讲解软件使用低通滤波算法来滤波ADC采样值的方法。

一阶低通滤波(又叫惯性滤波)算法

算法原理

  滤波算法公式:
Y(n) = a * X(n) + (1 - a) * Y(n - 1)

Y(n):本次滤波结果。
a:滤波系数。取值范围为0~1, 值越小越稳定,越大越灵敏。
X(n):本次采样值。
Y(n - 1):上次滤波结果。

C代码实现
//一阶低通滤波
#define FO_LOW_PASS_FILTER_SENSITIVE_a                   0.8f                        //一阶低通滤波系数取值范围为(0,1)。值越小越稳定,越大越灵敏,二者难兼顾。
#define FO_LOW_PASS_FILTER_STEADY_a                      0.15f
//输入Adc采样值,输出低通滤波值
//优点:调节精细,稳定度和灵敏度偏向分明。缺点:带有浮点运算
#define FOLowPassFilter(AdcSample, a)                                                                                                       \
{                                                                                                                                           \
    g_u16FOLowPassFilterResult = (uint16_t)(a * AdcSample + (1 - a) * g_u16FOLowPassFilterResultL);                                         \
    g_u16FOLowPassFilterResultL = g_u16FOLowPassFilterResult;                                                                               \
}
一阶低通滤波算法特点
1. 相比于硬件滤波,软件滤波节省成本,可靠性高,滤波范围可以由软件任意修改(硬件需要考虑阻抗匹配问题)。  
2. 一阶低通滤波运算量小,需要调节的参数少,易于软件实现和单片机快速处理,是实时性强的滤波。  

使用一阶低通滤波算法的缺点:
1. 滤波系数越小,滤波结果越稳定,滤波系数越大结果越灵敏。稳定性和灵敏性二者难兼顾。

算法改进

系数a取较小值时(偏稳定)

在这里插入图片描述

  图中蓝色表示原始ADC采样值,橙色为滤波后的值,其他图片也这样。当电压不变化时采集到的ADC采样值实际存在很多毛刺噪声,选取较小的a值则能有效减小毛刺的幅度,使信号趋于稳定,防止误判。

在这里插入图片描述
在这里插入图片描述

  选取较小a值时,稳定段过滤很多毛刺噪声,但灵敏性(跟随性)较差,信号幅度变化明显时滤波结果明显滞后,且无法达到波峰波谷值。

系数a取较大时(偏灵敏)

  特点与a较小时相反,滤波结果有较好的跟随性,但消除毛刺噪声能力差。

使用动态系数

  既然一阶低通滤波无法同时兼容滤波的稳定性和灵敏性, 那么我们可以根据实际情况,在采样值较低且变换幅度较小时使用小系数偏稳定性,当检测到采样值大于一定范围且增幅明显时立刻且大系数偏灵敏性。

代码示例:

#define Filter(AdcSample)                                                                                               \
{                                                                                                                       \
    if(g_u16AdcSampleVal > g_u16AdcInitBaseVal)                                                                         \
    {                                                                                                                   \
        if((DifferenceAbs(g_u16AdcSampleVal, g_u16AdcSampleValL) <= ADC_SAMPLE_LARGE_JUMP)   /*采样值无大幅度跳变*/     \
         && (DifferenceAbs(g_u16AdcSampleVal, g_u16AdcSampleValLL) <= ADC_SAMPLE_LARGE_JUMP))                           \
        {                                                                                                               \
            FOLowPassFilter(AdcSample, FO_LOW_PASS_FILTER_STEADY_a);      /*一阶低通滤波,偏稳定*/                       \
        }                                                                                                               \
        else                                                                                                            \
        {                                                                                                               \
            FOLowPassFilter(AdcSample, FO_LOW_PASS_FILTER_SENSITIVE_a);   /*一阶低通滤波,偏灵敏*/                       \
        }                                                                                                               \
    }                                                                                                                   \
    else                                                                                                                \
    {                                                                                                                   \
        FOLowPassFilter(AdcSample, FO_LOW_PASS_FILTER_STEADY_a);          /*一阶低通滤波,偏稳定*/                       \
    }                                                                                                                   \
}

效果展示:
[外链图片转存失败(img-PZAXWohS-1569312974471)(.\png\动态系数兼顾稳定性和灵敏度.png "动态系数")]
[外链图片转存失败(img-hBVXKAf4-1569312974471)(.\png\a0.3.png "兼顾稳定和灵敏")]

算法改进

  以下算法时一阶低通滤波的变形,可以避免单片机做浮点运算,如果你的单片机浮点运算的性能较差可以使用该变形公式。这个公式不是我发明的,是由一个大佬传授给我的,我将其拿出来分享。

//一阶低通滤波变形
#define FO_LOW_PASS_FILTER_EXTERN_SENSITIVE_a            1u                          //值越大越稳定,越小越灵敏,二者难兼顾。
#define FO_LOW_PASS_FILTER_EXTERN_STEADY_a               7u 
//一阶低通滤波变形,此方法为网上借鉴
//优点:无浮点运算。缺点:调节粗糙。
#define FOLowPassFilterExtern(AdcSample, a)                                                                                                 \
{                                                                                                                                           \
    g_u16FOLowPassFilterResult = AdcSample + g_u16FOLowPassFilterResultL * a;                                                               \
    g_u16FOLowPassFilterResult = g_u16FOLowPassFilterResult / (a + 1);                                                                      \
    g_u16FOLowPassFilterResultL = g_u16FOLowPassFilterResult;                                                                               \
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一阶低通滤波 的相关文章

  • 自己写不出代码我该怎么办

    在作业和练习中 自己写不出代码 这是一个在学习中经常出现的问题 那么该怎么解决这个问题呢 1 先分析实现的思路 拿到作业 按照要实现的功能 先分析去实现的思路 如果完全不知到该怎么去实现 完全是一头雾水 那最好就先看看其他人是如何实现的 或

随机推荐

  • simulink的模块封装与解封装

    MATLAB Simulink 使用技巧 模块封装 简单 1 新建或者打开Simulink仿真环境 2 选择需要封装的部分 单击鼠标右键选择 create subsystem 选项即可封装模块 MATLAB Simulink 使用技巧 模块
  • 在微信小程序中 使用uView rules 表单校验 validator 不起作用(无效)

    注意 如果需要兼容微信小程序 最好通过setRules方法设置rules规则 onReady 如果需要兼容微信小程序 并且校验规则中含有方法等 只能通过setRules方法设置规则 this refs form1 setRules this
  • Sublime4如何自定义代码补全内容

    1 先进入如下文件夹 2 这里举C 为例子 其他语言类似 创建C 文件夹 并在C 文件夹内创建Snippets文件夹 3 在Snippets文件夹下创建以 sublime snippet为后缀的文件 4 在文件中自定义代码补全的信息
  • vue 在style标签中使用变量

    1 定义变量 export default data return 背景y颜色 backgroundColor 00f 字体颜色 fontColor f00 2 在HTML中设置CSS使用的变量
  • [深入研究4G/5G/6G专题-22]: 5G NR开机流程3.4 - MAC层对SIB1的调度 - SIB1消息的格式与内容

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 前置条件 第1章 SIB1消息的格式 内容解析
  • Android sqlite常见sql语句

    创建一个测试表man select from man 查询man表所有信息 select from man where name like 四 删除操作 delete from man where name lucy2 部分字段查询 sel
  • java.sql.SQLException: The user specified as a definer (‘combined‘@‘%‘) does not exist

    java sql SQLException The user specified as a definer combined does not exist 今天我把公司的项目拷回来处理一些遗留的问题 文明的我 爆了粗口TMD 罪过罪过 话不
  • React中高阶组件、Render props、hooks

    这三者都是react中解决代码复用的主要方式 1 HOC 在官方解释中 高阶组件 HOC 是 React 中复用组件逻辑的一种高级技巧 HOC自身不是 React API 的一部分 它是一种基于 React 的组合特性而形成的一种设计模式
  • springCloud整合 Hystrix熔断器(配置)

    springCloud整合 Hystrix熔断器 文章目录 springCloud整合 Hystrix熔断器 前言 一 添加Hystrix依赖 二 properties文件开启熔断器 三 为调用另一个服务的接口添加实现类 前言 在分布式环境
  • Qt Installer Framework使用教程:

    步骤一 下载并安装Qt Installer Framework工具 http download qt io official releases qt installer framework 将安装目录添加到环境变量 如安装D盘时D Qt Q
  • 狂神说 MyBatis 笔记

    这里写目录标题 Mybatis 1 简介 1 1 什么是MyBaits 1 2 持久话 1 3 持久层 1 4 为什么需要Mybatis 2 第一个Mybatis程序 2 1 搭建环境 2 2 创建一个模块 2 3 编写代码 2 4 测试
  • 二分插入排序(c语言)

    一 什么是二分插入排序 二分法插入排序 简称二分排序 是在插入第i个元素时 对前面的0 i 1元素进行折半 先跟他们中间的那个元素比 如果小 则对前半再进行折半 否则对后半进行折半 直到left
  • <02-01-01> Spring IoC容器与Bean介绍(Introduction to the Spring IoC Container and Beans)

    上一篇 02 01 控制反转容器 The IoC Container 本章介绍了Spring 框架对控制反转 Inversion of Control IoC 设计原则的实现 IoC也被称为依赖注入 Dependency Injection
  • SpringBoot配置多个mysql数据源

    当我们在进行数据库分库分表操作是可能会需要到多个数据库 那么我们就需要对多个数据库的数据源进行配置 整理一下 今天在SpringBoot框架下多个数据源的配置过程 两个为例 1 配置数据库信息 在yml配置文件中配置需要的数据库信息 spr
  • 分布式理论基础:CAP和BASE

    CAP定理 分区 在分布式系统中 不同的节点分布在不同的子网络中 由于一些特殊的原因 这些子节点之间出现了网络不通的状态 但他们的内部子网络是正常的 从而导致了整个系统的环境被切分成了若干个孤立的区域 这就是分区 CAP定理 CAP原则又称
  • opencv-python中 boundingRect(cnt)以及cv2.rectangle用法

    转自 http blog csdn net zhangxb35 article details 47275277 矩形边框 Bounding Rectangle 是说 用一个最小的矩形 把找到的形状包起来 还有一个带旋转的矩形 面积会更小
  • 实用常识

    WolframAlpha是开发计算数学应用软件的沃尔夫勒姆 Wolfram 研究公司基于科学计算软件Mathematica开发出的新一代的搜索引擎 试图挑战Google搜索引擎的地位 能根据问题直接给出标准化答案的网站 比如输入一种材料名称
  • iOS开发 多线程的高级应用-信号量semaphore

    在iOS开发的道路上 多线程的重要性不言而喻 大部分我们都停留在基础的使用上面 缺乏高级应用 缺乏提升 是因为我们面对他太少 复杂的事情重复做 复杂的事务基础化 差距就是这样拉开了 言归正传 今天讲讲GCD的高级应用之信号量篇 一 信号量的
  • CMake使用小结

    CMake使用小结 指定本地库的位置 set Qt5 DIR path list APPEND CMAKE PREFIX PATH Qt5 DIR 设置编译输出的路径 set CMAKE ARCHIVE OUTPUT DIRECTORY D
  • 一阶低通滤波

    一阶低通滤波 前言 在使用单片机开发中 常常会用到的外设包括ADC采样 而采样必然会伴随这随机干扰引起的毛刺噪声 对于需要捕捉采样值突变的系统来说尤其需要减小毛刺突变的影响 从硬件电路和软件算法上都能一定程度的减少噪声达到滤波的目的 本文主