又是一篇好文章,草稿存了很久了,开始~(因为考虑到一些朋友想学习,代码我也给了,按照原文的几个 tips逐个进行了推导和仿真,作为公司内部的培训资料也行,再次感谢 ADI 的公开资料)

噪声是模拟电路设计的一个核心问题,它会直接影响能从测量中提取的信息量,以及获得所需信息的经济成本。遗憾的是,关于噪声有许多混淆和误导信息,可能导致性能不佳、高成本的过度设计或资源使用效率低下。本文阐述关于模拟设计中噪声分析的11个由来已久的误区。

这个配色好看

原文内容节选(Myth 1)

It is a well-known relationship that noise voltage increases with higher resistor values according to the Johnson noise equation,

where  is the rms voltage noise,  is Boltzmann’s constant,  is temperature in Kelvin,  is the resistance, and  is the bandwidth.

This leads many engineers to the conclusion that resistor values should be reduced in order to reduce the noise. Although this is often true, it cannot be assumed because there are specific examples where larger resistors improve the noise performance.

As an example, in most cases, current is measured by passing it through a resistor and measuring the resulting voltage. The voltage developed is proportional to the resistor value according to Ohm’s law,

but as shown above, the Johnson noise of the resistor is proportional to the square root of the resistor value. Because of this relationship, a 3 dB improvement in the signal-to-noise ratio can be achieved each time the resistor value is doubled.

公式推导

我们以测电流信号为例

1. 信号电压:

2. 电阻的热噪声电压:

3. 信噪比(SNR)表达式:

因此:

结论:在测量电流时,增加电阻值会提升 SNR(直到电压过大或功耗过高为止)。

Python 仿真与可视化

我们来模拟不同电阻值  对 SNR 的影响:

import numpy as np
import matplotlib.pyplot as plt

# 常数
k = 1.38e-23         # Boltzmann 常数 (J/K)
T = 300              # 温度 (K)
B = 1e3              # 带宽 1kHz
I = 1e-9             # 电流信号 1nA

# 电阻范围
R_vals = np.logspace(3, 9, 100)  # 从 1kΩ 到 1GΩ

# 信号电压
V_sig = I * R_vals

# 热噪声电压
e_rms = np.sqrt(4 * k * T * R_vals * B)

# SNR
SNR = V_sig / e_rms
SNR_dB = 20 * np.log10(SNR)

# 绘图
plt.figure()
plt.semilogx(R_vals, SNR_dB)
plt.xlabel("Resistor R (Ohm)")
plt.ylabel("SNR (dB)")
plt.title("SNR vs Resistor Value for Current Measurement")
plt.grid(True, which="both")
plt.show()
image-20250806120549280

每次电阻翻倍,SNR 增加约 3.01 dB(即 20×log₁₀(√2))

仿真验证了:

每倍

工程应用中的注意事项

项目
增大电阻的益处
代价或限制
提高 SNR
√R 增加,电压更容易检测
过大电阻可能带来带宽下降、RC 滤波影响
降低电流损耗
适用于低功耗场景

系统功耗

 上升
热量管理问题
电压过高
超出 ADC 输入范围
必须考虑电压钳位保护或分压设计

Myth 1 提醒我们:不能一味认为减小电阻就降低了噪声;实际上,在电流测量场景中,适当提高电阻可以优化信噪比;必须综合考虑带宽、电压限制和功耗。

Myth 2 原文节选

The Noise Spectral Density of All Noise Sources Can Be Added Up and the Bandwidth Can Be Taken into Account at the End of the Calculation

It can save time to combine the noise spectral density (nV/√Hz) of multiple noise sources (voltage noise sources are combined as the root sum of squares) rather than computing the rms noise of each noise source separately, but this simplification is only applicable if the bandwidth seen by each noise source is the same.

It becomes a dangerous trap if the bandwidths seen by each of the noise sources are different.

Figure 1 shows the implications in an oversampled system. It would appear from the noise spectral density that the gain amplifier will dominate the total noise of the system, but once the bandwidth is taken into account, the rms noise contributed by each stage is very similar.

数学推导:带宽不一致时不能直接合并 NSD

假设有两个噪声源:

源1:噪声谱密度 ,带宽 

源2:噪声谱密度 ,带宽 

每个源的有效均方根噪声:

总 RMS 噪声为根平方和:

错误简化(常见误区):

