ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

一阶低通滤波截止频率怎么选?从物理意义到工程实践全解析

一阶低通滤波截止频率怎么选?从物理意义到工程实践全解析 做嵌入式或者传感器信号处理的兄弟应该都被同一个问题折磨过手上拿到一个一阶低通滤波代码三分钟就写完了但那个截止频率到底填多少心里完全没底。我见过有人直接抄别的项目的参数有人干脆把截止频率设成采样频率的十分之一结果要么信号被滤得反应迟钝要么噪声纹丝不动最后还要花大把时间去调一个本来应该在设计阶段就想清楚的问题。这篇文章就把这个事彻底讲透从截止频率的物理意义到实际工程里怎么一步步选定再到选完之后怎么验证效果全部走一遍。不止给公式还解释为什么是这个数以及选错了会出现什么现象。适合刚接触滤波的新手也适合那些已经会调参数但一直没系统梳理过选值逻辑的工程师。1. 截止频率在工程上到底是个什么玩意很多资料一上来就扔出-3dB、-45度相位延迟这些概念把新手直接劝退了。其实截止频率的本质特别简单它就是你给信号画的一条分界线。频率低于这条线的信号基本能正常通过频率高于这条线的信号会被明显削弱。削弱的程度是逐渐过渡的不是悬崖式的一刀切这一点非常关键。在工程实践里我更喜欢把截止频率理解成你要信谁、不信谁的界碑。你手上测到的信号是由真实的有效信号和各种各样的噪声叠加在一起的。有效信号往往变化比较慢频率低而噪声往往变化快频率高。截止频率就是你告诉滤波器比这个频率变化还快的信息我默认它是垃圾给我滤掉。明白了这一点选截止频率的问题就从数学问题变成了一个物理判断的问题你的有用信息最多能变化多快还有个常见的误区是拿采样率来套截止频率。有人会看到公式fc 1/(2πRC)然后又听说采样定理说采样率要是信号频率的两倍以上就稀里糊涂地把截止频率设成采样率的几分之一。这是两码事。采样率解决的是多长时间采一次能不失真的问题截止频率解决的是哪些频率分量该留下哪些该干掉的问题。两者有关系但不是简单相除的关系。另一个让人容易犯迷糊的地方是阶数。一阶滤波只有20dB/十倍频程的衰减速率这意味着过了截止频率之后频率每升高10倍信号幅度才衰减到原来的十分之一。如果你面对的噪声频率跟截止频率非常接近一阶滤波基本压不住这时候不能光靠改截止频率来解决问题那会把有效信号也干掉而是要考虑换二阶甚至更高阶的滤波器。这个判断本身就是选截止频率的一部分工作。2. 选截止频率前的热身先算清楚你的有用信号和噪声2.1 有用信号到底有多慢这是整个选值流程的第一步也是最不该偷懒的一步。你需要知道你的传感器或者被测对象的有效信号最大能变化多快。这个信息通常可以从物理系统的特性里推算出来。我举个例子你做一个平衡小车用MPU6050读取倾角。车子的物理运动决定了倾角不可能在几毫秒内突变除非撞墙了。你可以估算一下车子倾角变化最快的情况也就是从垂直偏到接近倒下这个过程通常在几十到几百毫秒的尺度上对应的信号频率大概在几Hz以内。这时候你把滤波截止频率定在5Hz到20Hz之间从物理上就是合理的。再比如你要测温度哪怕是用响应很快的热电偶温度变化跟气流、热容量这些因素有关信号频率一般不会超过1Hz。你要是非把截止频率设成100Hz那等于没滤波热电偶输出的各种电气噪声会全部进来。我在实际项目里习惯用一个更精细点的办法把传感器静止放着记录一段数据FFT看一下噪声集中在哪个频段再做一次阶跃响应测试看看有用信号的最快上升沿有多快从上升沿能大致推算出信号的有效带宽。这样两个信息都掌握之后截止频率的选择空间就非常清楚了。2.2 噪声到底是从哪来的量级有多大搞清楚噪声来源是第二步。传感器噪声、电源纹波、电机PWM干扰、工频干扰这些噪声的特性完全不同对应的处理手段也不一样。如果你的系统里有一个强干扰源比如电机驱动板上的PWM频率是20kHz你就要提前算一下这个干扰会不会耦合进你的信号路径。噪声的量级也很关键。当噪声已经大到把信号完全淹没的时候你需要的不是纠结截止频率是50Hz还是60Hz而是先解决噪声源头的问题——屏蔽、接地、去耦。滤波只是后端兜底的手段不能指望它力挽狂澜。这里有个非常实用的技巧把原始信号和经过滤波的信号同时接到示波器上对比。如果滤波后的波形明显平滑了但毛刺还是很大说明噪声频段和信号频段有重叠或者噪声幅值太大超出滤波器的抑制能力这时候就要回过去处理源头的噪声。如果滤波后波形平滑了不少但动态响应慢了半拍那就是截止频率设得太低了。2.3 把两者画在同一张坐标上找到安全区最好的办法是把噪声频谱和信号频谱粗略地画出来。信号能量集中的区域是你的必须保留区噪声能量集中的区域是你的必须滤除区两者之间的空当就是你的截止频率可以待的地方。如果这两个区域离得很远比如信号在10Hz以内噪声在1kHz以上那截止频率在100Hz就很舒服十倍的频程余量给了你很大的容错空间。但如果两者挨得很近比如信号到100Hz噪声从200Hz就开始起来那你就要权衡了。把截止频率设低一点噪声压得多但信号也有损失设高一点信号保真但它比噪声也一起进来了。这种时候要根据信号的具体用途来做取舍比如是拿来开环控制还是闭环反馈是拿来显示看趋势还是做人机交互。3. 一个实战向的截止频率估算公式工程上最常用的RC一阶低通滤波电路截止频率表示为fc 1 / (2 * π * R * C)其中R是电阻值单位是欧姆C是电容值单位是法拉。这个公式是硬件RC滤波的基石所有在单片机里做软件一阶滤波的公式本质上也是在模拟这个RC电路的离散形式。我在软件滤波里习惯先根据截止频率算出对应的RC时间常数ττ 1 / (2 * π * fc)因为一阶低通滤波的阶跃响应公式是y(t) 1 - e^(-t/τ)这个τ直接告诉你系统对突变的响应速度。τ值越大滤波越平缓但响应也越慢。很多工程师只记住了τ和截止频率成反比却忽略了τ本身对系统动态性能的约束结果选出来的截止频率在频域上看着没问题但在时域上反应迟钝。举个例子你要求系统的阶跃响应要在50毫秒内达到90%那就要求1 - e^(-0.05/τ) ≥ 0.9解这个不等式要τ大约小于等于0.0217秒也就是21.7毫秒。换算成截止频率fc 1/(2πτ)大约是7.3Hz。也就是说如果系统要求在50毫秒内跟上信号变化截止频率就不能低于7.3Hz否则它天生就响应不过来。这个推演过程给了我一个很深的印象截止频率的选取从来不是只看噪声抑制效果时域响应性能是同等甚至更重要的约束条件。很多人在调试时发现滤波后信号发闷完全跟不上输入回头一算果然是截止频率定得太低了。在数字滤波器的实现里经常用的是一阶惯性滤波的离散形式y[n] α * x[n] (1 - α) * y[n-1]其中α是滤波系数取值范围在0到1之间它和截止频率的对应关系是α 2π * fc * Ts / (2π * fc * Ts 1)这里Ts是采样周期也就是1除以采样频率。这个公式是从双线性变换里推导出来的实测下来和严格的双线性变换结果差距很小工程上完全可以接受。反过来如果你手头有一个α要推算截止频率用fc α / (2π * Ts * (1 - α))这两个转换公式我每次做项目都会用到建议直接收藏。还有一点要注意上面的α和截止频率的对应关系是基于一阶系统的近似换算采样周期和截止频率差得太远——比如采样率极低导致fc超过采样率的一半公式会失真这时候要回头检查采样频率是否足够。4. 整套决策链路从需求到截止频率的完整推演我总结了这些年做项目的一套完整选值流程按顺序做下来基本不会出错建议新手照这个流程走一遍明确最严苛的动态要求系统对信号延迟容忍多少秒允许过度平滑吗估算法估算信号最大带宽写一个上升沿突变看滤波器阶跃响应的仿真识别并量化主噪声源传感器白噪声、PWM耦合、工频干扰要分开算计算安全区间信号带宽和噪声频率的几何中点附近取初值软件仿真验证用真实采集的数据段离线跑一遍滤波算法上板实测联调接信号源扫频或者直接跑系统观察时域波形这里我展开讲一下第五步。仿真这一步特别容易被省略但它的价值非常大。你可以用Python的scipy.signal.butter设计一阶低通滤波然后用filtfilt做零相位滤波先离线看看滤波后的波形效果。不过要注意filtfilt是零相位滤波会产生看起来信号没有延迟的假象这对于判断实际系统中的实时滤波效果是有误导的。正确的做法是用sosfilt模拟实时滤波或者直接在单片机上用实际的数据跑一下。我经历过一次教训用filtfilt做仿真觉得效果完美结果上板之后发现信号延迟大到控制环震荡就是因为在仿真阶段没考虑相位延迟的问题。上板实测时我还会专门做一个阶跃信号测试在输入上突然给一个大跳变看滤波后的信号从多少毫秒开始跟着动多少毫秒跟随到目标值附近。这个数据直接决定了系统能不能在你的控制周期里稳定工作。如果目标是10毫秒内跟上但滤波器的阶跃响应需要50毫秒那就必须要提高截止频率哪怕噪声稍微上来一点。5. 实际应用里的参数选值参考为了给没有经验的人一个抓手我把这些年见过的典型应用场景的推荐截止频率整理了一下。这些值不是拍脑袋来的每一个都对应着明确的物理约束。应用场景信号特征常见噪声来源推荐截止频率范围关键约束因素加速度计静态倾角测量变化极慢1Hz高频机械振动2~10Hz响应速度与稳定性平衡陀螺仪角速度反馈动态中等10~50Hz高频抖动噪声30~80Hz控制环延迟要求电池电压采集变化很慢10HzDC-DC开关纹波低至喊着相位误差vs纹波抑制电机电流采样动态快100HzPWM开关噪声500~2000Hz需要同步采样配合温度传感器读数极慢0.5Hz环境电磁干扰0.5~5Hz热惯性主导信号变化率看到这里你可能注意到了电机电流采样的截止频率动辄上千赫兹跟前面那些几赫兹的完全不同。这是因为电机控制里的电流环需要很高的带宽来保证动态性能此时单纯靠一阶滤波压制PWM噪声是不够的通常在硬件上用电流传感器本身的带宽限制加差分采样来解决软件滤波只能作为辅助。这也再次印证了我前面的观点选截止频率一定要结合具体的应用维度来看不能拿一个固定的经验值套所有场景。6. 那些让我栽过跟头的边界情况与各种坑6.1 RC参数实际值选不到怎么办硬件RC滤波设计时经常会遇到算出了截止频率但是找不到匹配的电阻电容值。比如算出来需要fc159Hz取R1kΩ则C1/(2π×1000×159)≈1μF这个组合正好是经典参数但如果算出来是一个很尴尬的值比如需要C0.47μF发现手边只有0.33μF和0.68μF这时候我会在保证截止频率基本不变的前提下重新匹配R。更重要的是电容的等效串联电阻ESR和等效串联电感ESL在高频下会影响实际滤波效果高频纹波可能直接通过电容漏过去。我在一个精密测量项目上就吃过这个亏设计上计算得很完美结果实际测出来高频毛刺根本没被滤掉换用低ESR的陶瓷电容后问题才解决。大容量电解电容在高频下的表现远不如中小容量陶瓷电容。6.2 数字实现精度和信号调理的细节纯软件的一阶低通滤波如果α取得特别小比如低于0.01会碰到一个很头疼的问题由于单片机浮点精度有限每次运算对输入的响应可能远小于量化单位导致滤波输出长时间不变或者产生极限环振荡输出在某个值附近来回跳。解决办法是把中间累加过程放到整型或者高精度浮点里计算或者定点化处理把α放大成整数再用移位来实现。另一个容易忽视的细节是传感器输出本身的输出阻抗。如果你用一个RC滤波器接在传感器输出端RC里的R会和传感器的输出阻抗串联分压导致实际截止频率和设计值不一样。我实测过一次传感器输出阻抗2kΩ设计时只算了自己加的1kΩ电阻结果实际截止频率比设计低了很大一截。正确做法是把源阻抗纳入计算或者在传感器输出后面先加一级缓冲器比如运放电压跟随器再做滤波。6.3 截止频率接近采样频率时的诡异现象如果你习惯性把截止频率设得特别靠近采样率的一半一阶低通滤波会出现频率混叠问题。当输入信号中含有接近或超过奈奎斯特频率的高频成分时这些成分会被折叠到低频段跟有效的低频信号混在一起这时候滤波效果会变得非常奇怪输出波形上会出现一些低频的波动但这些波动的根源其实在高频噪声。解决办法有两个一是确保采样率足够高让信号频段和折叠频段分开二是在ADC采样的硬件层面加一层抗混叠滤波。单片机的ADC采样通常没有这个功能所以做信号调理时硬件上保留一级简单的RC低通来把超高频成分先干掉再进ADC到数字域里再按你的需要设截止频率做精细滤波。7. 做完选型之后还要不要关注相位问题一阶低通滤波在每个频率点都会带来相位滞后在截止频率处恰好是45度频率超过截止频率后逐渐趋近90度。在只需要读取幅值的应用里比如显示、记录相位问题无所谓。但在闭环控制系统里相位滞后等于给系统增加了一个延迟环节会蚕食你的相位裕量严重时直接导致控制环路震荡。具体的表现非常典型系统在静止时很稳但一旦给定的目标值发生变化或受到扰动输出就会出现持续振荡而且无论你怎么调PID参数都压不住。这时候你就要怀疑是不是滤波器的相位延迟在捣鬼。我的习惯是在控制环路的反馈通道里默认不做高延迟滤波只做轻度滤波把重滤波放在外层的人机交互或者监测通道里。如果控制上确实需要比较重的滤波可以考虑用更高阶的贝塞尔滤波器它在通带内的相位延迟更平直但实现复杂度也会高不少属于进阶方案了。我的经验是先用一阶把系统跑通如果有余量再考虑要不要上贝塞尔。截止频率的选取本质上是信噪比和动态响应之间的一个工程权衡。你不可能既要它滤得干净又要它反应飞快这个物理限制永远跳不过去。我见过很多新手把这个过程搞反了先写代码再调参数调不出来就怀疑滤波器不够好然后强行上高阶。其实正确的流程是先把需求分析清楚然后计算出应该在哪个频率段上做分割最后才落到滤波器的具体实现上。按这个顺序走哪怕算出来的初值不完全合适调试起来也就是微调的问题而不是推翻重来。
返回列表