Skip to main content

β: 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 ϕ(t)\phi(t) as the output of a linear system whose input is the noise current, passing through two blocks: (1) a time-varying gain Γ(ω0t)/qmax\Gamma(\omega_0 t)/q_{max} (ISF weighting), and (2) an ideal integrator dt\int dt.

The payoff of this viewpoint is large: once you draw it as a block diagram, you immediately see that the 20-20 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 1/ω21/\omega^2 — 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):

ϕ(t)=1qmaxtΓ(ω0τ)in(τ)dτ.\phi(t)=\frac{1}{q_{max}}\int_{-\infty}^{t}\Gamma(\omega_0\tau)\,i_n(\tau)\,d\tau .

The DSP decomposition: first define the "ISF-weighted equivalent noise current"

y(τ)Γ(ω0τ)qmaxin(τ),y(\tau)\equiv\frac{\Gamma(\omega_0\tau)}{q_{max}}\,i_n(\tau),

so that ϕ(t)=ty(τ)dτ\phi(t)=\int_{-\infty}^{t}y(\tau)\,d\tauϕ\phi is the running integral of yy. As a block diagram:

  • Block B (ISF weighting) is LTV (linear time-varying): the gain varies periodically in time (period TT) — 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 nω0n\omega_0 to baseband ([P1] Eq.(13), Fig. 8).
  • Block C (the integrator) is LTI (linear time-invariant): its frequency response is exactly 1/(jω)1/(j\omega).

2. Why the integrator 1/(jω) turns white noise into 1/f² (origin of the signature slope)

An ideal integrator ϕ(t)=ydt\phi(t)=\int y\,dt divides by jωj\omega in the frequency domain:

Φ(jω)=1jωY(jω)Hint(jω)2=1ω2.\Phi(j\omega)=\frac{1}{j\omega}\,Y(j\omega)\quad\Longrightarrow\quad |H_{\text{int}}(j\omega)|^2=\frac{1}{\omega^2}.

The rule for PSDs through a linear system is Sout=H2SinS_{\text{out}}=|H|^2\,S_{\text{in}}. If the ISF-weighted equivalent input yy is approximately white in the offset band we care about (power Γrms2Si/qmax2\propto\Gamma_{rms}^2 S_i/q_{max}^2), then:

 Sϕ(Δω)=Hint2Sy=1Δω2Γrms2qmax2Si \boxed{\ S_\phi(\Delta\omega)=|H_{\text{int}}|^2\,S_y=\frac{1}{\Delta\omega^2}\cdot\frac{\Gamma_{rms}^2}{q_{max}^2}\,S_i\ }
  • dimension check: [1/(rad/s)2]×[(rad2)A2/Hz/C2][1/(\text{rad/s})^2]\times[(\text{rad}^2)\cdot\text{A}^2/\text{Hz}/\text{C}^2]. Γ\Gamma is dimensionless, qmaxq_{max} is C, SiS_i is A2/Hz=C2/(s2Hz)\text{A}^2/\text{Hz}=\text{C}^2/(\text{s}^2\cdot\text{Hz}); collecting terms gives rad2/Hz\text{rad}^2/\text{Hz} (treating the rad² in 1/(rad/s)21/(\text{rad/s})^2 as phase rad²), consistent with the units of SϕS_\phi ✓.
  • This is the 1/f²: Sϕ1/Δω2S_\phi\propto1/\Delta\omega^2, i.e. 20-20 dB/dec on a log-log plot. Expressed in dBc/Hz (L12Sϕ\mathcal{L}\approx\frac12 S_\phi), the skirt is still 20-20 dB/dec.
  • Comparison with [P1] Eq.(21) (including the famous factor-of-2): the clean time-domain derivation "white noise × ISF → integrate" gives L=Γrms2Si/(2qmax2Δω2)\mathcal{L}=\Gamma_{rms}^2 S_i/(2q_{max}^2\Delta\omega^2), whereas [P1] Eq.(21) is written with /(4Δω2)/(4\Delta\omega^2). The factor of 2 comes purely from the SSB bookkeeping convention (L12Sϕ\mathcal{L}\approx\frac12 S_\phi), and does not affect the Γrms2/qmax2\Gamma_{rms}^2/q_{max}^2 scaling or the 20-20 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 1/ω21/\omega^2 integrator produces 1/ω31/\omega^3 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 (1/ω1/\omega\to\infty when ω0\omega\to0), 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 fsf_s and interval Δts=1/fs\Delta t_s=1/f_s, the discrete version of [P1] Eq.(11) is a cumulative sum:

ϕ[k]=Δtsqmaxm=0kΓ(ω0mΔts)in[m].\phi[k]=\frac{\Delta t_s}{q_{max}}\sum_{m=0}^{k}\Gamma(\omega_0\,m\,\Delta t_s)\,i_n[m].
  • The role of Δts\Delta t_s: it calibrates the "discrete sum" back to the physical dimensions of an "integral". Dropping Δts\Delta t_s is the most common discretization mistake (the units end up off by a factor of fsf_s).
  • PSD of discrete white noise: to generate a white sequence with single-sided PSD SiS_i, the variance of each sample must be set to σ2=Sifs/2\sigma^2=S_i\cdot f_s/2 (the single-to-double-sided factor of 2 and the sampling bandwidth fs/2f_s/2). This constant must match the analytic expression, or the numerics will not lie on the theory line.
  • cumsum = the integrator: numpy.cumsum is the discrete integrator; its frequency response approaches 1/ω1/\omega 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 Γ=sinθ\Gamma=-\sin\theta, a single white-noise source), not transistor-level.