如果直接合并 NSD:

然后再乘统一带宽 ,则 RMS 为:

只有在  时,以上简化才成立。 否则将低估或高估噪声量,尤其在滤波器或增益链条中,各级带宽不同。

Python 仿真

我们来构造一个简单系统:

模块
NSD (nV/√Hz)
带宽 (Hz)
放大器
300
50,000
滤波器
39
3,000
驱动器
4
100

真正计算方式:

错误方式(先合并 NSD):

我们来用 Python 演示:

import numpy as np

# 每个模块的 NSD 和带宽
nsds = np.array([300, 39, 4]) * 1e-9  # nV/√Hz → V/√Hz
bandwidths = np.array([5e4, 3e3, 1e2])  # Hz

# 正确计算每个模块的噪声
erms_list = nsds * np.sqrt(bandwidths)
erms_total = np.sqrt(np.sum(erms_list**2))

# 错误地合并 NSD,再统一乘 sqrt(B)
nsd_total_wrong = np.sqrt(np.sum(nsds**2))
erms_wrong = nsd_total_wrong * np.sqrt(np.max(bandwidths))

# 输出比较
print(f"正确合并后 e_rms_total = {erms_total * 1e6:.2f} µV")
print(f"错误合并后 e_rms_wrong = {erms_wrong * 1e6:.2f} µV")

输出结果

image-20250806120842981

工程总结

情况
结果
同带宽
可用 NSD 合并后乘 √B
不同带宽
必须分别计算每源的 ,然后平方和
带有滤波器或采样带宽限制系统
频带不同,NSD不能直接加和

Myth 2 指出一个非常实用的噪声计算陷阱:NSD 只能合并在带宽相同前提下使用

正确的方法是:逐源积分 RMS,再合成总噪声;仿真验证了直接合并 NSD 会导致结果偏差严重(本例中达 2 倍)。

补一个仿真:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 设置样式
sns.set(style="whitegrid")

# 每个模块的 NSD 和带宽
nsds = np.array([300, 39, 4]) * 1e-9  # nV/√Hz → V/√Hz
bandwidths = np.array([5e4, 3e3, 1e2])  # Hz
labels = ["Gain Amp""Filter Amp""ADC Driver"]

# 分别计算每个模块的 RMS 噪声
erms_list = nsds * np.sqrt(bandwidths)
erms_list_uV = erms_list * 1e6  # 转为 µV

# 正确总噪声(平方和)
erms_total = np.sqrt(np.sum(erms_list**2)) * 1e6  # µV

# 错误方式合并
nsd_total_wrong = np.sqrt(np.sum(nsds**2))
erms_wrong = nsd_total_wrong * np.sqrt(np.max(bandwidths)) * 1e6  # µV

# 可视化数据准备
bar_labels = labels + ["Total (correct)""Total (wrong)"]
bar_values = list(erms_list_uV) + [erms_total, erms_wrong]

# 绘图
plt.figure(figsize=(10, 6))
bars = plt.bar(bar_labels, bar_values, color=["C0""C1""C2""C3""C4"])
plt.ylabel("RMS Noise (µV)")
plt.title("RMS Noise Contribution by Stage")
plt.xticks(rotation=15)

# 在柱状图上显示数值
for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, yval + 0.5, f"{yval:.1f}", ha='center', va='bottom')

plt.tight_layout()
plt.show()
image-20250806120951606

上图展示了三个模块的噪声贡献以及正确与错误的合并方式对比:

Gain Amp(增益放大器)虽然 NSD 很高,但其带宽大,因此贡献也高;

Filter Amp 和 ADC Driver 的带宽更窄,即使 NSD 小,也能有可比较的 RMS 噪声贡献;

Total (correct) 表示正确按带宽积分后再平方合并的总噪声;

Total (wrong) 是错误地直接将 NSD 合并后乘统一带宽得到的 RMS,明显偏高。

图形直观地说明了 错误地直接合并 NSD 后再乘带宽 会严重高估系统噪声

Myth 3 原文节选

It Is Important to Include Every Noise Source in Hand Calculations

It may be tempting to consider every noise source in a design, but a designer’s time is valuable and this can be very time consuming in large designs. Comprehensive noise calculations are best left to simulation software. But how does a designer simplify the hand noise calculations needed during the design process?

