当前位置: 首页 > article >正文

嵌入式常用算法之低通滤波算法

原理

一阶滤波,又叫一阶惯性滤波,或一阶低通滤波,软件实现RC低通滤波器的功能。

作用:

一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。

公式

Y(n)=αX(n)+(1−α)Y(n−1)

其中:α=滤波系数;X(n)=本次采样值;Y(n-1)=上次滤波输出值;Y(n)=本次滤波输出值。

特点:

  • 对于周期干扰有良好的抑制作用,比如采样电池电压,对于干扰电压瞬时突变有很好过滤效果;

  • 带来了相位滞后,导致灵敏度低(缺);

    不能滤除频率高于采样频率的二分之一(称为奈奎斯特频率)的干扰(例如采样频率为100Hz,则它不能滤除50Hz以上的干扰信号)(缺);

    滤波系数越小,滤波结果越平稳,灵敏度越低;

    滤波系数越大,灵敏度越高,但滤波结果越不稳定;

    一阶滤波无法完美地兼顾灵敏度和平稳度。有时,我们只能寻找一个平衡,在可接受的灵敏度范围内取得尽可能好的平稳度。而在一些场合,我们希望拥有这样一种接近理想状态的滤波算法。即:当数据快速变化时,滤波结果能及时跟进(灵敏度优先);当数据趋于稳定,在一个固定的点上下振荡时,滤波结果能趋于平稳(平稳度优先)。

  • 来源:一阶RC低通滤波算法原理与实现_rc 采样函数-CSDN博客

应用场景:

比如

ADC采集,有时会因为电路的噪声,在一瞬间出现电压的变大(小),为了过滤这类型的干扰,可以尝试采用低通滤波算法解决;

编码器数据采集,比如采用光电编码器,启动4倍频,这个倍频数据容易被干扰。由于干扰是瞬时等待,可以采用低通滤波算法

算法代码如下:

#include <stdio.h>

#define a 0.2

float lowPassFilter(float input) {
    // 静态变量,用于保存上一次滤波后的值
    static float previousFilteredValue = 0.0;
    // 根据采样系数计算滤波后的值
    float filteredValue = a * input +(1-a)* previousFilteredValue;
    // 更新历史滤波后的值
    previousFilteredValue = filteredValue;
    // 返回本次滤波后的值
    return filteredValue;
}

弄一个数据测试一下
 

#include <stdio.h>

#define a 0.2

float lowPassFilter(float input) {
    // 静态变量,用于保存上一次滤波后的值
    static float previousFilteredValue = 0.0;
    // 根据采样系数计算滤波后的值
    float filteredValue = a * input +(1-a)* previousFilteredValue;
    // 更新历史滤波后的值
    previousFilteredValue = filteredValue;
    // 返回本次滤波后的值
    return filteredValue;
}

int main() {
    float inputValues[] = {11,12,13,14,13,12,11,13,14,11,10,10.2, 11.5, 10.8, 99.1, 11.3,1.3,11.3};
    int numValues = sizeof(inputValues) / sizeof(inputValues[0]);

    for (int i = 0; i < numValues; i++) {
        float filteredValue = lowPassFilter(inputValues[i]);
        // 打印输入值和对应的滤波后的值
        printf("Filtered value for input %f is %f\n", inputValues[i], filteredValue);
    }

    return 0;
}

参考文章:

一阶RC低通滤波算法原理与实现_rc 采样函数-CSDN博客

算法学习笔记之一阶低通滤波算法_一阶低通滤波公式-CSDN博客

https://patents.google.com/patent/CN107425759A/zh


http://www.kler.cn/news/310983.html

相关文章:

  • libgit2编译
  • 智慧课堂学生行为数据集
  • 2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程
  • 达梦数据库导入xml迁移到达梦数据库大文件导致中断问题解决方案记录?
  • ESP8266+httpServer+GET+POST实现网页验证密码
  • 承兑汇票识别API 银行承兑汇票识别接口 电子承兑汇票识别sdk 多进程识别
  • 鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现
  • 使用python-pptx插入图片:将图片添加到幻灯片中并进行位置调整
  • 实战17-NavBar+Vip布局
  • 2024年9月python二级易错题和难题大全(附详细解析)(四)
  • Spring中存储Bean的常见注解
  • python的数据类型详解
  • MyBatis系统学习(三)——动态SQL
  • 简单题28-找出字符传中第一个匹配项的下标(Java and Python)20240918
  • ElasticSearch介绍+使用
  • 3. Python计算水仙花数
  • 利士策分享,赚钱与体重:一场关于生活平衡的微妙探索
  • 云计算服务的底层,虚拟化技术的实现原理
  • 假期学习--iOS 编译链接
  • 如何挑选一款性价比高的开放式耳机?高性价比宝藏蓝牙耳机推荐
  • 吸浮毛宠物空气净化器推荐,希喂、小米、有哈宠物空气净化器测评
  • 句子成分——每日一划(八)
  • 算法:30.串联所有单词的子串
  • 【MySQL】SQL语句的优化
  • Keil MDK5学习记录
  • 自定义Spring Security认证处理的完整解决方案
  • 2024ICPC第一场网络赛补题
  • 思通数科开源智能文档识别平台的核心功能
  • 在Linux服务器上如何实现自动化部署?
  • 【车载以太网】【SOME/IP】Wireshark 解析