β: This English translation is in beta — the Traditional-Chinese original is the authoritative version.
Lab 11 — Monte Carlo accumulated jitter — RJ is Gaussian, σ grows as √ΔN
Breadcrumb: Simulation labs › Noise & jitter › This page (Monte Carlo accumulated jitter). Upstream: oscillator_phase, lab_03; downstream: lab_12, lab_13.
This lab uses the most direct method — Monte Carlo (large-scale random sampling statistics) — to prove that the random jitter (RJ, Gaussian, unbounded) accumulated by a free-running (unlocked) oscillator has two key properties:
- its distribution is Gaussian;
- its standard deviation grows as the square root of the accumulated period count: .
This is the junction between the "statistical (time-domain) view" and the "spectral view", and it is the microscopic origin of [P2] Eq.(8), .
Physical intuition (conclusion first): every period, noise pushes the oscillator's edge (zero-crossing/transition instant) by an independent small amount, mean 0, standard deviation . Phase has no restoring force (see oscillator_phase), so these small pushes are never pulled back — they simply accumulate. This is a one-dimensional random walk. After steps, a random walk's position still has mean 0, but its variance is times the single-step variance, so the standard deviation grows as . And a sum of independent small increments tends to Gaussian by the central limit theorem.
1. Learning objectives
- Use Monte Carlo to directly "see" the Gaussian distribution of accumulated jitter.
- Verify the random-walk law : a increase in gives only a increase in .
- Link this time-domain result to [P2] Eq.(8), ( a proportionality constant).
- Understand why phase/jitter accumulates — because phase has no restoring force (unlike amplitude).
2. Mathematical model
Per-period increment. The edge-timing error of the -th period is an i.i.d. Gaussian increment:
Accumulated jitter = sum of increments (random walk). After accumulating periods, the timing error relative to the ideal edge is:
Statistical properties (step by step). The increments are independent with zero mean:
- Why variances add: the variance of a sum of independent random variables equals the sum of the individual variances (zero covariance). This is the entire origin of the "".
- Why it's Gaussian: a sum of independent increments tends to Gaussian by the central limit theorem (and since each increment is already Gaussian, the sum is exactly Gaussian).
- Dimension check: is in s, is dimensionless ( is a period count), so is in s ✓.
Linking to [P2] Eq.(8). Convert the accumulated period count into accumulated time :
i.e., [P2] Eq.(8), p.792, , with .
- Dimension check (): , consistent with the unit given for in the canonical symbol table ✓.
3. Block diagram
4. Core Python code
Verbatim excerpt from main() in simulations/lab_11_monte_carlo_jitter.py: for each accumulation
length lag (=), draw n_trials × lag independent Gaussian increments, sum along the
period axis to get the accumulated error acc, measure its std, then overlay the theoretical
Gaussian.
f0 = 5e9
sigma_edge = 50e-15 # 50 fs per period
n_trials = 200000
lags = [25, 100, 400] # number of periods accumulated
for lag, c in zip(lags, colors):
incr = sigma_edge * RNG.standard_normal((n_trials, lag))
acc = incr.sum(axis=1) # accumulated timing error after `lag` periods
sigma_meas = np.std(acc)
sigma_theory = sigma_edge * np.sqrt(lag)
# histogram (in fs)
ax.hist(acc / 1e-15, bins=120, density=True, alpha=0.35, color=c,
label=fr"$\Delta N$={lag}: 量得 $\sigma$={sigma_meas/1e-15:.0f} fs "
fr"(理論 {sigma_theory/1e-15:.0f} fs)")
# gaussian overlay
xx = np.linspace(acc.min(), acc.max(), 300)
g = np.exp(-xx ** 2 / (2 * sigma_theory ** 2)) / (sigma_theory * np.sqrt(2 * np.pi))
ax.plot(xx / 1e-15, g * 1e-15, color=c, lw=1.6)
incr.sum(axis=1)sumslagindependent increments — a one-dimensional random walk.sigma_meas = np.std(acc)(measured) converges digit by digit tosigma_theory = sigma_edge*np.sqrt(lag)(theoretical), becausen_trials=200000is large enough.- The Gaussian overlay
guses the theoretical ; its match to the histogram is the proof that the distribution is Gaussian.
Expected numbers ( fs): fs, fs, fs (each step in gives in ).
5. Full script path
simulations/lab_11_monte_carlo_jitter.py
(dependency: savefig from simulations/common/plot_utils.py. Everything else uses numpy/matplotlib.)
Run with: python scripts/run_all_sims.py.
6. Parameter table
| Parameter | Variable | Value | Notes |
|---|---|---|---|
| Oscillation frequency | f0 | Hz | 5 GHz (used for the conversion) |
| Per-period jitter | sigma_edge | s | rms increment per edge per period (50 fs) |
| Monte Carlo trials | n_trials | trials per | |
| Accumulated period counts | lags | , in a geometric progression | |
| Histogram bins | — | density histogram | |
| Random seed | RNG | default_rng(11) | reproducible results |
7. Units table
| Quantity | Symbol | Unit | Value in this lab |
|---|---|---|---|
| Per-period increment | s | fs | |
| Accumulated period count | — (count) | 25 / 100 / 400 | |
| Accumulated jitter | s | 250 / 500 / 1000 fs | |
| Accumulated time | s | time spanned by periods | |
| Proportionality constant | |||
| Probability density | — | 1/s (1/fs on the plot) | Gaussian curve |
8. Simulation plot

