一阶低通滤波

一阶低通滤波

前言:在使用单片机开发中,常常会用到的外设包括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;                                                                               \
}
<think>好的,我现在需要解释什么是低通滤波。首先,我需要回想用户之前的问题,他们询问了如何在S7-200 SMART PLC中编写滤波程序,其中提到了低通滤波作为选项之。现在用户想更深入了解这个算法本身。 首先,我应该从基本定义开始。低通滤波种信号处理技术,用于去除高频噪声,保留低频信号。可能需要解释它的数学公式,也就是递推公式Yn = αXn + (1-α)Yn-1,这里α是滤波系数,Xn是当前输入,Yn是当前输出,Yn-1是上个输出。 接下来,需要说明参数α的作用。α介于0和1之间,不同的α值会影响滤波效果。当α较大时,响应速度快,但平滑效果差;α较小时,平滑效果好,但延迟增加。需要举例说明,比如α=0.1和0.5的区别,可能用具体场景比如温度或压力信号处理。 然后,应该联系到实际应用,比如在PLC中如何实现这个算法。用户之前看到的是移动平均滤波的例子,现在需要展示低通滤波的代码结构,使用类似的数据存储和计算方式。可能涉及变量定义、当前输入读取、计算输出值,并存储当前输出用于下次计算。 还需要比较低通滤波与其他滤波方法(如移动平均)的优缺点,强调其计算简单、内存占用少的优势,适合资源有限的PLC。同时,指出其相位延迟的问题,以及在实时控制中的注意事项。 用户可能想知道如何选择α值,这里需要给出调试建议,比如通过观察信号波形调整α,平衡平滑度和响应速度。可能提到经验值范围,如0.2到0.5,但具体情况具体分析。 另外,可能需要提到实际应用中的注意事项,比如数据类型转换(模拟量输入通常为整数,需转换为浮点数进行计算),以及如何处理异常值或超量程信号,确保滤波器的稳定性。 最后,确保回答结构清晰,分点说明,使用公式时用$$...$$格式,代码部分用代码块,并保持口语化但专业的中文表达。避免使用复杂术语,但又要准确传达概念。需要检查是否涵盖了所有关键点,并且没有错误信息。</think>### 低通滤波详解 #### 1. **基本定义** 低通滤波(First-Order Low Pass Filter)是种**信号平滑算法**,通过抑制高频噪声、保留低频有效信号实现滤波。其核心思想是**对当前输入信号和历史输出值进行加权平均**,使输出结果更平缓。 #### 2. **数学公式** 递推公式为: $$Y_n = αX_n + (1-α)Y_{n-1}$$ - $X_n$:当前输入值(原始信号) - $Y_n$:当前滤波输出值 - $Y_{n-1}$:上周期滤波结果 - $α$:**滤波系数**($0 < α < 1$),决定新旧数据权重 --- #### 3. **参数特性** | α值范围 | 滤波效果 | 适用场景 | |----------|----------------------------------|-----------------------| | α接近1 | 响应快,但平滑性差(保留更多高频)| 快速变化信号(如流量) | | α接近0 | 延迟大,但平滑性好(抑制高频噪声)| 慢速信号(如温度) | > **示例**: > - 若$α=0.2$,新数据权重20%,历史数据权重80%,滤波效果显著但延迟明显 > - 若$α=0.6$,新数据权重60%,响应更快但噪声残留较多 --- #### 4. **PLC实现步骤(S7-200 SMART)** ```pascal // STEP 1:定义变量 VAR Alpha: REAL := 0.3; // 滤波系数(默认0.3) RawValue: INT; // 模拟量原始值(如AIW0) ScaledValue: REAL; // 标定后的工程值 FilteredValue: REAL := 0.0; // 滤波输出值(需初始化) END_VAR // STEP 2:读取并标定输入值 RawValue := AIW0; // 读取模拟量输入 ScaledValue := (RawValue - 6400) / (27648.0 - 6400.0) * 100.0; // 例:4-20mA转0-100℃ // STEP 3:执行低通滤波 FilteredValue := Alpha * ScaledValue + (1 - Alpha) * FilteredValue; ``` --- #### 5. **关键优势与局限** - **优点**: - 计算量极小(仅1次乘法和加法) - 内存占用低(无需存储历史数据队列) - **缺点**: - 对突变的跃信号响应滞后 - 无法完全消除周期性高频噪声 --- #### 6. **调试技巧** 1. **初始值设置**: - 首次运行时,将$FilteredValue$初始化为第个采样值,避免启动震荡 2. **α值调参**: - 通过触摸屏或HMI在线修改α值,观察趋势图调整平衡点 3. **抗干扰增强**: - 结合硬件滤波(如RC电路)可进步提升效果 > **典型应用**: > - 温度传感器信号平滑(α取0.1-0.3) > - 压力波动抑制(α取0.4-0.6) > - PID反馈信号预处理(需注意相位延迟影响)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值