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 噪声分析的知识体系

下面这张图,是我自己总结的噪声分析核心逻辑。你看一遍就能明白整个流程:

SPICE 噪声分析核心流程 SPICE 噪声分析核心流程 定义 .NOISE 语句 设置输出节点 V(VOUT, 0) 选择输入参考源 VIN 设置频率范围与点数 运行仿真并查看结果 常见错误 输入源名字写错 频率范围包含 0 Hz 输出结果 噪声谱密度曲线 总 RMS 噪声值

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 语句用熟,后面的优化才有依据。