Skip to main content

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

Lab 10 — how phase noise smears the carrier into an RF skirt

Breadcrumb: Simulation labs › Noise & jitter › This page (RF spectrum skirt). Upstream: white_noise_to_phase_noise; downstream: lab_08.

This lab connects the abstract phase-noise PSD Sϕ(f)S_\phi(f) to what you actually see on a spectrum analyzer: an ideal carrier is a single line in the spectrum; with phase noise, that line gets "smeared" into a continuous skirt (sidebands sloping down on both sides of the carrier). We synthesize v(t)=cos(ω0t+ϕ(t))v(t)=\cos(\omega_0 t+\phi(t)) directly in the time domain, take an FFT, and see it with our own eyes — this is exactly the picture in [P1] Fig. 8, and it's where the unit dBc/Hz (decibels relative to carrier per Hz) comes from.

Physical intuition (conclusion first): phase noise is not "an extra noise source sitting next to the carrier" — it is the carrier's own phase jittering. Stuff the jittering phase ϕ(t)\phi(t) into the cosine's phase argument (phase modulation, PM), and the carrier's energy "leaks" from that one clean spectral line into nearby offset frequencies. How far it leaks and how much depends on the spectral shape of ϕ(t)\phi(t): 1/f21/f^2 phase noise → a skirt that falls off at 20-20 dB/dec on either side of the carrier. Seeing the skirt means seeing Sϕ(f)S_\phi(f) "moved" next to the carrier.

1. Learning objectives

  • Start from the time-domain PM signal v(t)=cos(ω0t+ϕ(t))v(t)=\cos(\omega_0 t+\phi(t)) and use an FFT to see the sideband skirt caused by phase noise.
  • Compare an "ideal carrier (nearly a single spectral line)" against "with phase noise (continuous skirt)" to understand the physical meaning of dBc/Hz.
  • Map 1/f21/f^2 phase noise (integrated white noise) to a 20-20 dB/dec skirt slope on either side of the carrier.
  • Recognize this plot as the time-domain version of [P1] Fig. 8.

2. Mathematical model

Carrier + excess phase. An oscillator output corrupted by phase noise is written as (a special case of canonical formula 1, with A(t)A(t) treated as constant):

v(t)=cos ⁣(ω0t+ϕ(t)),ω0=2πf0.v(t)=\cos\!\big(\omega_0 t+\phi(t)\big),\qquad \omega_0=2\pi f_0 .

ϕ(t)\phi(t) is 1/f21/f^2 phase noise. White noise w(t)w(t) passed through a phase integrator (in the spirit of canonical formula 11: noise is first weighted by Γ/qmax\Gamma/q_{max}, then integrated by dt\int dt) produces a random-walk-like phase:

ϕ(t)=1fsktfswk        Sϕ(f)1f2.\phi(t)=\frac{1}{f_s}\sum_{k\le t f_s} w_k\;\;\Longrightarrow\;\; S_\phi(f)\propto\frac{1}{f^2}.
  • Why integrating white noise gives 1/f21/f^2: an integrator in the frequency domain is 1/(j2πf)1/(j2\pi f), so power transfers as 1/f21/f^2; white noise (SwS_w flat) passing through this yields Sϕ(f)Sw/f2S_\phi(f)\propto S_w/f^2. This is exactly the signature 1/f21/f^2 skirt of a free-running oscillator (the spectral shape of canonical formula 21).

RF spectrum = power spectrum of the PM signal. Window v(t)v(t) (Hanning), take the FFT, take the magnitude squared, and normalize to the carrier peak:

P(f)=F{v(t)wwin(t)}2maxf2,PdBc(Δf)=10log10P(f0+Δf).P(f)=\frac{\lvert\mathcal{F}\{v(t)\,w_{\text{win}}(t)\}\rvert^2}{\max_f\lvert\cdots\rvert^2},\qquad P_{\text{dBc}}(\Delta f)=10\log_{10}P(f_0+\Delta f).
  • Sideband mechanism under the small-angle approximation (spec Section 10.2, "L12SϕL\approx\tfrac12 S_\phi"): let ϕ(t)=ϕpsinωmt\phi(t)=\phi_p\sin\omega_m t; at small angle
