[经验分享] 一阶低通滤波算法

[复制链接]
 楼主| alvpeg 发表于 2025-4-18 22:24 | 显示全部楼层 |阅读模式
大家好,又见面了,我是你们的朋友全栈君。

1. 一阶滤波算法的原理
一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。

一阶低通滤波的算法公式为:

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

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

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

2. 一阶滤波算法的程序(适用于单个采样)


  1. #define a   0.01                // 滤波系数a(0-1)



  2. char value;                    //滤波后的值

  3. char new_value;                 //  新的采样值



  4. char filter()

  5. {

  6. char new_value;

  7. new_value = get_ad();

  8. return 0.01*value + (1-0.01)*new_value;

  9. }


3. 一阶滤波算法的不足
1. 关于灵敏度和平稳度的矛盾

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

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

      一阶滤波无法完美地兼顾灵敏度和平稳度。有时,我们只能寻找一个平衡,在可接受的灵敏度范围内取得尽可能好的平稳度。而在一些场合,我们希望拥有这样一种接近理想状态的滤波算法。即:

     当数据快速变化时,滤波结果能及时跟进(灵敏度优先);

     当数据趋于稳定,在一个固定的点上下振荡时,滤波结果能趋于平稳(平稳度优先)。

2. 关于小数舍弃带来的误差

    一阶滤波算法有一个鲜为人知的问题:小数舍弃带来的误差。 比如: 本次采样值=25,上次滤波结果=24,滤波系数=10, 根据滤波算法:

      本次滤波结果=(25*10+24*(256-10))/256=24.0390625
    但是,我们在单片机运算中,很少采用浮点数。因此运算后的小数部分要么舍弃,要么进行四舍五入运算。这样一来,本例中的结果24.0390625就变成了24。假如每次采样值都=25,那么滤波结果***=24。也就是说滤波结果和实际数据一直存在无法消除的误差。

jackcat 发表于 2025-5-21 09:24 | 显示全部楼层
#include <stdio.h>

// 滤波系数
#define ALPHA 0.1

// 滤波函数
float lowPassFilter(float input, float *lastOutput) {
    float output = ALPHA * input + (1 - ALPHA) * (*lastOutput);
    *lastOutput = output;
    return output;
}

int main() {
    float lastOutput = 0.0; // 初始化上一次滤波输出值
    float inputSignal[] = {1.0, 2.0, 3.0, 4.0, 5.0}; // 输入信号
    int signalLength = sizeof(inputSignal) / sizeof(inputSignal[0]);

    // 对信号进行滤波
    for (int i = 0; i < signalLength; i++) {
        float output = lowPassFilter(inputSignal[i], &lastOutput);
        printf("Input: %.2f, Output: %.2f\n", inputSignal[i], output);
    }

    return 0;
}
tabmone 发表于 2025-5-21 10:26 | 显示全部楼层
当输入信号突然变化时,滤波器需要一段时间才能稳定下来,这段时间取决于滤波器的时间常数。
wilhelmina2 发表于 2025-5-21 10:40 | 显示全部楼层
在系统启动时,可忽略前几次滤波结果,或采用动态调整策略
dspmana 发表于 2025-5-21 11:31 | 显示全部楼层
在计算滤波输出时,确保分母不为零,避免除零错误。
wengh2016 发表于 2025-5-21 12:27 | 显示全部楼层
时间常数(τ = RC)决定了滤波器的响应速度
sdCAD 发表于 2025-5-21 14:49 | 显示全部楼层
在使用过程中,需注意滤波系数的取值范围、初始值的设定、响应速度与平滑效果的平衡等问题。
mickit 发表于 2025-5-21 16:14 | 显示全部楼层
一阶低通滤波器会引入一定的相位延迟,尤其是在接近截止频率的地方。这对实时性要求高的应用来说可能是不利的。
jtracy3 发表于 2025-5-21 16:38 | 显示全部楼层
一阶低通滤波是最简单有效的平滑算法
adolphcocker 发表于 2025-5-21 17:35 | 显示全部楼层
长期运行中,浮点数累积误差可能影响精度
lzbf 发表于 2025-5-21 19:24 | 显示全部楼层
采样频率的影响              
tabmone 发表于 2025-5-21 20:31 | 显示全部楼层
一阶低通滤波算法是一种常用的信号处理方法,用于去除信号中的高频噪声,保留低频信号
youtome 发表于 2025-5-21 21:15 | 显示全部楼层
若初始值与实际信号差异较大,可能导致滤波结果在起始阶段偏差明显
sheflynn 发表于 2025-5-21 22:12 | 显示全部楼层
在资源受限的嵌入式系统中,用整数运算替代浮点数。
mollylawrence 发表于 2025-5-21 22:36 | 显示全部楼层
在音频处理中,可能需要保留更多的高频成分,以保持音质。
mmbs 发表于 2025-5-23 09:45 | 显示全部楼层
在硬件实现时,需要考虑电路的设计,包括电阻和电容的选择,以及电路的布局和布线
linfelix 发表于 2025-5-23 11:38 | 显示全部楼层
一阶低通滤波器的基本思想是通过递归的方式,将当前采样值与上一次滤波输出值结合,从而得到平滑的输出结果。
uiint 发表于 2025-5-23 12:39 | 显示全部楼层
滤波系数的选择需要在灵敏度和平稳度之间找到平衡点
tabmone 发表于 2025-5-23 13:10 | 显示全部楼层
在固定点运算环境中,需特别注意数值溢出的问题。确保数据类型足够大以容纳所有可能的中间计算结果。
benjaminka 发表于 2025-5-23 13:44 | 显示全部楼层
不同的应用场景对滤波器的要求不同。例如,在传感器数据处理中,可能需要滤除高频噪声,同时保持信号的快速响应。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

1772

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部