Skip to main content

β: This English translation is in beta — the Traditional-Chinese original is the authoritative version.

Numerical Feeling

However beautiful the theory, without numbers there is no feel. This page uses three small examples to turn the conversions among phase, time, dBc/Hz, and jitter into reflexes. Each example comes with a Python check; the full library lives in simulations/common/.

Formula sources: the phase/time/jitter conversions and the 1/f² integral are all standard results, consistent with [P1] A. Hajimiri and T. H. Lee, "A General Theory of Phase Noise in Electrical Oscillators," IEEE JSSC, 33(2), 1998 (especially Eq.(21)); step-by-step derivations in impulse_to_phase_shift and psd_phase_noise_jitter.

Why drill the numbers first: an analog designer's ability to estimate orders of magnitude at the whiteboard matters more than memorizing formulas. Given "100-100 dBc/Hz @ 1 MHz, 5 GHz," you should be able to estimate "a few hundred fs of jitter" within 30 seconds.

Example 1: phase → time

Given f0=5f_0=5 GHz and Δϕ=1\Delta\phi=1 mrad, find the timing error.

Δt=Δϕ2πf0=1×103 rad2π×5×109 Hz=1033.1416×1010 s3.18×1014 s=31.8 fs.\Delta t=\frac{\Delta\phi}{2\pi f_0}=\frac{1\times10^{-3}\ \text{rad}}{2\pi\times5\times10^{9}\ \text{Hz}}=\frac{10^{-3}}{3.1416\times10^{10}}\ \text{s}\approx3.18\times10^{-14}\ \text{s}=31.8\ \text{fs}.
  • Dimension check: [rad]/[rad/s]=[s][\text{rad}]/[\text{rad/s}]=[\text{s}] ✓ (2πf02\pi f_0 is in rad/s).
  • Feel: at 5 GHz, "1 mrad ≈ 32 fs." The period is 200 ps, so 1 mrad is about 1.6×1041.6\times10^{-4} of a period.
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

Given qmax=1q_{max}=1 pC, Δq=1\Delta q=1 fC, Γ=0.5\Gamma=0.5, find the phase step and the timing error (at 5 GHz).

Phase step:

Δϕ=ΓΔqqmax=0.5×10151012=5×104 rad  (0.0286).\Delta\phi=\frac{\Gamma\,\Delta q}{q_{max}}=\frac{0.5\times10^{-15}}{10^{-12}}=5\times10^{-4}\ \text{rad}\;(\approx0.0286^\circ).

Timing error (f0=5f_0=5 GHz):

Δt=5×1042π×5×10915.9 fs.\Delta t=\frac{5\times10^{-4}}{2\pi\times5\times10^{9}}\approx15.9\ \text{fs}.
  • Feel: 1 fC ≈ 6240 electrons; even at the most sensitive phase it only kicks out ~16 fs. Each kick is tiny, but noise keeps kicking and the phase integrator accumulates it (see convolution_derivation).
  • Full derivation in impulse_to_phase_shift (Example 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 (you must be able to integrate)

Given L(1MHz)=100\mathcal{L}(1\,\text{MHz})=-100 dBc/Hz, assuming a 1/f² slope, integrating from 1 MHz to 100 MHz, f0=5f_0=5 GHz, estimate the rms jitter.

Step 1: convert dBc/Hz to linear and recover the phase PSD. Under the single-tone small-angle approximation L(f)12Sϕ(f)\mathcal{L}(f)\approx\frac12 S_\phi(f), so Sϕ(f)=210L(f)/10S_\phi(f)=2\cdot10^{\mathcal{L}(f)/10}. At 1 MHz: L=100\mathcal{L}=-100 dBc/Hz 1010\Rightarrow 10^{-10}, Sϕ(1MHz)=2×1010S_\phi(1\text{MHz})=2\times10^{-10} rad²/Hz.

Step 2: write down the 1/f² shape. Anchored at fref=1f_{ref}=1 MHz:

Sϕ(f)=Sϕ(fref)(freff)2=2×1010(106f)2.S_\phi(f)=S_\phi(f_{ref})\left(\frac{f_{ref}}{f}\right)^2=2\times10^{-10}\left(\frac{10^6}{f}\right)^2.

Step 3: integrate to get the phase variance.

σϕ2=f1f2Sϕ(f)df=2×1010(106)2 ⁣106108dff2=2×102(11061108).\sigma_\phi^2=\int_{f_1}^{f_2}S_\phi(f)\,df=2\times10^{-10}\,(10^6)^2\!\int_{10^6}^{10^8}\frac{df}{f^2}=2\times10^{2}\left(\frac{1}{10^6}-\frac{1}{10^8}\right). σϕ2=200×(106108)=200×9.9×107=1.98×104 rad2σϕ=1.407×102 rad=14.07 mrad.\sigma_\phi^2=200\times(10^{-6}-10^{-8})=200\times9.9\times10^{-7}=1.98\times10^{-4}\ \text{rad}^2\Rightarrow\sigma_\phi=1.407\times10^{-2}\ \text{rad}=14.07\ \text{mrad}.

Step 4: convert to rms jitter.

σt=σϕ2πf0=1.407×1022π×5×1094.48×1013 s=447.9 fs.\sigma_t=\frac{\sigma_\phi}{2\pi f_0}=\frac{1.407\times10^{-2}}{2\pi\times5\times10^{9}}\approx4.48\times10^{-13}\ \text{s}=447.9\ \text{fs}.
  • Feel: the integral is dominated by the lower limit f1f_1 (the 1/f11/f_1 term is largest) — so "where you start integrating" is critical for 1/f².
  • Reference point: if this part were 120-120 dBc/Hz @ 1 MHz (10× better in power, 102=10\sqrt{10^2}=10× in voltage), the jitter shrinks to roughly ~45 fs.
  • This is exactly the figure of lab_08; the numerical integration matches the analytic expression exactly.

rms jitter obtained by integrating L(f)

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

Full script: simulations/lab_08_jitter_integration.py.

Parameter and unit quick reference

QuantitySymbolUnitConversion
Phase errorΔϕ,σϕ\Delta\phi,\sigma_\phirad11 rad =180/π57.3=180/\pi\approx57.3^\circ
Timing errorΔt,σt\Delta t,\sigma_tsΔt=Δϕ/(2πf0)\Delta t=\Delta\phi/(2\pi f_0)
phase PSDSϕS_\phirad²/HzSϕ=210L/10S_\phi=2\cdot10^{\mathcal{L}/10}
SSB phase noiseL\mathcal{L}dBc/HzL12Sϕ\mathcal{L}\approx\frac12 S_\phi (→ dB)
ChargeΔq,qmax\Delta q,q_{max}C1 fC =1015=10^{-15} C

Key takeaways

  • 5 GHz conversion anchors: 1 mrad ≈ 32 fs; 1 rad ≈ 31.8 ps.
  • dBc/Hz → linear → Sϕ=2×S_\phi=2\timeslinear → integrate → square root → ÷(2πf0)\div(2\pi f_0) = rms jitter.
  • 1/f² jitter is dominated by the lower integration limit.
  • All the numbers in these three examples can be checked in one line with the built-in functions in simulations/common/.