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

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

原理

一阶滤波,又叫一阶惯性滤波,或一阶低通滤波,软件实现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.dtcms.com/a/12727.html

相关文章:

  • C/C++实现植物大战僵尸(PVZ)(打地鼠版)
  • Qt (16)【Qt 事件 —— Qt 事件简介 | 如何重写相关的 Event 函数】
  • 【D3.js in Action 3 精译_023】3.3 使用 D3 将数据绑定到 DOM 元素
  • 计算机网络 第三章: 点对点协议
  • 应用案例分享 | 智驾路试数据分析及 SiL/HiL 回灌案例介绍
  • VMware Fusion虚拟机Mac版 安装Ubuntu操作系统教程
  • 车载软件架构 --- 什么是CI/CD?(科普篇)
  • cmd命令
  • c++ #include <memory> 智能指针介绍
  • linux-系统管理与监控-日志管理
  • 企业项目中响应工具类
  • Python编程 - 线程
  • ARM/Linux嵌入式面经(三四):CVTE
  • [数据集][目标检测]岩石种类检测数据集VOC+YOLO格式4766张9类别
  • 怎么使用ai 免费生成ppt?这4个工具可以帮忙
  • C++速通LeetCode简单第20题-多数元素
  • Java基础-反射
  • MySQL之安装与基础知识
  • 【贪心算法】贪心算法
  • 自动化抢票 12306
  • STL-vector练习题
  • python Open3D 验证安装崩溃
  • 认识原码反码补码
  • C# 入坑JAVA 潜规则 大小写敏感文件名和类名 枚举等 入门系列2
  • Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享
  • Vite + Electron 时,Electron 渲染空白,静态资源加载错误等问题解决
  • 华为SMU02B1智能通信电源监控单元模块简介
  • LabVIEW机械手视觉引导系统
  • RedisTemplate操作ZSet的API
  • C/C++语言基础--从C到C++的不同(上)