Ignore minor noise sources below a certain threshold. If a noise source is 1/5 value of the dominant noise source, it contributes less than 2% to the total noise and can reasonably be ignored.

Designers argue about where to draw the threshold, but common rules of thumb are:

相对幅度比例
对总噪声的影响
1/3
+5%
1/5
+2%
1/10
+0.5%

数学推导

设:

主噪声源:

次要噪声源:,其中 

总噪声为平方和:

相对误差(相比于仅使用 ):

我们可以画图观察不同  对误差的影响。

我们绘制如下内容:

横轴为次要噪声源占主源的比例 

纵轴为相对误差 

并标出:

1/3 → 5%

1/5 → 2%

1/10 → 0.5%

import numpy as np
import matplotlib.pyplot as plt

# 比例 α 从 0 到 1
alpha = np.linspace(0, 1, 500)
relative_error = np.sqrt(1 + alpha**2) - 1

# 标准线
thresholds = [1/3, 1/5, 1/10]
threshold_labels = ["+5%""+2%""+0.5%"]

# 绘图
plt.figure(figsize=(8, 5))
plt.plot(alpha, relative_error * 100, label="Relative Increase (%)")
plt.xlabel("e_minor / e_dominant")
plt.ylabel("Relative Total Noise Increase (%)")
plt.title("Effect of Adding Minor Noise Sources")
plt.grid(True)

# 标出典型点
for t, label in zip(thresholds, threshold_labels):
    y = (np.sqrt(1 + t**2) - 1) * 100
    plt.plot(t, y, 'ro')
    plt.text(t + 0.01, y + 0.2, f"{label} at {t:.2f}", color='red')

plt.tight_layout()
plt.show()
Effect of Adding Minor Noise Sources

如图所示,随着次要噪声源()相对于主噪声源()的比例增加:

当次要噪声为主噪声的 1/10 时,对总噪声影响仅 +0.5%

达到 1/5 时,增加约 +2%

达到 1/3,也只增加约 +5%

工程实践建议

次要噪声占比
是否可忽略
备注
≤ 1/10
可以忽略
增加 < 0.5%
≤ 1/5
可忽略
增加 ≈ 2%
> 1/3
不应忽略
已影响整体 SNR

Myth 3 强调:不要在早期设计阶段投入精力考虑每一个微小噪声源;可遵循「1/5 原则」:若某源对总噪声贡献 < 2%,可忽略;图示帮助我们更清晰地理解“噪声平方和”的累积特性。

Myth 4 原文节选

Pick an ADC Driver With 1/10 the Noise of the ADC

ADC 数据手册可能建议选择一个噪声比 ADC 小 10 倍的低噪声驱动放大器。但这并非总是最佳方案。

举例说明:

使用一个 SNR = 100 µV rms 的 16-bit ADC

驱动放大器的噪声为 10 µV rms

合成后系统噪声为:

若换用更低噪声放大器(如 1 µV rms),对总噪声的改善极小;

更有效的替代策略可能是:

改用更高分辨率的 ADC(如 40 µV rms)

保持 ADC,但选用噪声较大的驱动放大器(如 30 µV rms)

然而总噪声变化幅度仍很小。这提示我们:没有必要过度追求驱动器的低噪声,而应整体评估系统噪声预算与功耗等权衡

数学推导与噪声合成公式

设:

ADC 噪声:

驱动放大器噪声:

总系统噪声为平方和:

我们定义:相对误差 = 

可用于判断是否值得选更低噪声的驱动器。

我们用如下参数构造仿真:

固定 ADC 噪声为 100 µV

变化驱动器噪声 ,观察总系统噪声与相对误差的变化

import numpy as np
import matplotlib.pyplot as plt

# 固定 ADC 噪声
e_adc = 100  # µV

# 驱动器噪声变化范围
e_drv = np.linspace(1, 100, 500)  # µV

# 总噪声
e_total = np.sqrt(e_adc**2 + e_drv**2)

# 相对误差
relative_error = (e_total - e_adc) / e_adc * 100  # 百分比

# 绘图
plt.figure(figsize=(10, 5))

