资讯动态

Simulink中搭建Sallen-Key有源低通滤波器:从参数计算到调试实战

发布时间:2026/10/15 5:57:07 来源:尧图企业网站定制
1. 有源滤波器这么“老”的电路为什么还要在 Simulink 里搭一遍说实话刚接触“有源滤波器在 Matlab/Simulink 中的搭建”这个主题时我也觉得有点奇怪——滤波器的理论教材里写了几十年公式和电路图都是现成的直接算完搭实物不就行了可真到自己动手才发现纸上算得通和实际电路跑得通是两回事。尤其是有源滤波器里那个核心的“反馈补偿”和“Q 值调整”光靠手算很难建立起直观感受。Matlab/Simulink 恰恰是打破这层窗户纸的工具它让你能在一个完全可控的环境里把电阻、电容、运算放大器一块块摆上去再实时看到信号的幅度变化和相位变化。我之所以强烈建议把有源滤波器拿到 Simulink 里搭一遍不是因为“仿真比实物高级”而是因为仿真给了你一个零成本的反复试错空间。实物电路中你换一颗电容要焊半天弄不好还烧运放在 Simulink 里只需要改一个参数模型自动重新编译几秒钟就能看到新波形。更重要的是Simulink 允许你同时观察电压、电流、局部环节的中间量甚至能导出整个系统的 Bode 图这些在实物实验中要么很难测要么需要昂贵的仪器。这篇文章适合谁正在学信号与系统、电路原理或者电力电子相关课程的同学刚接触嵌入式信号采集、需要对 AD 前级做抗混叠滤波的工程师以及那些想把 Sallen-Key、MFB 这类经典拓扑彻底弄明白的技术爱好者。我会从设计思路讲起给出完整的元件参数计算过程然后带你一步步在 Simulink/Simscape 里把电路搭出来最后聊一聊我踩过的坑和调试技巧。内容偏实操但数学原理部分我也会讲清楚让你不仅知道怎么搭更知道为什么这么搭。2. 动手搭模型前先把 Sallen-Key 的“数学骨架”算清楚2.1 滤波器家族三选一巴特沃斯、切比雪夫还是贝塞尔很多人一上来就选电路拓扑其实第一步应该先选滤波器响应类型也就是幅频特性的“性格”。同样是一个二阶低通巴特沃斯Butterworth以通带内最大平坦为目标没有纹波代价是过渡带不够陡切比雪夫Chebyshev允许通带内有纹波换来更陡峭的过渡带贝塞尔Bessel则最关心相位线性度波形失真最小但截止特性最差。实际工程里信号链前端的抗混叠滤波我用得最多的是巴特沃斯因为它的幅频曲线最“乖”既不会在通带内上下抖动也不会对波形造成过大相位扭曲。如果你的需求是快速滤掉靠近截止频率的干扰并且通带纹波可以接受那切比雪夫更合适如果是脉冲信号或方波信号经过滤波器后不能有明显过冲那我建议选贝塞尔。这次搭建我按巴特沃斯来设计因为它最能体现有源滤波器中 Q 值品质因数与增益之间的微妙关系。2.2 Sallen-Key 拓扑为什么是首选有源低通滤波器的拓扑非常多但 Sallen-Key 结构最经典也是入门门槛最低的。它只需要一个运放、两个电阻、两个电容就能实现二阶低通特性。相比多重反馈MFB结构Sallen-Key 用的是同相输入输入阻抗很高几乎不会对前级信号源造成负载输出阻抗很低可以直接级联下一级滤波单元。这对多阶滤波器来说非常实用因为你可以像搭积木一样把多个二阶节串起来得到四阶、六阶响应。Sallen-Key 的关键特征是截止频率由 RC 乘积决定Q 值由运放增益 K 和反馈网络联合决定。这意味着频率和 Q 值可以独立调整设计灵活度比无源 RC 滤波高好几个档次。你甚至可以不换电容电阻只调节运放负反馈电阻就能把滤波器从临界阻尼调到欠阻尼亲眼看它出现峰值。2.3 一个 1kHz 巴特沃斯低通滤波器的完整参数计算以最常用的增益大于 1 的 Sallen-Key 低通为例传递函数是H(s) K·ω0² / (s² ω0/Q·s ω0²)其中ω0 1 / (R1·R2·C1·C2) 的开平方Q 1 / (3 - K)如果取 R1 R2 RC1 C2 C上面两个式子还能进一步简化成ω0 1/(R·C)Q 1/(3 - K)于是得到一个非常简洁的设计流程先确定截止频率选一组好买到的电容算出电阻值再根据目标 Q 值确定运放增益 K。二阶巴特沃斯的 Q 值是固定的 0.707所以 K 3 - 1/0.707 ≈ 1.586。我这次的目标截止频率取 f0 1kHz也就是 ω0 ≈ 6283 rad/s。电容先选容值较大的 100nF这样电阻不至于太大噪声和偏置电流影响也小。计算电阻R 1/(ω0·C) 1/(6283 × 100×10⁻⁹) ≈ 1591Ω取标称值 1.59kΩ实际仿真里用 1590Ω 即可。增益是 1.586而 Sallen-Key 运放增益由两个反馈电阻决定K 1 Rf/Rg。取 Rg 10kΩ则 Rf (K - 1)×Rg 0.586×10kΩ 5.86kΩ。用 5.86kΩ 或者近似标准电阻组合来实现都可以。这个算例的妙处在于R、C 和 K 三个参数彼此独立你之后想改截止频率只需按比例调整 R 或 C想让滤波器出现峰值只需把 Rf 调大一些Q 值立刻改变。这种“参数自由度”正是有源滤波器比无源滤波更好用的重要原因。3. 在 Simscape 里“接线”把电路从图纸搬到屏幕3.1 建模库选择与仿真思路Simulink 里搭有源滤波器有两条路一条是用数学传递函数模块直接写 H(s)看的是“方程式”另一条是用 Simscape Electrical 元件库把实际电路画出来看的是“电路本身”。我强烈推荐后者因为既然要“搭建之旅”就应该像真的在面包板上插元件一样把电阻、电容、运放一个个连起来这样你对拓扑的记忆会深刻得多而且后续想加寄生参数、看非理想效应也都方便。Simscape Electrical 在较新的 Matlab 版本里通常直接可用如果你用的是老版本可能需要额外安装 Simscape Electrical 工具箱。打开 Simulink 库浏览器后在 Simscape → Electrical 目录下可以找到电阻、电容、电压源、运算放大器等元件。找不到运算放大器块时也可以用 Simscape 里的受控电压源VCVS配合高增益自己搭一个模型效果完全够用。3.2 元件连线明细一个步骤一个坑新建模型后我的习惯是先放元件再连线因为元件摆放位置会影响你是否能看清负反馈回路。Sallen-Key 的接线其实很有规律输入信号接到 R1R1 右端接 R2 和 C1 的公共节点R2 右端接 C2 和运放正输入端C1 的下端也这个节点C2 的下端接地运放输出端通过 Rf 和 Rg 分压后反馈回反相输入端。如果你从没在 Simulink 里画过模拟电路头两次连这种“十字形”网络很容易漏线或连错节点我一般的检查办法是“跟着信号走”从电压源正极出发一路往下看哪个节点接了几根线。输入激励部分我用一个 Simulink 的 Sine Wave 信号经过 Simulink-PS Converter 转成物理信号再接到 Simscape 里的 Controlled Voltage Source。这样做的最大优势是频率和幅值可以直接通过 MATLAB 工作区变量控制方便后面做频率扫描。电源方面别忘给运放接 V 和 V-我用的是 ±15V 双电源因为输入信号幅值按 1V 设计双电源能保证输出不削顶。如果你只用单电源运放输出在低频大信号时很容易饱和这个问题后面还会专门讲。3.3 求解器设置为什么我推荐 ode23t电路仿真和纯控制框图仿真有个明显差别Simscape 物理模型里存在各种时间常数差异很大的元件系统可能呈刚性。用默认的 ode45 有时候能跑但步长会变得非常小、仿真极慢甚至报“步长收敛失败”。我个人的经验是含运算放大器反馈的电路用 ode23t梯形规则最稳妥它既能处理一定程度刚性又不会像 ode15s 那样在某些高频段产生过多数值损耗。仿真时长先设为 0.1 秒因为 1kHz 信号的周期是 1ms0.1 秒里能看 100 个完整周期足够观察稳态波形。如果只开 10ms瞬态成分还没衰减完你看不到滤波后的真实幅度。最大步长建议设置为 1e-5 秒也就是每个周期采 100 个点这样可以保证波形精度又不会让仿真时间太长。4. 跑通仿真先看时域再“扫频”验证4.1 时域里的“直观”验证模型搭建完毕先别急着扫频先跑一个最直接的时域实验。把正弦波频率设到 100Hz这个频率低于截止频率 1kHz应该落在通带内。仿真结束后打开 Scope你会看到输出信号几乎和输入信号一模一样只是变大了。为什么因为我们的 Sallen-Key 增益 K 1.586输出幅度自然是输入幅度的 1.586 倍。如果你的输入是幅度 1V 的正弦波输出应该是大约 1.586V 的正弦波几乎没有相位差。再把频率改成 1kHz也就是截止频率处。这时候理论上的衰减是 -3dB折算成功率减半电压变为原来的 0.707 倍。结合通带增益 K 来算实际输出幅度应该是 1.586 × 0.707 ≈ 1.12V。在示波器上这个值比 1.586V 小了一圈峰值会有明显降低但不会掉得特别厉害因为二阶滤波器在截止频率附近过渡带不算太陡。最后把频率改成 10kHz看看阻带表现。二阶巴特沃斯的衰减率是 -40dB/十倍频程这意味着 10kHz 时比通带低大约 40dB。输出幅度大约相当于通带的 1/100也就是 1.586V × 0.01 ≈ 0.016V。示波器上基本就是一条接近零电平的压扁波形。这个“眼见为实”的过程非常有冲击力尤其是第一次看到一条被压平的曲线时你对截止频率、衰减率这些概念会产生直觉性的理解。4.2 用 Bode 图做理论对比动手“扫频”时域只能验证几个离散频点要全面评估滤波器幅频特性还得看 Bode 图。在 Simulink 里最标准的做法是使用线性化分析打开模型在 Simulink 菜单栏找到“Analysis → Control Design → Linearize”把输入和分析点分别标记为输入扰动和开环输出然后运行线性化就能得到仿真电路的频响曲线。如果你用的版本里有 Control System Toolbox还可以直接导出线性化模型的传递函数再和手算公式对比。以下是我常用的 MATLAB 脚本先根据前面计算的参数构造理论传递函数s tf(s); K 1.586; R 1590; C 100e-9; w0 1/(R*C); Q 1/(3-K); H K*w0^2 / (s^2 w0/Q*s w0^2); bode(H, {2*pi*50, 2*pi*20000}); grid on;运行后你会看到一条标准的二阶低通幅频曲线在 1kHz 附近从通带平坦段开始下降斜率为 -40dB/十倍频程相位从 0° 缓慢过渡到 -180°。拿这条理论曲线和 Simulink 线性化结果放在同一张图里你会发现物理仿真和数学公式在大部分频段都重合得很好。那些细微的差异通常来自运放模型不是理想模型、仿真精度限制以及数值近似。如果没有线性化工具箱也完全可以用“土办法”扫频写一个循环先用 set_param 把正弦波频率改成下一个测试点再用 sim 函数运行仿真最后在输出波形里提取稳态峰值就好。注意提取峰值时取下结论取序列末尾几十个点求最大值和最小值的差值再除以 2。把这组幅度数据画成半对数图同样能得到幅频特性只是速度慢一些精度和理论曲线也能对得上。5. 调参实验R/C 变化、增益与 Q 值的真实关系5.1 把截止频率移到 10kHz只改一个参数当你亲眼看到 1kHz 截止频率的效果后第一个想做的实验一定是“改频率”。根据公式 f0 1/(2πRC)想让截止频率从 1kHz 变成 10kHz只需让 R·C 的乘积缩小 10 倍。这里有三种改法R 减小为原来的十分之一C 减小为原来的十分之一或者 R 和 C 各调整到乘积减至十分之一。我的建议是优先缩 C比如把 C1 C2 100nF 换成 10nFR 保持不变。为什么小电容在高频段的寄生参数影响更小而且电阻保持一个合理的阻值范围有利于降低偏置电流引起的误差。改完参数重新仿真你就能在 10kHz 处看到 -3dB 点100Hz 的信号反而变成了被压下去的对象。这种“同一套拓扑改一个参数彻底改变行为”的感觉只有亲自动手试过才最深刻。5.2 把 Q 值调大滤波器出现“峰值”巴特沃斯响应的 Q 0.707也就是临界阻尼附近的响应。如果现在我把 Rf 从 5.86kΩ 调大到 10kΩ增益 K 就从 1.586 变成 2看看会发生什么。根据 Q 1/(3-K)K 2 时 Q 1滤波器开始在截止频率附近出现谐振凸起。仿真后你会看到频率靠近 1kHz 的那段信号不但没有被衰减反而被放大了幅频曲线在截止频率附近耸起一个峰。这就是欠阻尼现象。如果把 K 继续调到 2.5Q 2峰就更高更尖锐。很多初学者以为是“滤波放大兼得”其实这是双刃剑峰值意味着某些频率信号被额外增强这在滤波应用里通常不是好事会破坏幅频平坦性。我会建议你亲手尝试 K 接近 3 的极端情况因为哲理上非常有趣——当 K 3 时 Q 无穷大系统进入振荡边缘K 稍微超过 3极点越过虚轴滤波器直接变成了振荡器。原本一个老老实实的滤波电路硬生生被你调成了自激振荡器。这就是有源滤波器最需要警惕的性质反馈深度决定了稳定边界。5.3 参数扫描小技巧别手动改到手酸在 Simulink 里反复改参数太累了尤其要做多组对比时。我通常会写一个 MATLAB 脚本把想扫描的参数做成循环。例如我想观察不同 Q 值下的幅频响应只需循环修改 RfRf_values [5.86e3, 8.6e3, 10e3, 12e3, 14.6e3]; for i 1:numel(Rf_values) load_system(ActiveFilterDemo); set_param(ActiveFilterDemo/Rf, Resistance, num2str(Rf_values(i))); out sim(ActiveFilterDemo); % 这里提取输出幅值并保存 end有几个容易踩的细节set_param 接受的是字符串不能直接传数值仿真前最好 load_system 确保模型已加载输出信号如果走的是 Scope 再接 to Workspace 模块变量名和采样方式先设置好否则循环里取值会很痛苦。参数扫描不仅是省力工具也是你发现“参数边界”的利器比如扫到某个电阻值时系统开始发散那这个临界值就是稳定边界。6. 常见问题与排查技巧实录6.1 高频、数值、接线问题速查表我想把这次搭建过程中遇到过的典型问题和解决办法整理成一个速查表照着定位问题会快很多现象可能原因排查和解决办法输出一直是输入信号滤波效果完全不存在运放正输入端和输出端被短路或 R2/C1 节点连线错误逐节点检查连线重点看 R2 右端是否接到运放正输入而没接到输出输出波形饱和平顶削波运放单电源供电输出范围受限改用 ±15V 双电源或降低输入信号幅值比如降到 0.5V仿真极慢或步长失败默认 ode45 遇到刚性系统换 ode23t并显式设置最大步长 1e-5输出幅度远小于理论值示波器采样时间窗口太短瞬态未稳定加长仿真时长至少到 0.05s或检查最大步长是否过大扫频时 10kHz 处衰减不明显运放带宽限制或电容寄生参数改用理想运放模型验证确认是电路问题还是元件非理想问题想看的信号被高频噪声覆盖没有加带限噪声抑制或采样率过低在仿真配置里开启零阶保持适当增加仿真采样率每一条都是我实际撞过墙才记住的。尤其是前两条刚在 Simulink 里画电路的人最容易忽略运放供电脚。那不是装饰没有正确供电的运放在仿真里表现为不可理喻的异常输出而不是直接报错。6.2 运放饱和与共模输入范围的一些心得有源滤波器在 Simulink 里“看起来正常”并不意味着在实际电路里就能正常工作。比如理想运放模型允许输出轨到轨摆动但真实运放到不了这个程度。如果你把输入信号调得很大比如 3V 以上同时增益 K 1.586输出在通带内会达到约 4.76V可能接近运放正电源轨于是出现削顶失真。仿真里如果你用的是理想运放是不会看到这种现象的。所以如果你希望仿真结果更贴近实物建议给运放模块设定输出饱和限幅参数。另一个容易被忽略的是共模输入范围。Sallen-Key 的同相输入点电压等于输出经过 Rf/Rg 分压后的反馈电压某种程度上跟着输入走。如果你的输入信号负向幅度过大超过运放允许的共模输入范围输出也会异常。仿真模型中虽然没有温度漂移、偏置电流这些现实问题但我们可以通过检查节点电压是否在合理范围内提前培养良好的电路设计习惯。6.3 数值噪声和代数环问题如果你的模型里既有 Simscape 物理信号又有 Simulink 普通信号中间必然会用到 Simulink-PS Converter 和 PS-Simulink Converter。这里经常出现代数环问题表现为“内部信号一致性错误”。排查思路非常简单把直通连线的 Converter 拆开在中间插入一个 Memory 模块或一个低通滤波环节就能断开代数环。代价是这样做会引入一小段延迟但对滤波器仿真结果影响极微。还有一次我把 Scope 直接接到 PS 信号上没转回 Simulink 信号仿真能跑但数据显示全是乱码。后来规范了信号类型转换每个观察点都经过 PS-Simulink Converter 再接 Scope问题就消失了。这个细节不该写成教程里的“标准流程”倒是更像经验贴士物理域信号和仿真域信号别混用。6.4 参数化模型让修改参数变成一件享受仿真最重要的好处就是重复实验。我在模型里把 R、C、Rf、Rg 全部做成 MATLAB 工作区变量比如下面这样R1 1590; R2 1590; C1 100e-9; C2 100e-9; Rf 5860; Rg 10000;然后在每个元件参数栏里填变量名而不是填数字。这样设计的好处是调参不用打开元件对话框直接在 MATLAB 命令行改变量后重新仿真即可而且脚本可以完整记录你实验的参数轴历史。后面想对比十组参数也只需要定义一个结构数组循环赋值、循环仿真。我建议你一上来就用这种方式建模即使只搭一个简单的二阶滤波器。因为习惯成自然后面的三阶、四阶甚至开关电源里的有源滤波器建模都会继续沿用这套逻辑避免每次改参数都得拆开模型改填数字的繁琐。写在最后的一点体会这次在 Simulink 里有源滤波器的搭建之旅最让我有收获的并不是最终得到了那个理想 Bode 图而是把“公式里的 Q”和“波形上的峰”真正联系在了一起。以前看书上说 Q 值大滤波器会过冲我心里只是有个模糊印象亲手把 Rf 从 5.86kΩ 一点点调大看到输出波形从平缓变成尖峰再变成振荡那种感受是任何文字都替代不了的。搭建过程中踩过的坑——供电忘接、数据信号没转换、步长太小跑不动——后来都成了我调试其他 Simulink 电路模型的通用经验。后面你还可以试试级联两个二阶节做成四阶滤波器或者换用多重反馈拓扑和切比雪夫参数体验不同响应之间的鲜明对比。仿真平台就在这里元件参数随便改唯一的限制就是你敢不敢把电路接歪、把参数调过头。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