新闻详情

新闻详情

首页 / 资讯中心 / 详情

一阶低通滤波器公式推导:从RC电路到数字实现

发布时间:2026/10/1 3:06:07来源:尧图网络
一阶低通滤波器公式推导:从RC电路到数字实现
1. 从一个被问烂了的问题说起为什么非要自己推一遍做嵌入式或者硬件方向的朋友几乎都绕不开一阶低通滤波器。你在网上搜“一阶低通滤波器”能搜到一大堆现成的公式截止频率等于二派RC分之一传递函数长这样那样代码里一个加权平均就完事了。看起来很简单简单到很多人直接抄了公式就用从来没想过这个公式是怎么来的。我刚开始接触的时候也是这样。项目里需要给ADC采样值做平滑同事甩给我一行代码说“这是一阶低通系数自己调”我就调了调系数发现数值确实变平滑了然后就交差了。直到有一次我调出来的滤波器在某个频段上衰减得完全不符合预期我才意识到——我根本不知道那个系数和截止频率之间到底是什么关系也不知道我调的到底是什么东西。后来我花了一个下午从最基础的RC电路开始把一阶低通滤波器的公式从头推了一遍。推完之后的感觉是以前很多模模糊糊的地方一下子通了。比如为什么叫“一阶”为什么截止频率处增益是0.707而不是0.5为什么数字实现里那个系数和采样周期有关这些问题在推导过程中全都有答案。这篇文章就是把我当时推导的过程、中间踩过的坑、以及推导完之后对实际应用的理解完整地整理出来。不管你是刚学信号处理的学生还是做了几年嵌入式但一直没深究过滤波器原理的工程师我相信这篇内容都能帮你把这块知识补扎实。推导本身不难难的是把每一步的物理意义和工程含义讲清楚这正是我想做的事。2. 先把RC电路摆上台面物理直觉比公式更重要2.1 为什么从RC电路开始而不是直接写传递函数很多人一上来就写传递函数H(s)等于一比上一加RCs然后开始做代数变换。这样做数学上没问题但你会失去对物理过程的感知。我个人的习惯是任何滤波器都先从电路层面理解搞清楚电流怎么流、电压怎么变、电容怎么充放电然后再抽象成数学。这样推导出来的公式你会有“画面感”而不是一堆符号的堆砌。一阶低通滤波器最经典的物理实现就是一个电阻和一个电容串联。输入信号从电阻一端进去输出信号从电阻和电容之间的节点取出来。就这么简单两个元件构成了整个一阶低通滤波器的物理基础。为什么这个结构能滤波核心在于电容的特性。电容两端的电压不能突变它需要时间来充放电。当输入信号变化很快的时候电容来不及跟上输出就变化很小相当于被“压住”了。当输入信号变化很慢的时候电容有足够的时间充放电输出就能跟上输入。这就是低通滤波的物理本质——让慢的过去把快的拦住。2.2 用分压思路建立时域方程我们把这个电路用数学描述一下。设输入电压为Vin输出电压为Vout电阻为R电容为C。输出取自电容两端所以Vout就是电容两端的电压。根据基尔霍夫电压定律输入电压等于电阻上的压降加上电容上的压降。电阻上的压降等于电流乘以电阻而电容上的压降就是Vout。流过电阻的电流等于流过电容的电流因为它们是串联的。电容的电流和电压关系是电流等于电容乘以电压对时间的导数。所以流过电容的电流等于C乘以dVout/dt。把这两个关系串起来电阻上的压降等于R乘以C乘以dVout/dt。于是我们得到Vin等于RC乘以dVout/dt加上Vout。这就是一阶低通滤波器在时域的核心微分方程。这个方程告诉我们输出电压的变化率受到输入和输出之间差值的驱动。如果Vin突然跳变Vout不会跟着跳而是按照一个由RC决定的速度慢慢逼近Vin。注意这里假设输出端没有接负载或者负载阻抗远大于R。如果后级电路的输入阻抗和R可比那就要把负载效应考虑进去实际截止频率会偏移。这是实际电路设计中很容易忽略的一点。2.3 RC乘积的物理意义时间常数上面那个微分方程里RC这个乘积反复出现。它有一个专门的名字叫时间常数通常用希腊字母τ表示。时间常数的物理意义是什么我们来看一个特殊情况假设电容初始电压为零输入突然从一个值跳到另一个值比如从0跳到V0。解这个微分方程可以得到Vout随时间的变化Vout等于V0乘以一减去e的负t除以τ次方。当t等于τ的时候Vout等于V0乘以一减去e的负一次方大约是V0的0.632倍。也就是说经过一个时间常数输出达到了最终值的63.2%。经过三个时间常数达到95%。经过五个时间常数达到99.3%基本可以认为稳定了。这就是为什么RC延时电路里经常用RC来估算延时时间。你想让信号延迟多久就选对应的RC值。但要注意这里的“延时”不是数字电路里那种精确的延时而是一个指数逼近的过程具体什么时候算“到了”取决于你的判断阈值。理解时间常数对后面理解截止频率非常关键。截止频率本质上就是时间常数的倒数关系——时间常数越大电路反应越慢能通过的信号频率就越低。3. 从时域跳到频域传递函数是怎么冒出来的3.1 拉普拉斯变换把微分方程变成代数方程时域微分方程虽然直观但解起来麻烦尤其是当输入信号不是阶跃而是正弦波的时候。这时候就需要请出拉普拉斯变换了。拉普拉斯变换的核心思想是把时间域的函数映射到复频域。在这个域里微分运算变成了乘法运算。具体来说对一个函数求导在拉普拉斯域里相当于乘以s。这个s是一个复变量可以写成σ加jω的形式。对我们的微分方程两边做拉普拉斯变换。假设初始条件为零也就是电容初始没有电荷。Vin的拉普拉斯变换记为Vin(s)Vout的拉普拉斯变换记为Vout(s)。dVout/dt的拉普拉斯变换就是s乘以Vout(s)。于是方程变成Vin(s)等于RC乘以s乘以Vout(s)加上Vout(s)。把Vout(s)提出来Vin(s)等于Vout(s)乘以一加上RCs。整理一下得到传递函数H(s)等于Vout(s)除以Vin(s)等于一比上一加上RCs。这就是一阶低通滤波器的传递函数。整个过程没有任何魔法就是把微分方程里的求导换成乘s然后做代数整理。但这一步的意义很大——它把一个动态系统的行为用一个简单的代数表达式描述出来了。3.2 从s域到频域令s等于jω传递函数H(s)描述的是系统对任意输入的响应但我们通常更关心系统对不同频率正弦信号的响应。这时候令s等于jω其中ω是角频率等于2πff是频率。代入之后得到H(jω)等于一比上一加上jωRC。这是一个复数可以写成幅度和相位的形式。幅度就是增益相位就是相移。先看幅度。一个复数一比上一加jA的幅度等于根号下一加A平方分之一。这里A等于ωRC。所以增益的幅度等于根号下一加ωRC的平方分之一。再看相位。一比上一加jA的相位等于负的arctan(A)。所以相位等于负的arctan(ωRC)。这两个表达式就是频域分析的核心。增益告诉我们不同频率的信号经过滤波器之后幅度变成原来的多少倍相位告诉我们信号被延迟了多少。3.3 增益公式的直观解读增益公式是|H|等于一比上根号下一加ωRC的平方。我们来看几个极端情况。当频率很低的时候ω趋近于零ωRC也趋近于零根号里就是一增益等于一。也就是说低频信号原封不动地通过。这符合低通滤波器的定义。当频率很高的时候ω趋近于无穷大ωRC也趋近于无穷大根号里趋于无穷大增益趋近于零。高频信号被完全压制。这也符合预期。那中间呢增益从一逐渐下降到零中间必然有一个过渡区域。这个过渡区域的转折点就是我们说的截止频率。提示这里说的“低频通过、高频压制”是理想化的描述。实际电路中即使频率很低如果后级负载很重增益也可能小于一。另外元件本身的寄生参数在高频段也会让实际特性偏离理想公式。4. 截止频率的推导为什么是0.707而不是0.54.1 截止频率的定义功率半功率点截止频率的定义有好几种说法最容易混淆的就是“增益降到0.707”和“增益降到0.5”。这两个说法其实描述的是同一个物理点但一个是电压幅度一个是功率。功率和电压的关系是平方关系。如果电压幅度降到原来的根号二分之一也就是约0.707那么功率就降到原来的二分之一。所以截止频率又叫半功率点频率。为什么用半功率点来定义截止频率因为这是工程上最方便测量的点。在波特图上半功率点对应增益下降3分贝的位置。3分贝是一个很容易识别的标志而且在这个点附近滤波器的过渡带特性开始明显变化。所以截止频率的定义是增益幅度降到最大增益的根号二分之一也就是约0.707的那个频率。4.2 代入求解一步步算出ωc我们把增益公式等于根号二分之一反解出对应的ω。根号下一加ωRC的平方分之一等于根号二分之一。两边取倒数根号下一加ωRC的平方等于根号二。两边平方一加ωRC的平方等于二。所以ωRC的平方等于一。因为ω和RC都是正数所以ωRC等于一。于是ω等于RC分之一。这就是截止角频率。换成频率f因为ω等于2πf所以2πf等于RC分之一f等于二πRC分之一。这就是那个被无数人抄来抄去的公式截止频率等于一比上二πRC。推导过程就这么简单但如果你没有亲手推过一遍你可能永远不知道这个公式里的根号二是从哪来的也不知道为什么是0.707而不是别的数。现在你应该清楚了根号二来自半功率点的定义0.707是根号二分之一的近似值。4.3 截止频率处的相位正好滞后45度在截止频率处ωRC等于一所以相位等于负的arctan(1)也就是负45度。这个结果也很有意义。在截止频率处输出信号不仅幅度降到0.707相位也正好滞后输入45度。这两个特征经常被用来判断一个滤波器是否工作在截止频率附近。如果你在调试电路的时候发现某个频率的信号幅度降到七成左右同时示波器上看相位差了大约八分之一周期那这个频率大概率就是截止频率。注意相位滞后在控制系统中非常关键。如果你把一阶低通滤波器放在反馈环路里截止频率处的45度相位滞后会吃掉你的相位裕度。截止频率选得太低系统可能振荡。这是很多新手调PID时容易忽略的问题。5. 从模拟到数字那个加权平均系数到底怎么来的5.1 为什么需要数字实现模拟RC电路虽然简单但有几个问题电阻电容有误差温漂大截止频率不好精确控制而且改变截止频率需要换元件。在嵌入式系统里我们更希望用软件来实现滤波这样参数可以随时改不受元件精度影响。数字一阶低通滤波器的基本形式是一个加权平均新的输出等于一个系数乘以新的输入加上一减去这个系数乘以旧的输出。写成公式就是y[n]等于α乘以x[n]加上一减α乘以y[n-1]。这个形式看起来和RC电路没什么关系但实际上它就是RC微分方程的离散化版本。α这个系数和RC值、采样周期都有关系。5.2 用一阶差分近似微分回到时域微分方程Vin等于RC乘以dVout/dt加上Vout。在数字系统里我们不是连续地处理信号而是每隔一个采样周期Ts采一个点。微分可以用一阶差分来近似dVout/dt约等于Vout[n]减去Vout[n-1]除以Ts。把这个近似代入微分方程并且把Vin和Vout换成离散序列x[n]和y[n]x[n]等于RC乘以y[n]减去y[n-1]除以Ts加上y[n]。整理一下把y[n]放到一边x[n]等于y[n]乘以一加上RC除以Ts减去y[n-1]乘以RC除以Ts。继续整理y[n]乘以一加上RC除以Ts等于x[n]加上y[n-1]乘以RC除以Ts。两边同时除以一加上RC除以Tsy[n]等于x[n]除以一加上RC除以Ts加上y[n-1]乘以RC除以Ts除以一加上RC除以Ts。对比加权平均的形式可以得到α等于一除以一加上RC除以Ts也就是Ts除以Ts加上RC。这就是数字滤波系数和模拟RC值、采样周期之间的精确关系。5.3 截止频率和α的换算在实际工程中我们通常不是先确定RC再算α而是先确定想要的截止频率fc再算α。从fc等于一比上二πRC可以得到RC等于一比上二πfc。代入α的表达式α等于Ts除以Ts加上一比上二πfc。分子分母同时乘以二πfcα等于二πfcTs除以二πfcTs加一。又因为采样频率fs等于一除以Ts所以Ts等于一除以fs。代入后α等于二πfc除以fs除以二πfc除以fs加一。这个公式就是数字一阶低通滤波器设计的核心。你给定截止频率和采样频率就能算出α。我个人的经验是当fc远小于fs的时候α近似等于二πfc除以fs。比如fs等于一千赫兹fc等于十赫兹α大约等于0.0628。这个近似在fc小于fs十分之一的时候误差很小计算起来更方便。提示如果fc接近fs的一半上面这个离散化方法的误差会变大因为一阶差分近似不再准确。这时候应该用双线性变换或者其他更精确的离散化方法。但在大多数嵌入式应用里fc通常远小于fs所以这个简单公式足够用。6. 推导完之后那些实际调试中才会遇到的问题6.1 系数调过头会怎样相位滞后和响应速度的权衡知道了α和截止频率的关系之后很多人会想把截止频率调得很低让输出非常平滑。但截止频率越低α越小滤波器对输入变化的响应就越慢。举个例子假设你的采样率是一千赫兹你把截止频率设成一赫兹算出来α大约是0.00628。这意味着新的输出只有千分之六来自新输入千分之九百九十四来自旧输出。滤波器确实非常平滑但如果输入信号真的发生了变化输出要经过很长时间才能跟上。在控制系统中这种滞后是致命的。你的传感器读到一个变化但滤波器输出要过好几十个采样周期才反映出来控制器基于这个滞后的值去做决策整个系统的响应就会变慢严重的时候会振荡。所以截止频率的选择是一个权衡太低则响应慢太高则滤波效果差。我一般的做法是截止频率选在有用信号最高频率的两到五倍同时保证在采样率的十分之一以下。这样既能滤掉高频噪声又不会引入太大的相位滞后。6.2 初始值的选择第一次运行时的坑数字滤波器有一个模拟电路没有的问题初始值。模拟电路上电之后电容电压从零开始自然建立。数字滤波器如果第一次运行时y[n-1]是零而实际输入信号不是零那第一个输出就会有一个很大的跳变。比如你的传感器初始读数是五百但y[n-1]初始化为零第一个输出就是α乘以五百加上一减α乘以零等于α乘以五百。如果α是0.01输出就是五和实际值差了四百九十五。然后第二个输出慢慢往上爬要经过很多个周期才能逼近五百。解决办法很简单第一次运行时直接把y[n-1]设成第一个输入值或者用前几个采样值的平均作为初始值。这样滤波器从一开始就工作在正常状态不会有一个明显的建立过程。这个坑我在实际项目中踩过。当时做的是一个温度采集系统上电之后温度显示从零开始慢慢往上爬操作员以为设备坏了。后来加了初始化逻辑上电直接显示当前温度问题就解决了。6.3 定点数实现的精度问题在单片机上用浮点数做滤波运算当然方便但有些低端单片机没有浮点单元用浮点运算会很慢。这时候就要用定点数来实现。定点数实现的关键是α的表示。如果α很小比如0.001用整数表示就需要很高的精度。假设你用十六位整数把α乘以六万五千五百三十六存起来那0.001对应的整数大约是六十六。每次运算的时候先做乘法再右移十六位。但这里有一个精度损失的问题。如果α太小乘完之后右移低位全被截断了滤波效果会变差。我一般建议α不要小于千分之一如果确实需要更低的截止频率要么提高采样率要么用三十二位运算。还有一个技巧是用误差累积的方式来做定点滤波把每次截断的误差累加起来下次补偿回去。这样可以用较低的位宽达到较好的精度。不过实现起来稍微复杂一些适合对精度要求高的场合。7. 把推导串起来一张表看清所有关系推导到这里各个量之间的关系应该比较清楚了。我用一张表把核心公式和它们的物理意义整理一下方便你以后查阅。量公式物理意义备注时间常数τ RC电容充放电速度越大响应越慢传递函数H(s) 1/(1RCs)系统在复频域的输入输出比s为拉普拉斯变量频域增益|H| 1/√(1(ωRC)²)不同频率的幅度放大倍数ω为角频率截止角频率ωc 1/RC增益降到0.707的频率半功率点截止频率fc 1/(2πRC)工程上常用的频率指标单位赫兹数字系数α Ts/(TsRC)加权平均中新的输入的权重Ts为采样周期系数与频率α 2πfcTs/(2πfcTs1)由截止频率直接算α常用设计公式这张表里的每一个公式如果你都亲手推过一遍那它们对你来说就不再是死记硬背的东西而是有逻辑关联的知识网络。遇到实际问题的时候你可以从任何一个量出发推导出其他量而不是只能套公式。8. 推导之外一阶低通的局限和它的兄弟们8.1 一阶低通的滚降特性为什么有时候不够用一阶低通滤波器的增益在截止频率之后每十倍频程下降二十分贝也就是滚降斜率是负二十分贝每十倍频程。这个斜率不算陡。什么意思呢假设截止频率是一千赫兹那在一万赫兹处增益大约降到十分之一。如果你有一个两千赫兹的干扰信号它只被衰减了大约一半并没有被完全滤掉。如果干扰很强残留的部分仍然可能影响你的系统。这就是一阶滤波器的局限过渡带太宽。从通带到阻带它需要一个很宽的频率范围才能把信号压下去。8.2 二阶低通和更高阶更陡的滚降如果需要更陡的滚降就要用二阶或更高阶的滤波器。二阶低通的滚降斜率是负四十分贝每十倍频程比一阶陡一倍。实现方式可以是两个一阶低通级联也可以用Sallen-Key拓扑或者其他有源滤波电路。但阶数越高相位滞后也越严重。二阶低通在截止频率处的相位滞后是九十度而一阶只有四十五度。在闭环控制系统中这意味着更小的相位裕度更容易振荡。所以选择滤波器阶数的时候要在滤波效果和相位滞后之间做权衡。我个人的经验是大多数传感器信号调理用一阶就够了如果干扰特别严重可以考虑二阶但一定要重新评估控制环路的稳定性。8.3 一阶低通在Buck电路里的影子有意思的是一阶低通的思想在很多地方都会冒出来。比如Buck电路的输出滤波本质上就是一个LC低通滤波器。虽然LC是二阶的但分析思路和一阶RC是一脉相承的。Buck电路里电感对应电阻的角色电容还是电容。电感的电流不能突变电容的电压不能突变这两个特性配合起来把开关节点的高频方波变成平滑的直流输出。如果你理解了RC一阶低通的推导再去看Buck电路的传递函数推导会发现很多步骤是相似的。都是先写时域微分方程然后拉普拉斯变换然后求传递函数然后分析频率响应。区别只是多了一个电感方程从一阶变成二阶代数稍微复杂一点但物理直觉是一样的。这也是为什么我觉得花时间把一阶低通推清楚是值得的。它不仅仅是一个滤波器而是理解更复杂系统的基础。你把一阶搞透了二阶、三阶的东西看起来就不会那么吓人。9. 我个人的几条实操建议推导归推导最终还是要落到实际使用上。分享几条我在项目中总结出来的经验都是踩过坑之后才明白的。第一条永远先算一遍再写代码。不要凭感觉调α。花两分钟用公式算一下确认截止频率是你想要的比你在代码里反复试系数要快得多。我见过有人调了一下午系数最后发现截止频率设成了采样率的十分之一根本滤不掉他想要的噪声。第二条截止频率不要设得刚刚好。如果你要滤掉的噪声在五百赫兹有用信号在五十赫兹那把截止频率设在一百赫兹左右比较稳妥。设得太靠近有用信号有用信号本身也会被衰减和相移。留足够的过渡带是一阶滤波器设计的基本原则。第三条注意采样率的影响。同样的截止频率采样率越高α越小滤波器越平滑但响应也越慢。如果你提高采样率是为了让系统响应更快那滤波器的截止频率也要相应提高否则滤波器会成为新的瓶颈。第四条上电初始化别忘了。前面说过y[n-1]的初始值直接影响滤波器的建立过程。最简单的做法是用第一个采样值初始化复杂一点可以用前几个采样值的平均。不管怎样不要让初始值为零。第五条如果做产品考虑用定点数。浮点运算在低端单片机上很慢而且不同编译器的浮点实现可能有细微差异。定点数虽然写起来麻烦一点但行为确定速度快适合量产。当然如果你的单片机有硬件浮点单元那就另当别论。这些经验看起来都是小事但在实际项目中往往就是这些小事决定了你的滤波器能不能正常工作。公式推导是基础但真正让滤波器跑起来的是这些细节。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Flutter鸿蒙跨端坐标转换精讲:localToGlobal与globalToLocal的实用指南 2026/10/1 4:02:00