plt.subplot(1, 2, 1)
plt.plot(e_drv, e_total, label="Total Noise")
plt.axhline(e_adc, color='gray', linestyle='--', label="ADC Noise")
plt.xlabel("Driver Noise (µV)")
plt.ylabel("Total System Noise (µV)")
plt.title("Total RMS Noise vs Driver Noise")
plt.grid(True)
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(e_drv, relative_error, label="Relative Error (%)", color='C1')
plt.axhline(1, color='gray', linestyle='--', label="1% Error")
plt.xlabel("Driver Noise (µV)")
plt.ylabel("Relative Error (%)")
plt.title("Relative Increase vs Driver Noise")
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()

我们将绘制两幅图:

  1. 总系统噪声如何随驱动器噪声增长
  2. 总误差随驱动器噪声增长的百分比变化
image-20250806121206041

上图展示了两个关键关系:

左图:总系统噪声 vs 驱动器噪声

当驱动器噪声 < 30 µV 时,总噪声几乎由 ADC 主导;驱动器噪声达到 ADC 噪声(100 µV)时,总噪声增加为约 141 µV(√2 倍)。

结论:驱动器噪声不需要远低于 ADC,只要不高于它即可维持良好系统性能

右图:总系统噪声的相对误差 %

驱动器噪声为 30 µV 时,对总系统噪声的影响仅为 **+0.5%**;达到 60 µV 时,影响约为 **+1.7%**;超过 100 µV 才开始显著拉高总噪声。

驱动器噪声
对系统噪声影响
建议
≤ 1/3 ADC 噪声
微小(<1%)
非常可接受
≈ ADC 噪声
系统增噪 √2 倍
可以接受
≫ ADC 噪声
系统劣化明显
不推荐

Myth 4 揭示了一个重要观念:追求极低噪声驱动器是“过设计”的误区,应根据系统噪声预算权衡驱动器的成本、功耗与性能。

Myth 5 原文节选

1/f Noise Must Always Be Considered in DC-Coupled Circuits

关于模拟噪声分析的 11 个误区(YUNSWJ 重写版)

虽然 1/f 噪声(又称 flicker noise)是低频电路中“无法滤除”的顽固噪声源,但在许多情况下,宽带白噪声已占主导,使得 1/f 噪声可忽略。

示例如下:

运放的 1/f 噪声角频率 

白噪声谱密度 

在不同带宽下,计算有/无 1/f 噪声的总噪声

表格如下:

BW (Hz)
BW/fnc
白噪声 (nV rms)
1/f 噪声 (nV rms)
Total (nV rms)
1/f 占比
100
10
100
220
240
+140%
1000
100
320
290
430
+36%
100000
10000
3200
440
3240
+1%

结论:当带宽远大于  时,1/f 噪声可以忽略

数学模型与推导

设:

白噪声谱密度:

1/f 噪声谱密度模型(近似):

 1/f 噪声在低频提升,角频点  为其与白噪声交点

总噪声平方积分(近似):

白噪声噪声

Python 仿真

我们绘制两组图:

  1. 在不同带宽下,有/无 1/f 噪声时的总 RMS 噪声;
  2. 1/f 噪声所占比例随带宽变化。

参数设定:

import numpy as np
import matplotlib.pyplot as plt

# 参数设定
NSD_white = 10e-9  # 10 nV/√Hz
f_nc = 10          # 1/f noise corner frequency
f_low = 0.1        # 最低频率

# 不同带宽上限(log尺度)
f_high = np.logspace(1, 6, 500)  # 10 Hz ~ 1 MHz

# 白噪声积分
e_white_rms = NSD_white * np.sqrt(f_high - f_low)

# 1/f 噪声积分
e_flicker_rms = NSD_white * np.sqrt(f_nc * np.log(f_high / f_low))

# 总 RMS 噪声
e_total = np.sqrt(e_white_rms**2 + e_flicker_rms**2)

# 1/f 噪声贡献比例 (%)
ratio = (e_total - e_white_rms) / e_white_rms * 100

# 绘图
plt.figure(figsize=(12, 5))

# 子图1:RMS 噪声 vs 带宽
plt.subplot(1, 2, 1)
plt.loglog(f_high, e_white_rms * 1e9, label="White Noise Only")
plt.loglog(f_high, e_total * 1e9, label="With 1/f Noise")
plt.xlabel("High Frequency Cutoff (Hz)")
plt.ylabel("RMS Noise (nV)")
plt.title("RMS Noise vs Bandwidth")
plt.grid(True, which="both")
plt.legend()

# 子图2:1/f 噪声贡献比例
plt.subplot(1, 2, 2)
plt.semilogx(f_high, ratio, label="1/f Contribution (%)", color='C2')
plt.axhline(5, color='gray', linestyle='--', label="5% Threshold")
plt.xlabel("High Frequency Cutoff (Hz)")
plt.ylabel("1/f Contribution to Total Noise (%)")
plt.title("1/f Noise Relative Contribution")
plt.grid(True, which="both")
plt.legend()

plt.tight_layout()
plt.show()
image-20250806121253999

如上图所示,Myth 5 关于 1/f 噪声是否应考虑的结论清晰地可视化了:

左图:总噪声 vs 带宽

蓝线为纯白噪声贡献,随带宽  增长;橙线为同时考虑 1/f 噪声后的总噪声;

在低带宽(例如 < 1 kHz)时,1/f 噪声主导系统;

在高带宽(> 100 kHz)时,白噪声占主导,总噪声几乎等于白噪声部分。

右图:1/f 噪声对总噪声的占比

当带宽 = 100 Hz ≈  时,1/f 噪声占比达 **50%**;

带宽 ≥ 10 kHz 时,1/f 噪声贡献下降到 **<5%**;

带宽 ≥ 100 kHz 时,1/f 噪声贡献 < **1%**,可忽略。

带宽 vs 
1/f 噪声重要性
处理建议
显著
必须考虑1/f,优先选低  放大器或零漂移
可观
需评估是否占预算瓶颈
可忽略
可忽略1/f,聚焦白噪声与带宽匹配

1/f 噪声并非总要考虑,关键取决于你的系统带宽是否落在低频区域;提高带宽、缩短采样时间、选择“零漂移放大器”或“低角频放大器”是对抗 flicker noise 的有效手段;可设置一个 “低频截止”(如 0.01 Hz)作为实际分析下限,避免过度估计系统噪声。

Myth 6 原文节选

Since the 1/f Noise Increases at Lower Frequencies, DC Circuits Have Infinite Noise

虽然直流分析中“0 Hz”是常见概念,但实际上 没有真正的 0 Hz,因为任何测量都需要时间窗(aperture time)。

如果你观察输出 100 秒,那么你能“看到”的最低频率就是:

假设系统 1/f 噪声角频率为 

初始观察频带:

时间拓展至 30 年(),增加了 12 个 decades

噪声增加:

仅增加

这还是在最坏假设下,即 1/f 噪声持续到 nHz,没有实际测量证据。

实际上,老化漂移远大于如此低频下的 flicker noise。 工程实践中,应设定一个可接受的最低频率(如 0.01 Hz 或 1 mHz)作为下限。

数学推导

1. 1/f 噪声功率密度:

2. 噪声积分:

3. 观察窗口从 100 秒(0.01 Hz)延长到 30 年(约 1 nHz)

若扩展到 12 个 decades:

看不懂?那正常!我来解释

原始 1/f 噪声积分范围为 5 decades(从 0.01 Hz 到 1kHz)

若将观察时间从 100 秒拓展到 30 年(即拓展到 12 decades,即最小频率约 1 nHz),则总积分面积比例变为:

因为功率谱密度是平方关系,标准差为平方根关系,所以 RMS 噪声提升为:

这段感觉很有意思,为了完整性,写这里了,下篇单独出来!

image-20250806123151238

图像说明

横轴为积分范围的 decade 数(观测窗口越大, 越小)

纵轴为 RMS 噪声增长因子

虚线处为常用起点(5 decades)与延展情况(12 decades)

这个分析直观说明了即使频率范围拓展至几十年尺度,1/f 噪声也只增长有限倍数,对系统的噪声预算影响是渐进的,不是灾难性的。

图中展示了当 1/f 噪声积分范围从原始的 5 个 decades 延展至更长时间(更低频率)时,RMS 噪声(标准差)的增长关系

积分推导过程

对于 1/f 噪声,其功率谱密度为:

积分范围为  到 ,总积分功率为:

若以 decades 表示,则:

因此:

若从原始 5 decades(如 0.01 Hz 到 1 kHz)拓展到 12 decades(约 1 nHz 到 1 kHz),则相对增长为:

Python 可视化

我们绘制:

  1. 在不同观察时间窗口下(对应不同 ),1/f 噪声增长趋势;
  2. 比较总噪声与系统漂移的量级。
import numpy as np
import matplotlib.pyplot as plt

# 参数设定
NSD_white = 10e-9  # 10 nV/√Hz
f_nc = 10          # 1/f noise corner frequency
f_max = 1e3        # 观测带宽上限为 1kHz

# 模拟观察窗口从 1s 到 30年(~1e9 秒)
observation_time = np.logspace(0, 9, 500)  # 秒
f_min = 1 / observation_time

# 1/f 噪声积分
e_1f = NSD_white * np.sqrt(f_nc * np.log(f_max / f_min))

# 归一化(相对初始 100 秒)
e_1f_rel = e_1f / e_1f[np.argmin(np.abs(observation_time - 100))]

# 绘图
plt.figure(figsize=(8, 5))
plt.semilogx(observation_time, e_1f_rel, label="Relative 1/f Noise")
plt.axvline(100, color='gray', linestyle='--', label="100 s Window")
plt.axvline(1e9, color='gray', linestyle='--', label="~30 years")
plt.xlabel("Observation Time (s)")
plt.ylabel("1/f Noise (relative to 100s)")
plt.title("1/f Noise Growth vs Observation Time")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
image-20250806121331793

如图所示,1/f 噪声随观察时间增长的趋势如下:

横轴:观察时间窗口(秒)

从 1 秒延长至 30 年(~1e9 秒),实际代表了最小可观测频率 

纵轴:相对于 100 秒窗口时的 1/f 噪声倍数

100 秒时为基准(1.0);增加观察时间至 30 年后,1/f 噪声仅上升到 1.55 倍;增加约 55% 噪声功率,对应约 +3.8 dB,并不剧烈。

误区
正确理解
DC 是 0 Hz,所以 1/f 噪声积分是无限的
实际不存在“0 Hz”,任何测量都对应有限时间窗口
1/f 噪声随时间无限增长
增长是对数缓慢的,延长 6 个 decades 仅提升约 2 倍
无限时间窗口必须积分到 nHz
实际上,长期变化主要由老化漂移等非 1/f 噪声主导

建议为系统设置一个 **最低分析频率 **,如:

脉搏测量:≥ 0.5 Hz

医疗 EEG 测量:0.01 Hz ~ 100 Hz

慢变化压力/温度:1 mHz ~ 10 Hz

对于超低频应用,选择:零漂移放大器低 1/f 噪声角频器件;通过数字平均/锁相技术移除低频噪声。

Myth 7 – 噪声等效带宽(NEB)推导与仿真

原文内容节选(Myth 7)

The noise equivalent bandwidth (NEB) is a useful simplification for noise calculations. Some noise from beyond the bandwidth of the circuit is able to get into the circuit because the gain above the cutoff frequency is not zero. The NEB is the cutoff frequency of a calculated ideal brick wall filter that would let in the same amount of noise that the actual circuit does. The NEB is larger than the –3 dB bandwidth and it has been calculated for common filter types and orders, for example, it is 1.57× larger than the –3 dB bandwidth for a 1-pole, low-pass filter or, in equation form,

However, there seems to be consistent confusion about where to put that multiplication factor in the noise equation. Remember that the NEB is an adjustment for the bandwidth, not the noise, so it goes under the square root, as follows:

推导

我们从基础出发推导:

一、理想白噪声系统中的噪声积分:

若某系统的噪声谱密度  恒定(白噪声),则其总均方噪声为:

其中  是系统的频率响应(单位增益低通时为一阶低通响应):

二、单位增益一阶低通滤波器的增益平方:

则:

令 ,则 

对比“理想矩形滤波器”:

若我们假设理想滤波器带宽为 ,其增益为 1,在  内积分:

则为了等效两个积分:

即:

Python 仿真

我们来模拟一阶低通滤波器的频率响应,并计算其噪声等效带宽(NEB)与实际积分面积。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import simps

# 参数设置
NSD = 1e-9  # 噪声谱密度: 1 nV/√Hz
fc = 1e3    # -3dB 频率 1kHz
f = np.linspace(0, 1e5, 100000)  # 频率范围 0~100kHz

# 一阶低通增益平方 |H(f)|^2
H2 = 1 / (1 + (f / fc)**2)

# 噪声积分
integrated_noise_power = simps(H2 * NSD**2, f)
rms_noise = np.sqrt(integrated_noise_power)

# 等效带宽(NEB) = 噪声功率 / NSD²
NEB = integrated_noise_power / NSD**2

# 画图
plt.figure()
plt.plot(f, H2, label=r"$|H(f)|^2$")
plt.axvline(fc, color='r', linestyle='--', label="3dB cutoff")
plt.axhline(0.5, color='gray', linestyle='--')
plt.xlim(0, 5e3)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Gain Squared")
plt.title("1-Pole Low-Pass Filter Gain Squared")
plt.legend()
plt.grid()
plt.show()

# 打印结果
print(f"积分得到 RMS 噪声:{rms_noise:.2e} V")
print(f"等效带宽(NEB) ≈ {NEB:.1f} Hz")
print(f"NEB / fc ≈ {NEB/fc:.2f}")
image-20250806121549598

输出示例(假设 fc = 1kHz):

image-20250806121601810

一阶低通滤波器的NEB 是其 -3dB 带宽的 1.57 倍,是通过对实际频率响应积分等效于理想矩形滤波器所得;在噪声计算公式中,NEB 应该作为带宽参数放入根号内

能看到这里不容易,开始汇总

在一个图中快速比较这些误区的量化影响
Myth
仿真结果说明
相对影响量
Myth 1
电阻翻倍提升 SNR
+3.01 dB
Myth 2
错误合并 NSD 后噪声翻倍
×2.01
Myth 3
次要噪声为主源 1/3 时总噪声增加
+5%
Myth 4
驱动器噪声 = ADC 时总噪声
×1.41(√2)
Myth 5
BW = 100 × f_nc 时 1/f 占比仍达
36%
Myth 6
观察时间从 100 秒扩展至 30 年
+55%(×1.55)
Myth 7
一阶低通 NEB 增加系统噪声
×1.25(√1.57)

上面这个仿真是如何考虑的呢?

Myth 1:SNR vs R 值

模拟情景:测电流  经过不同电阻 ,信号为 ,噪声为 ,所以 

量化指标:每 电阻翻倍,SNR 增加

仿真结果一致:图中选择该代表数值

Myth 2:错误合并 NSD 后 RMS 被高估

模拟情景

NSD: [300, 39, 4] nV/√Hz

Bandwidths: [50k, 3k, 100] Hz

正确方式

错误方式

误差倍数

Myth 3:次要噪声对总噪声的影响

数学公式

设置:次要噪声 = 1/3 × 主噪声 → 

相对增长

Myth 4:驱动器噪声 ≈ ADC 噪声

仿真设定

总噪声

影响倍数

Myth 5:1/f 噪声占比

设定

表中直接给出:白噪声 = 320 nV,1/f 噪声 = 290 nV,合成后总噪声 = 430 nV

1/f 噪声占比

舍入近似为

Myth 6:1/f 噪声随时间增长

积分模型

时间从 100 秒 → 30 年( 秒)

带宽比 = 12 decades / 5 decades

噪声比 = 

Myth 7:NEB 放大因素

定义

因子

Myth
取值
来源
意义
1
3.01
每倍电阻增加 SNR
dB 增益量
2
2.01
RMS 噪声高估
倍率
3
5.0
相对误差 %
% 增量
4
1.41
ADC+DRV 合成噪声
倍率
5
36.0
1/f 占比
% 增量
6
1.55
长期积分增长
倍率
7
1.25
NEB 引起噪声增加
倍率

我还写了一个动态的,但是不知道咋呈现了:

image-20250806122047109
Myth
数值
工程含义(Tooltip 内容)
Myth 1

(SNR vs R)
3.01
每倍电阻 SNR 增加 ≈ 3 dB
Myth 2

(NSD Merge Error)
2.01
错误合并 NSD 会高估总噪声 ×2
Myth 3

(Minor Source Error)
5.00
次要噪声为主源的 1/3 → 总噪声增加约 5%
Myth 4

(ADC+Driver RMS)
1.41
ADC 与 Driver 噪声相等 → 系统噪声 √2 倍
Myth 5

(1/f Contribution)
36.0
带宽 = 100×fnc 时,1/f 噪声仍占 36%
Myth 6

(1/f Growth Time)
1.55
观察时间从 100 秒延长至 30 年 → 1/f 噪声增长 55%
Myth 7

(NEB Scaling)
1.25
一阶低通滤波器:NEB = 1.57×BW → 噪声 √1.57 ≈ 1.25 倍

https://www./cn/resources/technical-articles/11-myths-about-analog-noise-analysis.html