9. How to read the plot
- Three bell curves (blue/orange/red for ): the histogram (translucent) and the theoretical Gaussian curve (solid line) overlap almost perfectly — this is direct evidence that "RJ is Gaussian".
- Wider means longer accumulation: as grows, the bell gets shorter and wider. Note the width () grows only as : from (), goes from 250 fs to 500 fs (only ); from (another ), 500 fs becomes 1000 fs (another ).
- "Measured σ vs. theoretical" in the legend: the two numbers are nearly identical, quantitatively verifying .
- How to use it: this explains why a free-running oscillator's long-term stability cannot be described by "per-period jitter" alone — jitter grows with observation time. Stopping the accumulation requires a PLL/CDR to lock the phase back to a reference (see lab_13).
10. Corresponding paper equations/figures
- Core correspondence: [P2] A. Hajimiri, S. Limotyrakis, and T. H. Lee, "Jitter and Phase Noise in Ring Oscillators," IEEE JSSC, 34(6), 1999, Eq.(8), p.792: . This lab proves its microscopic origin is a random walk of per-edge Gaussian increments, and derives .
- Spec Section 10.2, "period / cycle-to-cycle jitter kernels": accumulated jitter "has no differencing (low-frequency dominated)", corresponding to the pure accumulation here (no high-pass differencing kernel).
- Phase has no restoring force (hence accumulates): [P1]'s LTV phase model (canonical formula 11), consistent with the geometry in oscillator_phase.
- Corresponds to site figure
monte_carlo_jitter_histogram.png; echoes the time-domain accumulation plotring_oscillator_timing_noise_accumulation.pngin lab_03.
11. Limitations and approximations
- This is a pedagogical toy model, not transistor-level: we directly assume an independent Gaussian increment per period, without deriving its numerical value from ISF + device noise (that requires [P2]'s /FOM formulas, canonical formulas 22–23, verified verbatim against [P2] Eq.(8)/(12) p.792-793, Eq.(16) p.794, Eq.(23) p.796).
- Pure RJ, independent increments: assumes period-to-period noise is uncorrelated (white at the period scale). Real (flicker) noise introduces correlated increments, causing long-term accumulation to deviate from pure (close-in , see lab_07).
- Only covers accumulated/long-term jitter: period jitter (single-period deviation) and cycle-to-cycle jitter (adjacent difference) are the first/second-order differences of phase and are outside the scope of this plot (spec Section 10.2).
- Gaussian, unbounded: RJ is described by with tails extending to infinity — this is exactly why SerDes BER is always (see lab_12). Deterministic jitter (DJ, bounded) is outside this model.
- Finite-sample error: the small difference between
sigma_measandsigma_theorycomes from finiten_trials; increasing it improves convergence.
Key takeaways
- Accumulated jitter is a random walk of per-edge Gaussian increments: mean 0, variance , Gaussian distribution.
- : a increase in gives only a increase in .
- Converting to time gives [P2] Eq.(8), , with .
- No restoring force on phase → jitter accumulates → poor free-running long-term stability → needs a PLL/CDR to lock it back.
Further reading
- Why phase has no restoring force: oscillator_phase
- Time-domain accumulation plot for the ring oscillator: lab_03_ring_oscillator_toy_model
- How a PLL/CDR stops the accumulation: lab_13_pll_cdr_transfer
- RJ → SerDes BER: lab_12_serdes_eye_ber
- Applied to design/theory: how accumulated jitter eats into the SerDes timing budget → serdes_clocking_connection