Flutter鸿蒙跨端坐标转换精讲:localToGlobal与globalToLocal的实用指南

做 Flutter 时间久了,你迟早会遇到一个需求:让某个浮层精准出现在某个按钮旁边,或者让一个拖拽中的卡片跟随手指动。很多人第一反应是写个Positioned,按肉眼看差不多的 x、y 填进去,真机一跑,偏了。尤其当这…

阅读更多 →
鸿蒙ArkUI自定义下拉刷新与上拉加载列表控件封装实践 2026/10/1 4:02:00

鸿蒙ArkUI自定义下拉刷新与上拉加载列表控件封装实践

搞这个自定义控件之前,我其实纠结过一阵子。列表页的下拉刷新和上拉加载更多,鸿蒙框架自己有Refresh容器可以用,看起来够省事。但产品上线的活儿干多了你就会发现,默认样式的刷新提示和加载尾部根本经不起设计稿的反复打磨&#x…

阅读更多 →
HotSpot Zero解释器源码解读:debug_zero.cpp的作用与实现 2026/10/1 4:02:00

HotSpot Zero解释器源码解读:debug_zero.cpp的作用与实现

1. 从一份源码文件说起:为什么我要去翻debug_zero.cpp先交代一下背景。我最近在排查一个跟 Zero 解释器相关的性能问题,顺着调用栈一路追到了 HotSpot 虚拟机源码里一个很容易被忽略的文件——debug_zero.cpp。说实话,绝大多数 Java 开发者一…

