打印
[经验分享]

一阶低通滤波算法

[复制链接]
2342|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alvpeg|  楼主 | 2025-4-18 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,又见面了,我是你们的朋友全栈君。

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

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

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

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

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

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


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



char value;                    //滤波后的值

char new_value;                 //  新的采样值



char filter()

{

char new_value;

new_value = get_ad();

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

}


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 | 只看该作者
在系统启动时,可忽略前几次滤波结果,或采用动态调整策略

使用特权

评论回复
5
dspmana| | 2025-5-21 11:31 | 只看该作者
在计算滤波输出时,确保分母不为零,避免除零错误。

使用特权

评论回复
6
wengh2016| | 2025-5-21 12:27 | 只看该作者
时间常数(τ = RC)决定了滤波器的响应速度

使用特权

评论回复
7
sdCAD| | 2025-5-21 14:49 | 只看该作者
在使用过程中,需注意滤波系数的取值范围、初始值的设定、响应速度与平滑效果的平衡等问题。

使用特权

评论回复
8
mickit| | 2025-5-21 16:14 | 只看该作者
一阶低通滤波器会引入一定的相位延迟,尤其是在接近截止频率的地方。这对实时性要求高的应用来说可能是不利的。

使用特权

评论回复
9
jtracy3| | 2025-5-21 16:38 | 只看该作者
一阶低通滤波是最简单有效的平滑算法

使用特权

评论回复
10
adolphcocker| | 2025-5-21 17:35 | 只看该作者
长期运行中,浮点数累积误差可能影响精度

使用特权

评论回复
11
lzbf| | 2025-5-21 19:24 | 只看该作者
采样频率的影响              

使用特权

评论回复
12
tabmone| | 2025-5-21 20:31 | 只看该作者
一阶低通滤波算法是一种常用的信号处理方法,用于去除信号中的高频噪声,保留低频信号

使用特权

评论回复
13
youtome| | 2025-5-21 21:15 | 只看该作者
若初始值与实际信号差异较大,可能导致滤波结果在起始阶段偏差明显

使用特权

评论回复
14
sheflynn| | 2025-5-21 22:12 | 只看该作者
在资源受限的嵌入式系统中,用整数运算替代浮点数。

使用特权

评论回复
15
mollylawrence| | 2025-5-21 22:36 | 只看该作者
在音频处理中,可能需要保留更多的高频成分,以保持音质。

使用特权

评论回复
16
mmbs| | 2025-5-23 09:45 | 只看该作者
在硬件实现时,需要考虑电路的设计,包括电阻和电容的选择,以及电路的布局和布线

使用特权

评论回复
17
linfelix| | 2025-5-23 11:38 | 只看该作者
一阶低通滤波器的基本思想是通过递归的方式,将当前采样值与上一次滤波输出值结合,从而得到平滑的输出结果。

使用特权

评论回复
18
uiint| | 2025-5-23 12:39 | 只看该作者
滤波系数的选择需要在灵敏度和平稳度之间找到平衡点

使用特权

评论回复
19
tabmone| | 2025-5-23 13:10 | 只看该作者
在固定点运算环境中,需特别注意数值溢出的问题。确保数据类型足够大以容纳所有可能的中间计算结果。

使用特权

评论回复
20
benjaminka| | 2025-5-23 13:44 | 只看该作者
不同的应用场景对滤波器的要求不同。例如,在传感器数据处理中,可能需要滤除高频噪声,同时保持信号的快速响应。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

1678

帖子

0

粉丝