β: This English translation is in beta — the Traditional-Chinese original is the authoritative version.
The DSP View of Phase Noise
Prerequisites: stochastic_noise_basics · white_noise_to_phase_noise | Next: psd_phase_noise_jitter
The previous two pages computed phase noise from the circuit and from the frequency domain; this page puts on a different pair of glasses — re-examining the same thing from a signal-processing (DSP) viewpoint: treat the excess phase as the output of a linear system whose input is the noise current, passing through two blocks: (1) a time-varying gain (ISF weighting), and (2) an ideal integrator .
The payoff of this viewpoint is large: once you draw it as a block diagram, you immediately see that the dB/dec (1/f²) slope of phase noise is no coincidence at all — it is simply the frequency response of the integrator. At the same time, this is the bridge that translates the continuous-time integral of [P1] Eq.(11) into the "discrete-time simulation code" (lab_06).
Physical intuition (big picture first): an integrator turns "something white" into "something that grows toward low frequency". Feed white noise through an integrator and the output PSD carries a — that is 1/f² phase noise. The ISF merely "phase-weights and downconverts" the input before the integration. Phase noise = ISF-weighted white noise, shaped by the integrator.
1. Reading [P1] Eq.(11) as a signal-processing chain
The central equation of [P1] (spec §3, formula 4):
The DSP decomposition: first define the "ISF-weighted equivalent noise current"
so that — is the running integral of . As a block diagram:
- Block B (ISF weighting) is LTV (linear time-varying): the gain varies periodically in time (period ) — this is the mathematical embodiment of [P1]'s emphasis that "an oscillator is time-variant, not time-invariant, toward noise" (claim C1). Its role is frequency translation: it "downconverts" noise near to baseband ([P1] Eq.(13), Fig. 8).
- Block C (the integrator) is LTI (linear time-invariant): its frequency response is exactly .
2. Why the integrator 1/(jω) turns white noise into 1/f² (origin of the signature slope)
An ideal integrator divides by in the frequency domain:
The rule for PSDs through a linear system is . If the ISF-weighted equivalent input is approximately white in the offset band we care about (power ), then:
- dimension check: . is dimensionless, is C, is ; collecting terms gives (treating the rad² in as phase rad²), consistent with the units of ✓.
- This is the 1/f²: , i.e. dB/dec on a log-log plot. Expressed in dBc/Hz (), the skirt is still dB/dec.
- Comparison with [P1] Eq.(21) (including the famous factor-of-2): the clean time-domain derivation "white noise × ISF → integrate" gives , whereas [P1] Eq.(21) is written with . The factor of 2 comes purely from the SSB bookkeeping convention (), and does not affect the scaling or the dB/dec slope. Full discussion in white_noise_to_phase_noise.
- Extension to flicker: if the input is not white but 1/f ([P1] Eq.(22)), the same integrator produces at the output — the close-in 1/f³ phase noise ([P1] Eq.(23)). The DSP view unifies "1/f² and 1/f³" as "the same integrator acting on inputs of different colors".
This also explains "why phase accumulates but amplitude does not": the integrator has infinite DC gain ( when ), so phase is infinitely sensitive to very-low-frequency perturbations and random-walks away (no restoring force); the amplitude path instead has a decaying (restoring) pole — high-pass / finite gain — so perturbations get pulled back. Compare phase_vs_amplitude_noise (claim C2).
3. From continuous time to discrete simulation: turning the formula into code (lab_06)
To verify the theory on a computer, the continuous integral must be replaced by a discrete accumulation. With sampling frequency and interval , the discrete version of [P1] Eq.(11) is a cumulative sum:
- The role of : it calibrates the "discrete sum" back to the physical dimensions of an "integral". Dropping is the most common discretization mistake (the units end up off by a factor of ).
- PSD of discrete white noise: to generate a white sequence with single-sided PSD , the variance of each sample must be set to (the single-to-double-sided factor of 2 and the sampling bandwidth ). This constant must match the analytic expression, or the numerics will not lie on the theory line.
cumsum= the integrator:numpy.cumsumis the discrete integrator; its frequency response approaches at low frequency — exactly the source of our 1/f².
The corresponding core code (using the real functions of spec §5):
import numpy as np
from simulations.common.noise_utils import white_noise, estimate_psd
from simulations.common.isf_utils import apply_isf_weighting, gamma_lc_ideal
# 0) time axis
t = np.arange(N) / fs
# 1) generate the white noise-current sequence i_n[m], single-sided PSD = S_i
i_n = white_noise(n=N, psd=1e-24, fs=fs, rng=rng) # A, white
# 2a) ISF weighting (time-varying multiply only, with NO integration): y[m] = Gamma(w0 t)/qmax * i_n
y = apply_isf_weighting(t, i_n, gamma_func=gamma_lc_ideal, qmax=1e-12, omega0=2*np.pi*5e9)
# 2b) integrator: phi[k] = dt * cumsum(y) — cumsum×dt is the true discrete integral
dt = 1.0 / fs
phi = np.cumsum(y) * dt
# 3) Welch PSD estimate, verify S_phi ∝ 1/f^2
f, S_phi = estimate_psd(phi, fs=fs, nperseg=4096)
Full script: simulations/lab_06_white_noise_phase_noise.py (see
lab_06). This is a
pedagogical toy model (ideal-LC , a single white-noise source), not transistor-level.
4. Welch PSD estimation: how to "measure" S_φ(f)
You have simulated a time series ; how do you recover its PSD to compare against the theoretical 1/f²? A single FFT with the squared magnitude (the periodogram) has an estimator variance that does not decrease as the record gets longer — the estimate stays wildly noisy. Welch's method solves this:
- Split the long sequence into segments (each
npersegpoints long), optionally overlapping (typically 50%). - Multiply each segment by a window (a window function, e.g. Hann, to suppress spectral leakage).
- Take the periodogram of each segment, then average. Averaging segments lowers the estimator variance by about .
- trade-off: shorter segments → more segments to average, smoother, but worse frequency resolution () — the close-in 1/f² details get smeared out. Longer segments → better resolution but noisier. Seeing the close-in 1/f² requires long segments + long records.
- This site uses
estimate_psd(x, fs, nperseg)(spec §5,noise_utils) for this; the lab_06 figure overlays the Welch estimate (dots) on the analytic 1/f² line (solid), and the two agree.

The figure above (simulations/lab_06_white_noise_phase_noise.py, corresponding to spec §4
white_noise_phase_noise_psd.png) is the "seeing is believing" of this DSP chain: white-noise input → ISF weighting →
cumsum integrator → Welch estimate, giving an that is a clean dB/dec on log-log,
coinciding with the analytic of Section 2.
5. Sampling and aliasing: the easiest traps to step into from the DSP viewpoint
When moving a continuous system into a discrete simulation, aliasing (frequencies above Nyquist folding back to low frequency and masquerading as others) is the number-one pitfall, and ISF simulations require particular care:
- The Nyquist iron law: must be the highest signal frequency. The ISF weighting contains and its harmonics , so your must be not merely but ideally (covering the few ISF harmonics you care about); otherwise the downconversion of higher harmonics gets contaminated by aliasing, and the 1/f² line kicks up at high offsets.
- White noise is inherently aliased: ideal white noise has infinite bandwidth, and discrete sampling inevitably folds all frequencies into . That is fine — as long as