cos(ω0t+ϕ)cosω0tϕp2[cos(ω0ωm)tcos(ω0+ωm)t].\cos(\omega_0 t+\phi)\approx\cos\omega_0 t-\frac{\phi_p}{2}\big[\cos(\omega_0-\omega_m)t-\cos(\omega_0+\omega_m)t\big].

Each sideband's power relative to the carrier is (ϕp/2)2(\phi_p/2)^2; summing over the continuous spectrum of ϕ(t)\phi(t) produces the skirt.

  • Dimension check: ϕ\phi and ϕp\phi_p are in rad (dimensionless), P/PmaxP/P_{\max} is dimensionless, and 10log1010\log_{10} of that gives dBc ✓. The offset Δf\Delta f and ff share units (this lab uses normalized units).

3. Block diagram

4. Core Python code

Verbatim excerpt from main() in simulations/lab_10_rf_spectrum.py: cumsum white noise into 1/f21/f^2 phase phi (scaled to ~0.03 rad rms to stay small-angle), then synthesize the clean carrier and the noisy carrier, and finally apply a Hanning window, take the rFFT, normalize to the peak, and convert to dB.

fs = 8192.0
n = 2 ** 18
t = np.arange(n) / fs
f0 = 512.0 # carrier (normalized units), 16 samples/cycle

# 1/f^2 phase noise: integrate white noise, scale to a visible (small) rms
white = RNG.standard_normal(n)
phi = np.cumsum(white) / fs
phi -= phi.mean()
phi *= 0.03 / np.std(phi) # ~0.03 rad rms -> small-angle regime

v_clean = np.cos(2 * np.pi * f0 * t)
v_noisy = np.cos(2 * np.pi * f0 * t + phi)

win = np.hanning(n)
def spec(x):
X = np.fft.rfft(x * win)
P = np.abs(X) ** 2
return P / P.max()
f = np.fft.rfftfreq(n, 1 / fs)
Pc = spec(v_clean)
Pn = spec(v_noisy)

off = f - f0 # offset from carrier
  • phi = np.cumsum(white) / fs is the discrete integrator (the source of 1/f21/f^2).
  • phi *= 0.03 / np.std(phi) compresses the rms to ~0.03 rad, keeping it in the small-angle regime (so the skirt stays proportional to SϕS_\phi without spawning strong higher-order harmonic sidebands).
  • P / P.max() normalizes power to the carrier peak, so the y-axis is naturally dBc.

5. Full script path

simulations/lab_10_rf_spectrum.py (dependency: savefig from simulations/common/plot_utils.py. Everything else is numpy/matplotlib.)

Run with: python scripts/run_all_sims.py.

6. Parameter table

ParameterVariableValueNotes
Sample ratefs81928192 (normalized)samples per second (dimensionless unit)
Number of samplesn218=2621442^{18}=262144FFT length, sets frequency resolution
Carrier frequencyf0512512 (normalized)16 samples per cycle
Phase rms0.03\approx0.03 radrms of ϕ\phi after scaling (small angle)
Phase shape1/f21/f^2 (cumsum of white noise)signature free-running skirt
Window functionwinHanningreduces FFT sidelobe leakage
Displayed offsetoff120001\sim2000 (normalized)skirt range to the right of the carrier
Random seedRNGdefault_rng(10)reproducible results

Note: this lab deliberately uses normalized units (fs, f0 have no physical dimension); the focus is on shape (skirt slope and the single-line-vs-continuous-spectrum contrast), not absolute Hz.

7. Units table

QuantitySymbolUnitValue in this lab
Timett(normalized) s0n/fs0\sim n/f_s
Carrier frequencyf0f_0(normalized) Hz512512
Excess phaseϕ(t)\phi(t)radrms 0.03\approx0.03
Offset frequencyΔf\Delta f(normalized) Hz120001\sim2000
Relative powerP/PmaxP/P_{\max}dBc900-90\sim0
Phase PSDSϕ(f)S_\phi(f)rad²/Hz1/f2\propto1/f^2

8. Simulation plot

Phase noise smears the carrier into a skirt: the blue line is the ideal carrier (nearly a single spectral line), the red line is the continuous sideband skirt with 1/f² phase noise, x-axis is offset from carrier, y-axis is dBc

