资讯详情

资讯详情

一阶低通滤波截止频率怎么选?从RC电路到数字滤波的完整指南

做嵌入式这些年一阶低通滤波可以说是跟PID一样高频出现的东西。不管你是给编码器测速信号去毛刺、给IMU数据降噪、把PWM的载波纹波磨平还是给ADC采样做抗混叠最后都会撞上同一个灵魂拷问截止频率到底设多少设高了滤完跟没滤一个样噪声照样活蹦乱跳设低了信号被拖出明显的滞后控制回路立刻给你脸色看。这篇文章就把这个选择题的完整思路掰开揉碎讲清楚还会带上RC电路和数字滤波的实际调参案例。这篇文章适合正在调嵌入式滤波算法的朋友、做马达控制和机器人项目的同学以及被“截止频率选多少”折磨过的硬件工程师。我会从一阶低通的本质讲起再到三个判断维度最后给几组可以直接套用的实战场景和排查经验。1. 一阶低通滤波到底在做什么1.1 从RC电路说起-3dB不是个玄学的点一阶低通最常见的物理实现就是一颗电阻串一颗电容信号从电阻进、电容出。它的传递函数是H(s) 1 / (1 sRC)其中RC就是时间常数τ。对应的截止频率公式是fc 1 / (2πRC)这个公式所有教科书上都写但我发现很多人只是背下来并没有真正理解它意味着什么。当输入频率等于fc时输出幅值衰减到输入的0.707倍也就是约-3dB。为什么拿-3dB当截止点因为在功率意义上这就是半功率点——输出功率掉了一半。这在学术上很严谨而在工程上更实用的理解是-3dB点大致就是“有用信号和噪声的楚河汉界”向左信号基本跟着走向右开始明显衰减。一阶滤波器的衰减特性是一个固定斜率频率每增加10倍衰减增加20dB。换个说法就是每倍频程衰减6dB。这个斜率很“温柔”不像理想滤波器那样一刀切。所以一阶低通从来不会给你“干净”的滤波效果它只能帮你把远离信号频段的噪声压下去离得太近的噪声它会连信号一起打折。1.2 相频特性才是被低估的大坑很多资料一上来就画幅频曲线但真正在控制系统里让工程师头疼的是相频特性。一阶低通的相移公式是φ -arctan(f / fc)。在截止频率处是-45°到10倍fc处已经接近-90°。这意味着什么呢我举个直观例子假设你把截止频率定在10Hz那么对于1Hz的信号相移大约是-5.7°对3Hz的信号相移约-16.7°对10Hz的信号直接就是-45°。在控制回路里相位就是稳定性的命根子。一个-45°的滞后可能直接吃掉系统一半的相位余量。我见过有人做伺服电机速度环为了把转速反馈滤得特别平把截止频率一路压到10Hz以下结果系统安静是安静了但你给一个阶跃指令电机开始来回振荡速度环根本锁不住——这就是相位滞后太多导致的。所以选截止频率时幅值衰减只是表面标准相位预算必须是深层标尺。1.3 时域视角上升时间是你为滤波付的“时间税”一阶系统的阶跃响应是y(t) 1 - e^(-t/τ)输出从10%升到90%大约需要2.2τ。把τ换算成截止频率上升时间大约是tr ≈ 0.35 / fc。这个式子特别实用。举个例子fc 100Hz时上升时间约3.5msfc 10Hz时上升时间直接变成35ms。也就是说你每把截止频率降低一个数量级就要多付出10倍的反应延迟。在很多实时控制场景里这35ms早够系统跑完三五个控制周期了滤波延迟可能比被控对象本身的惯性延迟还大。所以我在调参时总是提醒自己截止频率不是“噪声旋钮”它是一个定时炸弹的引线长度调节旋钮。你拧得越低延迟越大系统越不稳定。理解这一点后面所有选频思路才有了根基。2. 截止频率选择的三个判断维度坦白说任何“截止频率万能公式”都是骗人的。真正靠谱的做法是从三个维度分别推导再取交集。这三个维度是信号带宽、噪声频段、时延预算。2.1 从有用信号出发允许衰减量反推下限第一个维度是从有用信号看。你要保留的信号最高频率记为f_sig那么fc必须足够高否则信号本身就被削了。幅频响应的衰减公式是|H(f)| 1 / sqrt(1 (f/fc)²)如果要求信号最高频率处的衰减不超过某个百分比就能反推出fc的最小值。我整理了一张常用表直接抄作业就行信号最高频率处允许的幅值衰减所需的最小fc倍数1%基本无损fc ≥ 7 × f_sig3%轻微损失fc ≥ 4 × f_sig5%一般可接受fc ≥ 3 × f_sig10%有明显损失fc ≥ 2 × f_sig这个表的意思是如果你的有用信号带宽是100Hz而你对波形要求比较高、只允许衰减1%那fc至少要700Hz。如果你只是做个粗略的转速反馈允许10%的幅值损失那fc只需200Hz以上。但这里必须补一刀幅值衰减不是唯一约束。如果后续走的是PID控制回路相位滞后同等重要。工程上我一般遵循一个更朴素的经验——fc至少要取有用信号最高频率的5到10倍。这样才能保证真正关心的频段里幅值损失和相位滞后都在可控范围内。2.2 从噪声出发滤得动、滤不动要心里有数第二维度是噪声。一阶低通的衰减率是固定的20dB/decade所以它在频率轴上是个非常“温吞”的滤波器。要想把某处噪声衰减到足够小噪声频率和fc之间必须拉开至少一个数量级。举个例子假设信号带宽是1kHz你遇到一个10kHz的开关噪声。如果fc取2kHz那么10kHz处的衰减大约是20dB也就是噪声剩1/10效果明显。如果噪声频率只有3kHz离信号太近fc没法取2kHz以上去滤它否则信号也跟着遭殃——这时候一阶低通就力不从心了你需要二阶甚至更高阶的滤波器或者带阻滤波器。还有一点容易被忽略噪声通常不是单一频率。开关电源噪声往往带着基波和高次谐波数字电路串扰则可能是几十MHz级别的尖峰。对于高频尖峰一阶低通确实有不错的压制效果但对于那些紧贴信号频段的干扰一阶滤波器会为了滤掉噪声把整个信号频段都拖下水。所以先测噪声频谱再做决定比拍脑袋设个fc靠谱一万倍。2.3 从时延预算出发控制回路里别太贪心第三个维度是时延预算这是做实时控制的人最容易忽略的。一阶滤波器的相位滞后可以近似折算成时间延迟在远低于fc的频段群时延大约等于τ。比如fc 16Hzτ约10ms。如果你的控制周期是1ms而滤波本身引入10ms延迟相当于系统在“看10个周期之前的信号”这时候什么PID参数都救不回来。我做云台控制时就踩过这个坑。当时为了把陀螺仪数据滤得漂亮把截止频率调到15Hz左右结果云台动作总有明显的“黏滞感”手动推一下回中动作像慢放了。后来测了一下相位发现10Hz附近已经有30多度的相位滞后直接把响应带宽砍掉了。最后把fc提高到60Hz再用一个二阶巴特沃斯替代一阶才在噪声抑制和响应速度之间找到平衡。工程经验上滤波时间常数τ最好控制在控制周期的1/5到1/10以内。如果你控制周期是2ms那τ最多给0.2到0.4ms折算出fc至少得400Hz到800Hz以上。这显然和前面说的“fc等于信号带宽的5到10倍”可能冲突此时就需要多级滤波组合或者改用卡尔曼这类不需要纯靠相位补偿的算法。3. 几种常见应用场景的选频实战讲完理论来看几个我实际调过的场景。每个场景我会给出选择过程而不是直接扔结论这样换一个环境你也能自己推。3.1 PWM转模拟量、DA平滑有些场合需要用PWM模拟输出一个模拟电压后面接RC滤波把PWM的开关纹波磨平。比如PWM频率20kHz你想要输出的模拟信号带宽在1kHz以内。这时的约束有两个fc要远低于PWM频率把纹波衰减到可以接受fc要远高于1kHz别让输出信号变形。我会这样算如果允许PWM频率处衰减至少20dB那么PWM频率与fc的比值就要≥10所以fc ≤ 2kHz。同时信号带宽1kHz允许3%衰减时fc ≥ 4kHz两边一凑发现2kHz和4kHz之间有矛盾。实际处理是用一个折中先把fc取在2kHz这时候1kHz处信号衰减约8.5%对很多模拟输出应用完全够用同时对20kHz纹波衰减约20dB。如果这8.5%的衰减不能忍就把信号带宽降下来或者改用更高阶的有源滤波器而不是硬拧一阶的fc。另一种常见做法是PWM后先过一个运放二阶低通此时一阶RC只做粗滤二阶负责陡降fc分配上粗滤放在PWM频率的1/5左右二阶放在信号带宽的3到5倍。两级的截止频率错开之后纹波衰减很可观而信号频段基本无损。3.2 编码器测速与转速环滤波电机编码器测速最常用的方法是M法单位时间内数脉冲数换算转速。这个过程天然会产生量化噪声转速反馈信号往往带毛刺。滤波的难点在于编码器脉冲频率本身就是随转速变的。假设电机最高转速3000rpm编码器500线那么最高脉冲频率是25kHz。但转速信号的有效带宽其实很低通常不超过几十赫兹。因为电机机械系统的惯性决定了转速不可能快速突变。这时候fc选择主要看你对动态响应的要求。做速度环时我一般这样起调先估算速度环的期望带宽比如50Hz那fc至少要选100到150Hz以上否则速度环带宽根本做不出来。如果只做稳态测量、不参与闭环那fc选10到20Hz就很舒服转速曲线会非常平滑。有一个不起眼但很重要的点编码器低速时M法测速的量化噪声频率变低也许只有几Hz到几十Hz。此时固定fc可能要么滤不掉低速下的抖动要么把高速动态削掉。这种情况我会建议改T法测速或混合测速而不是继续跟滤波参数死磕。一阶低通只是个零件算法选型不合理滤波怎么调都是错。3.3 IMU、ADC采样去噪IMU传感器的原始数据如加速度计和陀螺仪通常带高频机械振动噪声。用在四轴飞控、两轮平衡车或云台上时常见做法是把原始数据过一阶低通。我的经验静态姿态测量比如倾角仪fc选20到50Hz滤得很干净响应也够用但动态姿态估计就不能这么低。做平衡车时陀螺仪角速度要参与控制回路fc我一般取30到60Hz再低车会“反应迟钝”一推就倒。加速度计融合角度时fc常取5到20Hz用于剔除运动加速度干扰但要注意它带来的滞后必须被互补滤波或融合算法吸收。ADC采样的噪声处理更看场景。比如直流电源的电压采样开关电源的纹波通常在几十kHz到几百kHz而你的控制系统带宽只有1kHz。此时fc取2到5kHz就足够把开关纹波压下去一大截同时完全不影响信号。但如果噪声是50Hz工频而你的信号刚好也在低频那千万别指望一阶低通老老实实用陷波器或长时间平均否则一阶会把信号和噪声一起滤成一条直线。3.4 控制回路平衡车、云台、无人机里的个人经验我做过好几轮自平衡小车这是最能体会“fc太高噪声大fc太低稳不住”的场景。第一版时我把陀螺仪Y轴数据fc直接设5Hz理由是噪声几乎看不见了曲线平得跟心电图变异了一样。结果车体一推就倒因为角速度反馈延迟太大控制器根本感知不到“正在倾倒”的趋势。后来把fc提高到30Hz配合互补滤波的姿态融合车体才真正站住。这个过程的教训是在控制回路里噪声感受是主观的稳定裕度是客观的。不要为了示波器上好看把系统的反应速度牺牲掉。我把个人经验整理成一张粗略表仅供参考应用场景典型fc范围验证方法转速静态显示5 ~ 20Hz看曲线平滑度速度环/电流环反馈100Hz ~ 1kHz由系统带宽决定平衡车姿态角20 ~ 50Hz手推车体看恢复云台/飞控角速度30 ~ 60Hz阶跃响应和振荡测试PWM模拟输出fc PWM频率/10示波器看纹波和波形ADC电压采样信号带宽×3 ~ 10对比滤前滤后频谱这张表不是让你直接照抄数字而是给你一个检查范围如果算出来的fc落到表格区间之外回头看是哪个约束没考虑到位。4. 从公式到器件RC电路怎么搭、数字滤波怎么算4.1 模拟RC的参数计算与阻抗坑模拟RC滤波的参数计算非常直接fc 1 / (2πRC)。实际操作时我先选电容再算电阻。因为电容值离散常用系列就那么几个而电阻可以在一定范围内凑。举个例子想要fc100Hz选C1μF那么R1/(2π×100×1e-6)≈1591Ω实际用1.5kΩ标准电阻算出来的fc约106Hz误差完全可接受。但这里有个比算公式更重要的坑RC滤波器的截止频率是在理想源和理想负载下定义的。实际电路里信号源内阻、后级负载阻抗都会参与进来让真实截止频率偏离理论值。举个真实例子你用单片机GPIO输出PWMGPIO的驱动能力有限可以看成带内阻的源。如果串了RC后直接进ADC而ADC的输入阻抗不够高比如只有20kΩ那么RC滤波器的放电回路就不再只走RC的C还走了ADC的输入电阻截止频率会升高滤波效果变差。尤其现代MCU的ADC输入是开关电容结构采样瞬间会从外部取电荷等效阻抗动态变化直接接RC容易导致采样误差。解决方法是RC后加一级运放缓冲让滤波器的负载变成运放的极高输入阻抗再用运放低阻输出驱动ADC。或者干脆用高阻输入的独立ADC芯片。这个“缓冲”细节在低频电路里可能无所谓但在毫伏级小信号、高精度采样场景下直接影响最终精度。4.2 数字一阶低通的系数换算数字一阶低通是最常见的IIR滤波器公式是y[n] α × x[n] (1 - α) × y[n-1]关键在于α怎么取。最准确的是用指数形式α 1 - e^(-2πfc/fs)其中fs是采样率。当fc远小于fs时可以用近似式α ≈ 2πfc/fs这是很多人偷懒用的简化公式。我实际测过这两种公式的差别fc10Hzfs1000Hz时精确α≈0.061近似α≈0.0628误差不到3%完全够用。但当fc100Hzfs1000Hz时精确α≈0.469近似α≈0.628误差已经30%以上这时候再用近似公式就废了。所以使用条件必须记住只有fc低于fs的1/20左右近似公式才可靠。给一段可直接用的C语言实现typedef struct { float alpha; float y_prev; } lowpass_t; float lowpass_update(lowpass_t *f, float x) { f-y_prev f-alpha * x (1.0f - f-alpha) * f-y_prev; return f-y_prev; }初始化时把y_prev设为第一个输入值避免启动阶段的突跳。数字滤波还有一个很隐蔽的坑α太小的时候单精度浮点会出问题。比如fs1000Hzfc1Hzα≈0.0062此时(1-α)≈0.9938输出值在更新时主要靠“旧的输出”撑着新输入贡献不到1%。单精度float在这种情况下做加减法有效位会逐渐丢失尤其当输入幅值较大而滤波后的变化很小时最后输出可能卡在某个值附近不动看起来像“死区”。解决办法是改用double或者每隔一段时间用双精度重算一次或者改用定点数并用高精度累积。4.3 验证方法扫频与阶跃响应实测调完参数怎么知道截止频率真的对了最直接的办法是扫频信号发生器输出不同频率的正弦波幅度固定用示波器或万用表测输出幅度找到输出是输入0.707倍的那个频率点。这个方法虽然笨但绝对可靠适合模拟滤波器。手头没有信号发生器时有另一个更实用的技巧输入方波测输出上升时间tr然后用fc ≈ 0.35 / tr反推截止频率。比如你用RC滤波接一个方波测出输出从10%升到90%用了3.3ms那fc≈0.35/0.0033≈106Hz。这个思路在数字滤波上同样可用在代码里喂一个阶跃输入打印输出曲线直接从曲线读上升时间即可反推有效fc。我经常在客户现场没有示波器的情况下靠一个蓝牙串口把数字滤波器的输出曲线传到电脑肉眼数从10%到90%用了多少个采样周期就当场把fc反推出来了。这个方法推荐给所有做嵌入式调参的人简单粗暴但救命。5. 常见问题与排查实录5.1 滤了和没滤一样多半是截止频率太高这是最常见的问题尤其是数字滤波刚上手的人。症状滤波前后的信号在示波器上几乎重合噪声一点没少。排查思路很简单先确认α换算对不对。很多人顺手填一个α0.1然后以为滤波生效了实际上α0.1时如果fs10kHz对应fc约159Hz如果你的噪声是几百Hz到几千Hz那它根本被滤不掉多少。正确做法是先明确噪声频段再反推fc再换算α每一步都写清楚。另一种可能是RC滤波器位置放错。比如RC接到一个高阻源后面信号源内阻已经参与了滤波实际fc比计算值低很多或高很多导致表现不对。这时候直接拿万用表测RC两端或者用信号注入法看转折点就能定位问题。5.2 信号变“肉”、控制振荡检查时延是不是太大了症状信号是光滑了但从波形看明显“软”了阶跃响应爬得很慢控制系统则表现为响应迟钝、流程慢甚至不稳定的自激振荡。这时候第一件事不是调PID而是测一下滤波带来的时延。按我前面给的方法fc10Hzτ≈16ms上升时间35ms。如果控制周期只有2ms这个延迟足够让系统发疯。解决方案要么提高fc要么用更高阶的滤波以同样的衰减换取更小的相位滞后要么换成卡尔曼滤波。我见过有人把转速环滤波fc从100Hz降到20Hz噪音确实小了很多但速度环的阶跃响应从30ms拖到200ms负载一变就剧烈抖动。后来把fc拉回80Hz再用一个低通给转速微分做平滑系统才恢复正常。记住滤波永远要放在“系统带宽需要”这个约束框里选。5.3 换采样率后截止频率漂移数字滤波的α是相对采样率的。你把采样率从1kHz改成5kHzα还保持不变那实际fc就不声不响地变了5倍。这在调试过程中非常隐蔽因为程序看起来没改滤波效果却突然“好”或突然“差”。排查方法也很简单把采样率、α和fc三个值列出来用公式互算一遍。我在工程里习惯把α的换算单独写成一个函数输入fc和fs自动算出α每次改采样率的时候强制自己更新一次配置避免出现这种静默漂移。5.4 一阶滤不掉紧贴信号的噪声一阶滤波器的滚降只有20dB/dec对紧贴信号频段的干扰几乎无能为力。有人想把fc调低来强滤结果信号也被削得面目全非。正确的思路是升级滤波器阶数。二阶巴特沃斯在相同fc下对10倍频处能衰减40dB比一阶多20dB。或者用多个一阶级联但要注意级联后的截止频率不再是单个的fc需要整体重新标定。还有一种选择是陷波器专治单频干扰。我的建议是只要噪声中心频率和信号带宽的比值小于5就别考虑用一阶去硬扛换结构比调参有效率得多。问题现象最可能的根因排查/解决动作滤波前后没区别fc太高 / α换算错 / RC位置错测噪声频段反推fc信号变软、系统振荡fc太低导致时延过大测上升时间提高fc或换高阶换采样率后效果突变α没随fs同步更新用公式重算α噪声滤不干净且信号变差噪声离信号太近一阶无能为力换高阶/陷波器/卡尔曼最后说点我自己的习惯。截止频率从来不是一个孤立的数字它必须跟采样率、控制周期、信号带宽、噪声频谱放在同一张纸上算。每改一次fc我至少要确认三个参数有用信号会不会被削、噪声能不能被压下去、延迟在不在预算里。这三个问题都能回答“可以”这个截止频率才算真正选对了。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →