數值手感 Numerical Feeling
理論再漂亮,沒有數字就沒有手感。這頁用三個小例子,把 phase、time、dBc/Hz、jitter
之間的換算練成反射動作。每個例子都附 Python 驗證;完整函式庫在
simulations/common/。
公式來源:相位/時間/jitter 換算與 1/f² 積分皆為標準結果,並與 [P1] A. Hajimiri and T. H. Lee, "A General Theory of Phase Noise in Electrical Oscillators," IEEE JSSC, 33(2), 1998(尤其 Eq.(21))一致;逐步推導見 impulse_to_phase_shift 與 psd_phase_noise_jitter。
為什麼先練數字:類比設計師在白板上估數量級的能力,比記公式重要。看到 「 dBc/Hz @ 1 MHz、5 GHz」,你要能在 30 秒內估出「大概幾百 fs jitter」。
Example 1:phase → time
若 GHz、 mrad,求 timing error。
- Dimension check: ✓( 是 rad/s)。
- 手感:5 GHz 下「1 mrad ≈ 32 fs」。週期是 200 ps,所以 1 mrad 約是週期的 。
from simulations.common.noise_utils import phase_to_time_error
print(phase_to_time_error(1e-3, 5e9) * 1e15, "fs") # -> 31.83 fs
Example 2:injected charge → phase step → time
若 pC、 fC、,求 phase step 與(在 5 GHz 的)timing error。
相位步階:
時間誤差( GHz):
- 手感:1 fC ≈ 6240 個電子;在最敏感相位也只踢出 ~16 fs。單顆很小,但 noise 持續踢、 會被相位積分器累積(見 convolution_derivation)。
- 完整推導見 impulse_to_phase_shift(例 A)。
from simulations.common.isf_utils import impulse_to_phase_step
from simulations.common.noise_utils import phase_to_time_error
dphi = impulse_to_phase_step(1e-15, 0.5, 1e-12)
print(dphi, "rad ->", phase_to_time_error(dphi, 5e9)*1e15, "fs") # 0.0005 rad -> 15.92 fs
Example 3:phase noise plot → rms jitter(要會積分)
若 dBc/Hz、假設 1/f² 斜率、由 1 MHz 積到 100 MHz、 GHz,估 rms jitter。
步驟 1:dBc/Hz 換成 linear 並還原 phase PSD。 單音小角近似下 ,所以 。 在 1 MHz: dBc/Hz , rad²/Hz。
步驟 2:寫出 1/f² 形狀。 以 MHz 錨定:
步驟 3:積分得 phase variance。
步驟 4:換成 rms jitter。
- 手感:積分被下限 主導( 項最大)——所以「從哪裡開始積」對 1/f² 很關鍵。
- 參考點:若這顆是 dBc/Hz @ 1 MHz(好 10 倍功率、 倍電壓),jitter 約縮到 ~45 fs。
- 這正是 lab_08 的圖;數值積分與解析式完全一致。

import numpy as np
from simulations.common.noise_utils import leeson_one_over_f2, integrate_rms_jitter
f = np.logspace(6, 8, 4000) # 1 MHz -> 100 MHz
L = leeson_one_over_f2(f, L_ref_dbc=-100, f_ref=1e6) # 1/f^2 skirt
sigma_t, sigma_phi = integrate_rms_jitter(f, L, f0=5e9, fmin=1e6, fmax=100e6)
print(sigma_phi*1e3, "mrad ;", sigma_t*1e15, "fs") # -> 14.07 mrad ; 447.9 fs
完整 script:simulations/lab_08_jitter_integration.py。