9. How to read the plot

  • Blue line (ideal carrier): energy is almost entirely concentrated at the carrier itself and drops off sharply as offset increases — the spectrum looks "almost like a single line". The small residual skirt comes from finite FFT length and window leakage, not physical phase noise.
  • Red line (with phase noise): a continuous skirt appears on both sides of the carrier, sloping down with increasing offset. On a log-offset axis it is nearly a straight-line falloff, matching 20-20 dB/dec for 1/f21/f^2: this is the time-domain origin of the dBc/Hz curve.
  • The single-line-vs-skirt contrast is the core message of this plot: the phase jitters → carrier energy leaks out → a spectral line becomes a skirt. "Lower and steeper skirt" means smaller phase noise.
  • How to use it: the skirt height you measure on a spectrum analyzer (relative to the carrier, per Hz) is L(Δf)\mathcal{L}(\Delta f) (dBc/Hz). Integrate it (see lab_08) to get rms jitter. This lab lets you "see" how that curve grows out of time-domain PM.

10. Corresponding paper equations/figures

  • Core correspondence: [P1] A. Hajimiri and T. H. Lee, "A General Theory of Phase Noise in Electrical Oscillators," IEEE JSSC, 33(2), 1998, Fig. 8 — shows phase noise smearing the carrier into a sideband skirt. This lab is its time-domain synthesis version. [P1] Fig. 8 is on p.183 (checked against the original PDF).
  • Carrier decomposition: canonical formula 1, Vout(t)=A(t)f(ω0t+ϕ(t))V_{out}(t)=A(t)f(\omega_0 t+\phi(t)) (here AA is taken constant, f=cosf=\cos).
  • Sideband mechanism (small-angle PM → L12Sϕ\mathcal{L}\approx\tfrac12 S_\phi): spec Section 10.2, "L12SϕL\approx\tfrac12 S_\phi (small-angle PM)".
  • Origin of the 1/f21/f^2 skirt: phase integration of white noise, consistent with the spectral shape of canonical formula 21 ([P1] Eq.(21), p.185).
  • Corresponds to site figure rf_spectrum_phase_noise_sidebands.png; further reading: white_noise_to_phase_noise, psd_phase_noise_jitter.

11. Limitations and approximations

  • This is a pedagogical toy model, not transistor-level: we directly "inject" a 1/f21/f^2 phase noise without actually simulating the full pipeline of transistor noise weighted by the ISF; the goal is to see "what the skirt looks like".
  • Small-angle assumption: ϕ\phi rms 0.03\approx0.03 rad 1\ll1, so the skirt is proportional to SϕS_\phi with no strong higher-order sidebands. At large phase excursions, PM produces carrier compression and higher-order sidebands, which this plot does not cover.
  • Normalized units: fs and f0 have no physical dimension, and the x-axis offset is also normalized; the focus is on shape and contrast, not absolute Hz. Matching a real 5 GHz, dBc/Hz result requires setting a real sample rate and an absolute SϕS_\phi level.
  • FFT artifacts: the blue line's residual skirt and the red line's far floor partly come from finite-length FFT and Hanning window leakage, not entirely physical phase noise. Increasing n or using a sharper window reduces this.
  • Single random realization: the plot comes from one ϕ(t)\phi(t) trace with a fixed seed; a rigorous L(f)\mathcal{L}(f) requires ensemble averaging (Welch) over many realizations, see lab_06.

Key takeaways

  • Phase noise is not an extra source sitting beside the carrier — it is the carrier's own phase jittering → energy leaks from a single line into a sideband skirt.
  • Taking the FFT of the time-domain v(t)=cos(ω0t+ϕ(t))v(t)=\cos(\omega_0 t+\phi(t)) lets you "see" the skirt of [P1] Fig. 8.
  • 1/f21/f^2 phase noise (integrated white noise) → a 20-20 dB/dec skirt on both sides of the carrier; skirt height is dBc/Hz.
  • Under small-angle PM each sideband's relative power is (ϕp/2)2(\phi_p/2)^2, summing into a continuous spectrum (L12Sϕ\mathcal{L}\approx\tfrac12 S_\phi).

Further reading