4. Welch PSD estimation: how to "measure" S_φ(f)

You have simulated a time series ϕ[k]\phi[k]; how do you recover its PSD Sϕ(f)S_\phi(f) 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:

  1. Split the long sequence into segments (each nperseg points long), optionally overlapping (typically 50%).
  2. Multiply each segment by a window (a window function, e.g. Hann, to suppress spectral leakage).
  3. Take the periodogram of each segment, then average. Averaging KK segments lowers the estimator variance by about 1/K1/K.
  • trade-off: shorter segments → more segments to average, smoother, but worse frequency resolution (Δffs/nperseg\Delta f\approx f_s/\text{nperseg}) — 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.

1/f² phase-noise PSD produced from white noise through the ISF + integrator (DSP verification)

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 SϕS_\phi that is a clean 20-20 dB/dec on log-log, coinciding with the analytic 1/Δω21/\Delta\omega^2 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: fsf_s must be 2×\ge2\times the highest signal frequency. The ISF weighting contains Γ(ω0t)\Gamma(\omega_0 t) and its harmonics nω0n\omega_0, so your fsf_s must be not merely >2f0>2f_0 but ideally f0\gg f_0 (covering the few ISF harmonics nω0n\omega_0 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 [0,fs/2][0,f_s/2]. That is fine — as long as fsf_s is high enough and we only interpret the offset band fs/2\ll f_s/2. When reporting a PSD, trust only the band far below Nyquist.
  • The integrator's DC singularity: 1/ω1/\omega diverges as ω0\omega\to0; a discrete cumsum manifests as a random walk (unbounded drift). In simulation, either look only at a finite offset band or detrend ϕ\phi; otherwise the lowest few PSD bins are dominated by drift — this is exactly the numerical version of "ϕ\phi is not stationary; do statistics on phase differences/frequency" mentioned in Section 5 of stochastic_noise_basics.

6. Continuous ↔ discrete correspondence table

Continuous time ([P1])Discrete simulation (lab_06)Caveats
t()dτ\int_{-\infty}^{t}(\cdot)\,d\taunumpy.cumsum(...) * dtdo not drop Δts=1/fs\Delta t_s=1/f_s
Γ(ω0τ)\Gamma(\omega_0\tau) time-varying gaingamma_func(omega0 * t) pointwise multiplyLTV: a different gain per sample
white PSD SiS_i (A2/Hz\text{A}^2/\text{Hz})sample variance σ2=Sifs/2\sigma^2=S_i f_s/2single↔double-sided factor of 2
1/(jω)1/(j\omega) integrator → 1/f²low-frequency response of cumsumDC singularity → drift; detrend
theoretical Sϕ(f)S_\phi(f) curveestimate_psd (Welch)segment length vs resolution trade-off
continuous frequency Δω\Delta\omegabin frequency f<fs/2f<f_s/2trust only bands far below Nyquist

Applicability and failure conditions

ConditionWhen it holdsWhen it fails
Linear superposition (small perturbations)Sout=H2SinS_{\text{out}}=\lvert H\rvert^2 S_{\text{in}} applieslarge injection is nonlinear, AM–PM; must remodel
fsf0f_s\gg f_0 and covers the harmonics of interestclean 1/f² linealiasing folds high harmonics back; high offsets kick up
Interpret only offsets fs/2\ll f_s/2PSD trustworthybins near Nyquist untrustworthy
Welch segment length matched to the band of interestclose-in 1/f² resolvedsegments too short smear low offsets; too long, too noisy
Detrend ϕ\phi / use phase differencesavoids the random-walk driftFFT of raw ϕ\phi: lowest bins dominated by drift

Corresponding papers / formulas

  • The phase integral (decomposed by DSP into "ISF weighting + integrator"): [P1] Eq.(11), p.182 (spec formula 4).
  • LTV / frequency translation (ISF harmonic downconversion): [P1] Eq.(13), Fig. 8, p.183 (claim C1).
  • The signature white noise → 1/f² result: [P1] Eq.(21), p.185; factor-of-2 note in spec §3.
  • flicker → 1/f³ (the same integrator acting on a 1/f input): [P1] Eqs.(22),(23), p.185.
  • Figure: white_noise_phase_noise_psd.png (lab_06), corresponding to spec §4.
  • The DSP tools (Welch / aliasing / windowing) are standard signal processing, not among the 5 source PDFs; supplied from standard references.

Key takeaways

  • The DSP model of phase noise: white noise \to ISF time-varying weighting (LTV, frequency translation) \to integrator 1/(jω)1/(j\omega) (LTI) ϕ\to\phi.
  • The integrator's H2=1/ω2|H|^2=1/\omega^2 is the source of the 1/f² (20-20 dB/dec) slope; a 1/f input → 1/f³.
  • Discretization: integral = cumsum × dt; white-noise variance =Sifs/2=S_i f_s/2; do not drop Δts\Delta t_s.
  • Welch PSD: segment + window + average to lower the estimator variance; trade segment length against resolution.
  • Aliasing: fsf0f_s\gg f_0 and cover the harmonics of interest; trust only offsets fs/2\ll f_s/2; detrend ϕ\phi to avoid drift domination.
  • Matches the analytic result (lab_06 figure); the factor of 2 is just SSB bookkeeping and changes neither the scaling nor the slope.

Further reading