news 2026/10/15 5:57:06

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Simulink中搭建Sallen-Key有源低通滤波器:从参数计算到调试实战

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 = R,C1 = 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 的接线其实很有规律:输入信号接到 R1,R1 右端接 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 信号的周期是 1ms,0.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 换成 10nF,R 保持不变。为什么?小电容在高频段的寄生参数影响更小,而且电阻保持一个合理的阻值范围有利于降低偏置电流引起的误差。改完参数重新仿真,你就能在 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.5,Q = 2,峰就更高更尖锐。很多初学者以为是“滤波放大兼得”,其实这是双刃剑:峰值意味着某些频率信号被额外增强,这在滤波应用里通常不是好事,会破坏幅频平坦性。我会建议你亲手尝试 K 接近 3 的极端情况,因为哲理上非常有趣——当 K = 3 时 Q 无穷大,系统进入振荡边缘;K 稍微超过 3,极点越过虚轴,滤波器直接变成了振荡器。原本一个老老实实的滤波电路,硬生生被你调成了自激振荡器。这就是有源滤波器最需要警惕的性质:反馈深度决定了稳定边界。

5.3 参数扫描小技巧:别手动改到手酸

在 Simulink 里反复改参数太累了,尤其要做多组对比时。我通常会写一个 MATLAB 脚本,把想扫描的参数做成循环。例如,我想观察不同 Q 值下的幅频响应,只需循环修改 Rf:

Rf_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 电路模型的通用经验。后面你还可以试试级联两个二阶节做成四阶滤波器,或者换用多重反馈拓扑和切比雪夫参数,体验不同响应之间的鲜明对比。仿真平台就在这里,元件参数随便改,唯一的限制就是你敢不敢把电路接歪、把参数调过头。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 5:56:46

用Python批量去除PDF白边:PyMuPDF坐标分析与裁剪实战

你手头有一批PDF,打开一看,每页四周留了大片白边。打印的时候白纸不够用,在平板上看字被缩成三分之一大小。手动一页页裁不现实,批量处理才是正路。用Python去除PDF白边这件事,看起来简单,实际操作里藏着不…

作者头像 李华
网站建设 2026/10/15 5:56:37

价值投资百年演进:从内在价值到安全边际,构建长期决策框架

价值投资这条路,听上去古老,但每隔几年就会被重新提起,而且每次重提,市场上都会多一批拥护者和一批半途而废的人。我接触投资的头几年,注意力基本都放在短线机会和信息差上,绕了一大圈才发现,真…

作者头像 李华
网站建设 2026/10/15 5:56:08

I.MX6U嵌入式Linux C应用编程实践:文件IO到网络通信的完整路径

简介:《【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.4》是一份基于I.MX6U微处理器的嵌入式Linux C应用编程教程,面向嵌入式开发者和Linux应用入门者,系统讲解了系统调用、文件I/O、进程管理、信号处理、Socket编程、音频应用、视频监控等…

作者头像 李华
网站建设 2026/10/15 5:55:59

AI编码助手跨会话失忆?PowerContext构建MiniMax Code持久上下文底座

做 AI 辅助开发这一年多,我最大的感受是:AI 编码助手每次会话里都能干活,但一关窗口就失忆。MiniMax Code 在生成代码、补全逻辑这一块效率很高,可是项目稍微大一点你就得反复在对话里粘贴背景说明,换个会话更是回到起…

作者头像 李华
网站建设 2026/10/15 5:55:52

HP DL380z Gen9硬件深度指南:iLO4、UEFI启动与PCIe拓扑实战

简介:本资源是惠普官方发布的HP DL380z Gen9虚拟工作站用户指南(PDF版),面向IT运维工程师、系统管理员及服务器部署维护人员,用于快速掌握该型号服务器的物理结构识别、状态监控与基础操作。文档全面覆盖前面板/后面板…

作者头像 李华
网站建设 2026/10/15 5:55:32

.NET 5+Vue 2.6开源快速开发框架:架构、权限与实战部署

我最初接触到这套基于 .NET 5 的开源快速开发框架时,心态是半信半疑的。仓库介绍不长,信息量却很大:框架源码、内置 ERP、OA、CRM 系统,前端用的是 Vue 2.6 前后端分离架构。这类自我介绍我见过太多,很多项目点进去只有…

作者头像 李华