3. SPICE 噪声分析:.NOISE 语句与设置
噪声仿真,说白了就是看你的电路到底有多「吵」。我刚开始做仪表放大器那会儿,总觉得噪声是玄学——明明直流工作点都对,仿真出来噪声却大得离谱。后来才发现,是 .NOISE 语句的参数没设对。
这一节,咱们就把 SPICE 里噪声分析的核心语法、参数设置、以及我踩过的坑,一次性讲清楚。
3.1 .NOISE 语句的基本语法
在 SPICE 里,噪声分析用 .NOISE 语句来声明。它的标准格式长这样:
.NOISE V(输出节点, 参考节点) 输入源 点数 起始频率 终止频率 [关键字]
每个参数的意思,我列个表:
| 参数 | 含义 | 示例 |
|---|---|---|
V(输出节点, 参考节点) |
你要看哪个节点的噪声电压 | V(VOUT, 0) |
输入源 |
噪声参考到哪个输入信号源 | VIN |
点数 |
频率扫描的点数(对数或线性) | 100 |
起始频率 |
噪声分析的起点 | 0.1 (Hz) |
终止频率 |
噪声分析的终点 | 1e6 (Hz) |
举个例子,一个完整的噪声分析语句:
.NOISE V(VOUT, 0) VIN 100 0.1 1e6
这表示:从 0.1 Hz 到 1 MHz,取 100 个点,计算 VOUT 节点对地的噪声,并折算到输入源 VIN。
关键点:输出节点必须是电路中的某个节点,输入源必须是独立电压源或电流源的名字。如果你用 VIN 作为输入源,SPICE 会自动把输出噪声除以该源的增益,得到输入参考噪声。
3.2 频率范围的选择——别小看这个
频率范围怎么设?我见过很多新手直接写 1 1e9,结果仿真跑半天,出来一堆没用的高频噪声。
对于仪表放大器,我们关心的频段通常是:
- 0.1 Hz ~ 10 Hz:闪烁噪声(1/f 噪声)的重灾区。我做过一个心电信号采集项目,0.5 Hz 以下的噪声直接淹没了 R 波。
- 10 Hz ~ 1 kHz:中频段,热噪声和散粒噪声占主导。
- 1 kHz ~ 100 kHz:高频段,需要考虑电路的带宽限制。
我个人习惯,先跑一个宽频扫描(比如 0.01 Hz ~ 10 MHz),看看噪声谱的整体形状。然后再针对感兴趣的频段加密扫描点数。
小技巧:起始频率不要设成 0。SPICE 里 0 Hz 是直流,噪声分析在直流点没有意义。我一般从 0.01 Hz 或 0.1 Hz 开始。
3.3 输出节点与输入源的设置陷阱
输出节点很好理解——你想看哪里的噪声。但输入源的选择,很多人会搞错。
举个例子,你的仪表放大器有两个输入端 VINP 和 VINN。如果你写:
.NOISE V(VOUT, 0) VINP 100 0.1 1e6
SPICE 只会把噪声折算到 VINP 这个源。但实际电路中,两个输入端都有噪声贡献。正确的做法是:
- 如果电路是单端输入,直接用那个输入源。
- 如果是差分输入,通常需要把两个输入源都考虑进去。但 SPICE 的 .NOISE 只接受一个输入源。怎么办?
我曾经在这个坑里待过两周。后来发现,可以用一个「虚拟」的输入源来替代——在输入端加一个 0V 的电压源,然后把它作为参考源。这样 SPICE 会把所有噪声都折算到这个虚拟源上。
注意:输入源的名字必须和电路中的独立源完全一致。大小写、空格都不能错。我吃过这个亏,仿真结果怎么都不对,最后发现是源名字写成了 VIN 而电路里是 V_In。
3.4 噪声分析的关键字与高级选项
.NOISE 语句还支持一些关键字,用来控制输出内容:
| 关键字 | 作用 | 我的用法 |
|---|---|---|
PRINT |
输出噪声数据到文件 | 一般不用,直接在波形查看器里看 |
PLOT |
生成噪声曲线图 | 老版本 SPICE 用,现在很少用 |
ONOISE |
输出总噪声(积分结果) | 我经常用这个看总 RMS 噪声 |
举个例子,加上 ONOISE 关键字:
.NOISE V(VOUT, 0) VIN 100 0.1 1e6 ONOISE
这样仿真结束后,SPICE 会额外输出一个 onoise_total 变量,表示从起始频率到终止频率的总积分噪声。
3.5 噪声分析的知识体系
下面这张图,是我自己总结的噪声分析核心逻辑。你看一遍就能明白整个流程:
3.6 实战示例:一个简单的噪声分析网表
说了这么多,不如直接看一个完整的例子。下面是一个仪表放大器输入级的噪声分析网表:
* 仪表放大器输入级噪声仿真
VDD VDD 0 DC 5
VINP VINP 0 DC 0 AC 1
VINN VINN 0 DC 0
M1 VOUT VINP VDD VDD PMOS W=10u L=1u
M2 VOUT VINN VSS VSS NMOS W=10u L=1u
IBIAS VSS 0 DC 100u
* 噪声分析:从 0.1 Hz 到 100 kHz,取 1000 点
.NOISE V(VOUT, 0) VINP 1000 0.1 100k
* 输出总噪声
.PRINT NOISE ONOISE
.END
这个例子虽然简单,但包含了所有核心要素。你跑完仿真后,会得到两个结果:
- 噪声谱密度:单位 V²/Hz 或 V/√Hz,看频率变化。
- 总 RMS 噪声:从 0.1 Hz 到 100 kHz 的积分结果。
我的习惯:先看噪声谱密度曲线,确认低频有没有 1/f 噪声上翘。如果有,说明电路需要加斩波或自稳零技术。这个咱们后面章节会详细讲。
3.7 避坑指南
最后,分享几个我踩过的坑:
- 输入源必须是独立源:受控源(如 VCVS、CCCS)不能作为 .NOISE 的输入参考源。我曾经用过一个 VCVS 做输入,结果 SPICE 直接报错。
- 点数不要太多:1000 点对于大多数应用足够了。设成 10000 点,仿真时间会暴涨,但精度提升有限。
- 注意单位:频率单位默认是 Hz,但你可以用 MEG、K 等后缀。我习惯用
1e6表示 1 MHz,避免单位混淆。 - 输出节点不要悬空:如果你设
V(VOUT)而不指定参考节点,SPICE 默认参考地。但有些版本会报 warning,最好显式写成V(VOUT, 0)。
嗯,这一节的内容就这些。噪声分析是仪表放大器设计的基石,把 .NOISE 语句用熟,后面的优化才有依据。