阅读更多 →
PostgreSQL + pgvector:语义搜索与RAG落地指南 2026/10/1 4:02:00

PostgreSQL + pgvector:语义搜索与RAG落地指南

先从一个很实际的场景说起吧。今年我一直在折腾私域知识库这摊事,陆陆续续有做后台系统的朋友来问:文档越来越多,全文搜索召回的结果越来越不相关,想上语义搜索,是不是一定要单独搞一套向量数据库?我的回答…

阅读更多 →
JSP+Servlet+MySQL博客源码部署实战:从环境配置到避坑指南 2026/10/1 4:02:00

JSP+Servlet+MySQL博客源码部署实战:从环境配置到避坑指南

简介:一套基于JSP、Servlet与MySQL的博客系统网站源码,面向Java Web初学者和需要快速搭建博客平台的开发者,可套用于课程设计、毕业设计或项目起步。整个压缩包共327个文件,大小约2.43MB,包含49个JSP页面、52个Java源文…

阅读更多 →
MySQL单库单表备份与恢复:mysqldump实战指南 2026/10/1 4:01:53

MySQL单库单表备份与恢复:mysqldump实战指南

1. 生产环境里的备份困局:为什么单库单表恢复是刚需先说一个我自己的真实经历。有一年线上商城做促销活动,运营同事在后台误操作,把商品表中的价格字段批量更新错了,整整几万条商品数据全部变成异常值。当时没有开启binlog&#x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