Skip to main content

Fourier Series of the ISF

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

Prerequisites: isf_definition (Γ\Gamma is dimensionless and 2π2\pi-periodic), impulse_to_phase_shift (the operational definition of Γ\Gamma), convolution_derivation (the phase integral for continuous noise).

Hands-on verification: the Fourier-coefficient extraction, reconstruction, and Parseval numerical checks for this page are in lab_05.

The previous chapter impulse_to_phase_shift derived the operational definition of the ISF, Δϕ=Γ(ω0τ)Δq/qmax\Delta\phi=\Gamma(\omega_0\tau)\,\Delta q/q_{max}, and pointed out that Γ\Gamma is a dimensionless, 2π2\pi-periodic function. This page answers the next key question:

Given that Γ\Gamma is periodic, once it is expanded as a Fourier series, what physics does each term represent? The answer is the most elegant piece of ISF theory — it spells out exactly which band of device noise the oscillator moves to the vicinity of the carrier. The core result ([P1] Eq.(12), p.183):

Γ(ω0τ)=c02+n=1cncos(nω0τ+θn)\Gamma(\omega_0\tau)=\frac{c_0}{2}+\sum_{n=1}^{\infty}c_n\cos(n\omega_0\tau+\theta_n)

Physical intuition (conclusion first): an oscillator is a time-varying mixer. Its phase sensitivity to noise, Γ\Gamma, varies periodically with the waveform phase — equivalent to multiplying the noise by a "periodic weight" with fundamental ω0\omega_0. Multiplying noise by a periodic function is, mathematically, shifting the noise spectrum to 0, ω0, 2ω0,0,\ \omega_0,\ 2\omega_0,\dots and summing. So device noise near each nω0n\omega_0 is weighted by the nn-th Fourier coefficient cnc_n and then down-converted to the carrier vicinity as phase noise. The c0c_0 (DC) term is especially important: it moves the 1/f flicker noise near DC straight up, producing the close-in 1/f31/f^3 phase noise.

Step 1: why Γ\Gamma can be expanded as a Fourier series

Γ(ω0τ)\Gamma(\omega_0\tau) describes "how far the phase is pushed by a kick at a given point of the waveform". The oscillator sits in periodic steady state (the output waveform repeats every T=1/f0T=1/f_0), so "kicking at phase xx" and "kicking at phase x+2πx+2\pi" have exactly the same effect. In other words Γ\Gamma is 2π2\pi-periodic in its argument xω0τx\equiv\omega_0\tau:

Γ(x+2π)=Γ(x).\Gamma(x+2\pi)=\Gamma(x).
  • Math used: any 2π2\pi-periodic function that is square-integrable over one period (02πΓ2dx<\int_0^{2\pi}|\Gamma|^2dx<\infty) admits a Fourier series (Dirichlet conditions). Real ISFs are continuous and piecewise smooth, so the conditions are easily satisfied.
  • Physical basis: the periodicity comes from the oscillator's limit cycle — in steady state the state point goes around the cycle once per period, and the sensitivity depends only on the "position on the cycle (phase)", not on "which lap".
  • Unit check: x=ω0τx=\omega_0\tau is [rad/s][s]=[rad][\text{rad/s}]\cdot[\text{s}]=[\text{rad}] ✓, dimensionless; Γ\Gamma itself is dimensionless, and so are c0,cnc_0,c_n (see notation).

Step 2: write the standard Fourier expansion (cos/sin form)

First write the familiar real cos/sin Fourier series, then merge it into the amplitude–phase form of [P1]. For a 2π2\pi-periodic function:

Γ(x)=a02+n=1[ancos(nx)+bnsin(nx)],\Gamma(x)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\big[a_n\cos(nx)+b_n\sin(nx)\big],

with the coefficients obtained by inner products (projections) over one period:

a0=1π02πΓ(x)dx,an=1π02πΓ(x)cos(nx)dx,bn=1π02πΓ(x)sin(nx)dx.a_0=\frac{1}{\pi}\int_0^{2\pi}\Gamma(x)\,dx,\qquad a_n=\frac{1}{\pi}\int_0^{2\pi}\Gamma(x)\cos(nx)\,dx,\qquad b_n=\frac{1}{\pi}\int_0^{2\pi}\Gamma(x)\sin(nx)\,dx.
  • Math used: {cos(nx),sin(nx)}\{\cos(nx),\sin(nx)\} are orthogonal on [0,2π][0,2\pi], 02πcos(mx)cos(nx)dx=πδmn\int_0^{2\pi}\cos(mx)\cos(nx)\,dx=\pi\,\delta_{mn} (m,n1m,n\ge1); this orthogonality "sifts" out the corresponding component.
  • Watch the 1/π1/\pi and the DC factor: a0=1π02πΓdxa_0=\frac{1}{\pi}\int_0^{2\pi}\Gamma\,dx, while the mean (DC value) of Γ\Gamma is 12π02πΓdx=a02\frac{1}{2\pi}\int_0^{2\pi}\Gamma\,dx=\frac{a_0}{2}. So the first term of the series must be written a02\frac{a_0}{2} to equal the true mean. This 1/21/2 is not arbitrary; the definition of c0c_0 below inherits it.

Step 3: merge into amplitude–phase form to get cn,θnc_n,\theta_n

Combine the same-frequency pair ancos(nx)+bnsin(nx)a_n\cos(nx)+b_n\sin(nx) into a single cosine via the trig identity:

ancos(nx)+bnsin(nx)=cncos(nx+θn),a_n\cos(nx)+b_n\sin(nx)=c_n\cos(nx+\theta_n),

where

cn=an2+bn2,θn=atan2(bn,an).c_n=\sqrt{a_n^2+b_n^2},\qquad \theta_n=\operatorname{atan2}(-b_n,\,a_n).
  • Math used: cncos(nx+θn)=cncosθncos(nx)cnsinθnsin(nx)c_n\cos(nx+\theta_n)=c_n\cos\theta_n\cos(nx)-c_n\sin\theta_n\sin(nx); matching coefficients gives an=cncosθna_n=c_n\cos\theta_n, bn=cnsinθnb_n=-c_n\sin\theta_n; inverting yields the expressions above.
  • DC correspondence: set c0a0c_0\equiv a_0 (the DC coefficient), so the constant term a02=c02\frac{a_0}{2}=\frac{c_0}{2}. Substituting gives [P1] Eq.(12):
 Γ(ω0τ)=c02+n=1cncos(nω0τ+θn) [P1] Eq.(12), p.183\boxed{\ \Gamma(\omega_0\tau)=\frac{c_0}{2}+\sum_{n=1}^{\infty}c_n\cos(n\omega_0\tau+\theta_n)\ }\qquad[\text{P1] Eq.(12), p.183}
  • Notation trap (important): c0c_0 is the Fourier coefficient, while the DC value of the ISF is c0/2c_0/2. This factor is the easiest place to slip when computing the 1/f31/f^3 corner (Eq.(24)); later chapters will keep reminding you. The a0 returned by this site's Python compute_fourier_coefficients equals this c0c_0 (see Step 8).

Step 4: the physics of c0c_0 — DC, controls 1/f1/f upconversion

Substitute the Fourier expansion of the ISF back into the LTV phase response ([P1] Eq.(11)→Eq.(13), p.183):

ϕ(t)=1qmax ⁣[c02 ⁣t ⁣indτ+n=1cn ⁣t ⁣incos(nω0τ+θn)dτ][P1] Eq.(13), p.183\phi(t)=\frac{1}{q_{max}}\!\left[\frac{c_0}{2}\!\int_{-\infty}^{t}\!i_n\,d\tau+\sum_{n=1}^{\infty}c_n\!\int_{-\infty}^{t}\!i_n\cos(n\omega_0\tau+\theta_n)\,d\tau\right]\qquad[\text{P1] Eq.(13), p.183}

The first term (the c0c_0 term) integrates the noise current directly, without any cos(nω0τ)\cos(n\omega_0\tau) modulation. Meaning:

  • The c0c_0 term responds to the DC / very-low-frequency components of the noise current — push the node slowly and the phase drifts slowly.
  • Inject a small tone near DC, i(t)=I0cos(Δωt)i(t)=I_0\cos(\Delta\omega t) (Δωω0\Delta\omega\ll\omega_0): only the c0c_0 term responds (the other harmonics are averaged out by cos(nω0τ)\cos(n\omega_0\tau)), giving ([P1] Eq.(15), p.183):
ϕ(t)I0c0sin(Δωt)2qmaxΔω.\phi(t)\approx\frac{I_0\,c_0\sin(\Delta\omega t)}{2q_{max}\,\Delta\omega}.
  • Why this is called "1/f1/f upconversion": device flicker / 1/f1/f noise is concentrated at low frequency (near DC). The c0c_0 term moves (up-converts) this "noise living at baseband" next to the carrier, turning it into close-in phase noise. Later, flicker_noise_upconversion uses this to derive the 1/f31/f^3 skirt ([P1] Eq.(23),(24)).
  • Design implication: the smaller c0c_0, the weaker the flicker upconversion. With c0=0c_0=0 (a perfectly symmetric waveform), close-in theoretically has no 1/f31/f^3 contribution. This is the mathematical root of the "waveform symmetry → close-in phase noise" design rule (experimentally supported by [P2] Fig. 17, p.802).

Step 5: the physics of cnc_n — frequency-translating noise near nω0n\omega_0 to the carrier

Look at the nn-th component of the second term of Eq.(13): it multiplies the noise current by cos(nω0τ+θn)\cos(n\omega_0\tau+\theta_n) and then integrates. Multiplying by cos(nω0τ)\cos(n\omega_0\tau) is, in the frequency domain, shifting the noise spectrum by ±nω0\pm n\omega_0 (modulation theorem). So:

  • Device noise near nω0+Δωn\omega_0+\Delta\omega (and nω0Δωn\omega_0-\Delta\omega) is weighted by cnc_n and down-converted to Δω\Delta\omega, becoming the phase noise at offset Δω\Delta\omega from the carrier.
  • Inject a small tone near nω0n\omega_0, i(t)=I0cos((nω0+Δω)t)i(t)=I_0\cos((n\omega_0+\Delta\omega)t), into Eq.(13): only the nn-th harmonic responds, giving ([P1] Eq.(16)/(17), p.183):
ϕ(t)I0cnsin(Δωt)2qmaxΔω.\phi(t)\approx\frac{I_0\,c_n\sin(\Delta\omega t)}{2q_{max}\,\Delta\omega}.

Explicit algebra: using cosAcosB\cos A\cos B to move noise near nω0n\omega_0 to the carrier

The line above is the "result"; now we work the frequency-translation algebra out in full, not just the intuition. Take the nn-th component of the second term of Eq.(13) and substitute the single tone in(τ)=I0cos((nω0+Δω)τ)i_n(\tau)=I_0\cos((n\omega_0+\Delta\omega)\tau):

ϕn(t)=cnqmaxtcos(nω0τ+θn)I0cos((nω0+Δω)τ)dτ.\phi_n(t)=\frac{c_n}{q_{max}}\int_{-\infty}^{t}\cos(n\omega_0\tau+\theta_n)\,I_0\cos\big((n\omega_0+\Delta\omega)\tau\big)\,d\tau .

Step (i): product-to-sum. The product of the two cosines uses the identity

cosAcosB=12[cos(AB)+cos(A+B)],\cos A\cos B=\tfrac12\big[\cos(A-B)+\cos(A+B)\big],

with A=nω0τ+θnA=n\omega_0\tau+\theta_n, B=(nω0+Δω)τB=(n\omega_0+\Delta\omega)\tau; compute the difference and sum frequencies:

AB=θnΔωτ(frequencyΔω),A+B=(2nω0+Δω)τ+θn(frequency2nω0).A-B=\theta_n-\Delta\omega\tau\quad(\text{frequency}\approx\Delta\omega),\qquad A+B=(2n\omega_0+\Delta\omega)\tau+\theta_n\quad(\text{frequency}\approx 2n\omega_0).

The integrand becomes two terms:

cos(nω0τ+θn)cos((nω0+Δω)τ)=12[cos(Δωτθn)+cos((2nω0+Δω)τ+θn)].\cos(n\omega_0\tau+\theta_n)\cos\big((n\omega_0+\Delta\omega)\tau\big)=\tfrac12\Big[\cos(\Delta\omega\tau-\theta_n)+\cos\big((2n\omega_0+\Delta\omega)\tau+\theta_n\big)\Big].

This line is the core of "frequency translation": noise that originally lived at nω0+Δωn\omega_0+\Delta\omega, once multiplied by cos(nω0τ)\cos(n\omega_0\tau), has its difference frequency collapse down to Δω\Delta\omega at baseband (moved down), while its sum frequency is pushed to 2nω02n\omega_0 (higher, useless).

Step (ii): the integrator amplifies only the slow term and averages out the fast one. tdτ\int^t d\tau is a low-pass:

tcos(Δωτθn)dτ=sin(Δωtθn)Δω (slow; small denominatoramplified, survives),\int^{t}\cos(\Delta\omega\tau-\theta_n)\,d\tau=\frac{\sin(\Delta\omega t-\theta_n)}{\Delta\omega}\ (\text{slow; small denominator}\Rightarrow\text{amplified, survives}), tcos((2nω0+Δω)τ+θn)dτ=sin()2nω0+Δω (fast; denominator2nω0suppressed to negligible).\int^{t}\cos\big((2n\omega_0+\Delta\omega)\tau+\theta_n\big)\,d\tau=\frac{\sin(\cdots)}{2n\omega_0+\Delta\omega}\ (\text{fast; denominator}\approx2n\omega_0\Rightarrow\text{suppressed to negligible}).

Step (iii): keep only the slow term.

ϕn(t)cnqmaxI02sin(Δωtθn)Δω=I0cnsin(Δωtθn)2qmaxΔω,\phi_n(t)\approx\frac{c_n}{q_{max}}\cdot\frac{I_0}{2}\cdot\frac{\sin(\Delta\omega t-\theta_n)}{\Delta\omega}=\frac{I_0\,c_n\sin(\Delta\omega t-\theta_n)}{2q_{max}\,\Delta\omega},

Absorbing the fixed phase θn\theta_n into the origin recovers Eq.(16/17). Conclusion: the nn-th Fourier coefficient cnc_n really does take the noise near nω0n\omega_0, "multiply it by 12cn\tfrac12 c_n and collapse it to Δω\Delta\omega" — this is the algebraic proof of frequency translation, matching the mixer picture below. (The same downconversion integral is used again in white_noise_to_phase_noise to accumulate the 1/f21/f^2 summation.)

  • This is exactly the picture of [P1] Fig. 8 (p.183): noise is spread across the bands at 0,ω0,2ω0,0,\omega_0,2\omega_0,\dots; the ISF's c0,c1,c2,c_0,c_1,c_2,\dots act like a bank of mixer gains, each folding its band's noise back to the carrier vicinity, all superposing into the final phase-noise sideband.
  • Unit/dimension check: in Eq.(15)/(16) the dimensions of I0cn2qmaxΔω\dfrac{I_0\,c_n}{2q_{max}\,\Delta\omega} are [A](dimensionless)[C][rad/s]=[A][C/s][rad]=[A][A]1[rad]1\dfrac{[\text{A}]\cdot(\text{dimensionless})}{[\text{C}]\cdot[\text{rad/s}]} =\dfrac{[\text{A}]}{[\text{C/s}]\cdot[\text{rad}]}=\dfrac{[\text{A}]}{[\text{A}]}\cdot\dfrac{1}{[\text{rad}]^{-1}} — after simplification ϕ\phi is rad (dimensionless), and sin(Δωt)\sin(\Delta\omega t) is dimensionless ✓. (Remember C=AsC=\text{A}\cdot\text{s}.)

Step 6: why close-in (1/f31/f^3) is dominated by c0c_0 and the low-order coefficients

Put the two steps above together into one "frequency map":

Where the device noise livesVia which coefficientWhat it becomes next to the carrier
1/f1/f flicker near DCc0/2c_0/2close-in, slope 1/f31/f^3 (very steep)
White noise near ω0\omega_0c1c_11/f21/f^2 skirt (20-20 dB/dec)
White noise at 2ω0,3ω0,2\omega_0,3\omega_0,\dotsc2,c3,c_2,c_3,\dotsalso folds back, merged into 1/f21/f^2 (counted via cn2\sum c_n^2)
  • Why flicker becomes 1/f31/f^3 through c0c_0: flicker is already 1/f1/f (power spectrum 1/Δω\propto1/\Delta\omega). The c0c_0 term moves it intact next to the carrier; the phase integrator (the dτ\int d\tau in Eq.(13)) then adds another 1/Δω21/\Delta\omega^2 (integration divides by (jΔω)(j\Delta\omega) in frequency, i.e. by Δω2\Delta\omega^2 in power), 1Δω×1Δω2=1Δω3\dfrac{1}{\Delta\omega}\times\dfrac{1}{\Delta\omega^2}=\dfrac{1}{\Delta\omega^3}1/f31/f^3.
  • Why the higher-order cnc_n mainly feed 1/f21/f^2: white noise is flat — flat wherever it is moved — and the integrator only adds 1/Δω21/\Delta\omega^21/f21/f^2. All harmonic contributions are summarized by a single number, n=0cn2\sum_{n=0}^\infty c_n^2, which is exactly the Parseval relation and Γrms\Gamma_{rms} of the next page rms_isf.
  • The full 1/f31/f^3 / 1/f21/f^2 derivations are in flicker_noise_upconversion and white_noise_to_phase_noise respectively.

Step 7: how waveform symmetry nulls certain coefficients

The parity of the Fourier coefficients follows directly from the symmetry of Γ(x)\Gamma(x), giving the designer a knob to "switch off certain upconversions via the waveform shape":

Symmetry of Γ\GammaMathematical resultPhysical consequence
Even function Γ(x)=Γ(x)\Gamma(-x)=\Gamma(x)all bn=0b_n=0 (pure cos)θn{0,π}\theta_n\in\{0,\pi\}, simple phases
Odd function Γ(x)=Γ(x)\Gamma(-x)=-\Gamma(x)all an=0a_n=0 and a0=0a_0=0c0=0c_0=0no 1/f1/f upconversion (the ideal-LC sin-\sin is of this type)
Half-wave symmetry Γ(x+π)=Γ(x)\Gamma(x+\pi)=-\Gamma(x)even harmonics c2=c4==0c_2=c_4=\dots=0noise near 2ω02\omega_0 does not fold back
DC offset cosθ+α\cos\theta+\alpha (toy gamma_asymmetric)c0=2α0c_0=2\alpha\neq01/f31/f^3 appears (close-in degrades)
  • Example (ideal LC): ΓLC(θ)=sinθ\Gamma_{LC}(\theta)=-\sin\theta is odd ⟹ c0=0c_0=0. So the ideal LC has, to first order, no flicker upconversion; it is real-world asymmetry (hard switching, bias asymmetry) that props c0c_0 up.
  • Example (half-wave symmetry): differential / push-pull structures make the rising and falling edges mirror images ⟹ Γ(x+π)=Γ(x)\Gamma(x+\pi)=-\Gamma(x) ⟹ the even harmonics are suppressed, and noise at 2ω02\omega_0 (often supply ripple and second-harmonic distortion) does not fold back to the carrier.
  • Note (mechanism of the toy model): the gamma_asymmetric in the table props c0c_0 up in the simplest possible way — adding a DC offset to the whole ISF (cosθ+α\cos\theta+\alpha); in real circuits, asymmetric rise/fall transition slopes are a different — and more common — mechanism that likewise makes c00c_0\neq0 and turns on 1/f1/f upconversion, but with a different waveform shape. The toy on this page exists only to isolate the "c0c_0 knob".
  • This is exactly the message of the figure below: symmetric waveform c0=0c_0=0, asymmetric waveform c00c_0\neq0.

Step 8: computing the coefficients by numerical integration (real function)

Beyond the theory, here is code that runs. This site's compute_fourier_coefficients (read from simulations/common/isf_utils.py) simply carries out the Step-2 integrals with the trapezoidal rule:

import numpy as np
from simulations.common.isf_utils import (
gamma_lc_ideal, gamma_asymmetric,
compute_fourier_coefficients, reconstruct_from_fourier, gamma_rms,
)

# theta must span exactly one period [0, 2*pi] (endpoint included) for the trapezoidal rule to give the correct (1/pi)*∫ value
theta = np.linspace(0.0, 2 * np.pi, 4096, endpoint=True)

# Ideal LC ISF: Gamma(theta) = -sin(theta) (odd function)
gamma = gamma_lc_ideal(theta)

# a0 is c0 in Hajimiri's notation; a,b are the cos/sin coefficients; c_n = sqrt(a_n^2+b_n^2)
a0, a, b, c, phase = compute_fourier_coefficients(theta, gamma, n_harmonics=8)

print("c0 =", a0) # -> ~0.0 (odd function: no DC, no 1/f upconversion)
print("c1 =", c[1]) # -> ~1.0 (fundamental component only)
print("c2..c8 =", c[2:]) # -> ~0 (pure single tone)

# Reconstruct the waveform to verify the Eq.(12) reconstruction
gamma_hat = reconstruct_from_fourier(theta, a0, a, b)
print("max reconstruction error =", np.max(np.abs(gamma_hat - gamma))) # -> ~1e-15
  • Why the trapezoidal rule suffices: the integrand is a smooth periodic function, and the trapezoidal rule converges exponentially for periodic functions (the endpoint errors cancel); a few thousand points reach machine precision.
  • The endpoints must include 2π2\pi: the function docstring states explicitly that theta must span [0, 2*pi] (endpoint included), otherwise 1π\frac{1}{\pi}\int misses one cell. This is the most common source of numerical off-by-one errors.
  • Asymmetric toy-model comparison: plug in gamma = gamma_asymmetric(theta, alpha=0.3) (i.e. cosθ+0.3\cos\theta+0.3) and you get c02α=0.6c_0\approx2\alpha=0.6, c11c_1\approx1, and the rest 0\approx0 — confirming that α\alpha is exactly the knob that "props up the DC and turns on 1/f1/f upconversion" (this is a pedagogical toy model, not transistor-level).

Figure 1: more harmonics, closer reconstruction of the original ISF

The figure below (fig_reconstruction from lab_05) takes a multi-harmonic toy ISF (Γ(θ)=sinθ+0.35sin2θ+0.18cos3θ+0.25\Gamma(\theta)=-\sin\theta+0.35\sin2\theta+0.18\cos3\theta+0.25) and reconstructs it with N=1,2,4N=1,2,4 terms, showing how the partial sums of Eq.(12) converge step by step to the original waveform.

Fourier reconstruction of the ISF: more harmonics, closer fit

  • Corresponding formula: [P1] Eq.(12) (partial sum ΓN=c02+n=1Ncncos(nω0τ+θn)\Gamma_N=\frac{c_0}{2}+\sum_{n=1}^{N}c_n\cos(n\omega_0\tau+\theta_n)).
  • How to read it: N=1N=1 captures only the fundamental and has the largest error; by N=4N=4 the curves almost coincide. In practice the ISF's energy concentrates in the low-order harmonics, so a handful of terms is enough to compute phase noise accurately.
  • Toy-model note: this ISF is a synthetic teaching waveform, not a transistor-level extraction.
  • Full script: simulations/lab_05_fourier_isf.py.

Figure 2: the coefficient spectrum cnc_n (with Parseval verification)

The figure below (fig_coefficients from lab_05, n_harmonics=8) plots cnc_n as a bar chart (the coefficient spectrum) and marks the Parseval check n=0cn2=2Γrms2\sum_{n=0}^{\infty}c_n^2=2\Gamma_{rms}^2 ([P1] Eq.(20), derived in detail on the next page).

ISF Fourier coefficient spectrum with Parseval verification

  • Corresponding formulas: the cnc_n of [P1] Eq.(12); the cn2=2Γrms2\sum c_n^2=2\Gamma_{rms}^2 of [P1] Eq.(20).
  • How to read it: each bar's height is that harmonic's "weight" in the phase noise. The c0c_0 bar is critical — as soon as it is nonzero, close-in 1/f31/f^3 appears. The low-order bars dominate; the high orders decay quickly.
  • The detailed Parseval derivation and Γrms\Gamma_{rms} are in rms_isf.

Figure 3: c0c_0 for symmetric vs. asymmetric waveforms

The figure below (fig_symmetric_vs_asymmetric from lab_05) contrasts two toy ISFs: the symmetric Γ=cosθ\Gamma=\cos\theta (c0=0c_0=0) and the asymmetric Γ=cosθ+0.4\Gamma=\cos\theta+0.4 (c0=0.8c_0=0.8), highlighting that only c00c_0\neq0 upconverts 1/f1/f noise.

c0 comparison of symmetric and asymmetric ISFs

  • Corresponding formulas: c0c_0 ([P1] Eq.(12)); its consequence, the 1/f31/f^3 corner of [P1] Eq.(24).
  • How to read it: on the left, the symmetric waveform has zero mean and the DC bar disappears → no 1/f31/f^3; on the right, the whole curve is lifted and the DC bar pops out → close-in noise degrades. In design terms, "making the waveform symmetric" means "flattening this DC bar".
  • Toy-model note: gamma_symmetric/gamma_asymmetric are pedagogical toy ISFs, not transistor-level (see the isf_utils.py docstring).
  • Design-side extension: symmetry.

Numerical example (building a feel for the numbers)

Take the ideal-LC Γ(θ)=sinθ\Gamma(\theta)=-\sin\theta and hand-compute the first few coefficients.

View sinx-\sin x as a Fourier expansion of itself: sinx=c1cos(x+θ1)-\sin x=c_1\cos(x+\theta_1), where cos(x+θ1)=cosxcosθ1sinxsinθ1\cos(x+\theta_1)=\cos x\cos\theta_1-\sin x\sin\theta_1; for this to equal sinx-\sin x requires θ1=π/2\theta_1=\pi/2 (then cos(x+π/2)=sinx\cos(x+\pi/2)=-\sin x), hence c1=1c_1=1, θ1=π/2\theta_1=\pi/2.

  • c0=1π02π(sinx)dx=0c_0=\dfrac{1}{\pi}\displaystyle\int_0^{2\pi}(-\sin x)\,dx=0 (odd function, zero DC).
  • c1=1c_1=1, cn=0c_n=0 (n2n\ge2).
  • Feel: the ideal-LC ISF is a "clean single fundamental" — all the energy sits in c1c_1. So it folds noise back mainly from near ω0\omega_0 (1/f21/f^2), and since c0=0c_0=0 there is, ideally, no 1/f31/f^3. The next page shows cn2=c12=1=2Γrms2\sum c_n^2=c_1^2=1=2\Gamma_{rms}^2Γrms=1/20.707\Gamma_{rms}=1/\sqrt{2}\approx0.707.

Worked examples

Two problems in the strict format: problem → step-by-step substitution (with units) → result → dimension check → one-line Python verification. Problem 1 hand-computes c0,c1,c2c_0,c_1,c_2 and cross-checks with compute_fourier_coefficients; Problem 2 computes one harmonic's contribution to the phase noise.

Example 1 (hand-compute the first few cnc_n, then cross-check in code): given the toy ISF Γ(θ)=0.25sinθ+0.35sin2θ+0.18cos3θ\Gamma(\theta)=0.25-\sin\theta+0.35\sin2\theta+0.18\cos3\theta (the synthetic waveform used in the lab_05 reconstruction figure), hand-compute c0,c1,c2,c3c_0,c_1,c_2,c_3.

Step by step (read the coefficients off directly; no integration needed): compare Γ\Gamma term by term with the standard expansion Γ=a02+n[ancosnθ+bnsinnθ]\Gamma=\dfrac{a_0}{2}+\sum_n[a_n\cos n\theta+b_n\sin n\theta]:

  1. DC: the constant term of Γ\Gamma is 0.250.25, i.e. the mean =0.25=0.25. Since the DC value =a0/2=a_0/2, we get a0=0.5a_0=0.5, hence c0=a0=0.5c_0=a_0=0.5.
  2. Fundamental n=1n=1: Γ\Gamma contains sinθ-\sin\theta and no cosθ\cos\theta. Comparison gives a1=0a_1=0, b1=1b_1=-1. Hence c1=a12+b12=0+1=1c_1=\sqrt{a_1^2+b_1^2}=\sqrt{0+1}=1, θ1=atan2(b1,a1)=atan2(1,0)=π/2\theta_1=\operatorname{atan2}(-b_1,a_1)=\operatorname{atan2}(1,0)=\pi/2.
  3. Second harmonic n=2n=2: contains 0.35sin2θ0.35\sin2\theta and no cos2θ\cos2\theta. So a2=0a_2=0, b2=0.35b_2=0.35, hence c2=0.35c_2=0.35.
  4. Third harmonic n=3n=3: contains 0.18cos3θ0.18\cos3\theta and no sin3θ\sin3\theta. So a3=0.18a_3=0.18, b3=0b_3=0, hence c3=0.18c_3=0.18.

Result: c0=0.5, c1=1, c2=0.35, c3=0.18c_0=0.5,\ c_1=1,\ c_2=0.35,\ c_3=0.18 (the rest 0\approx0).

Dimension check: Γ\Gamma is dimensionless (notation); each cnc_n is one of its Fourier amplitudes, likewise dimensionless; θn\theta_n is rad (a phase) ✓.

Parseval cross-check (while we are at it): the strict relation (with the DC factor) is c022+n1cn2=2Γrms2\dfrac{c_0^2}{2}+\sum_{n\ge1}c_n^2=2\Gamma_{rms}^2. Substituting: 0.522+(12+0.352+0.182)=0.125+1.1549=1.2799\dfrac{0.5^2}{2}+(1^2+0.35^2+0.18^2)=0.125+1.1549=1.2799, so Γrms=1.2799/2=0.800\Gamma_{rms}=\sqrt{1.2799/2}=0.800. (Note: [P1] Eq.(20) writes n=0cn2=2Γrms2\sum_{n=0}^\infty c_n^2=2\Gamma_{rms}^2 using the convention that the DC term carries no extra 1/21/2; for a symmetric ISF with c0=0c_0=0 the two forms agree, but when c00c_0\neq0 remember the DC term's factor — see rms_isf.)

import numpy as np
from simulations.common.isf_utils import compute_fourier_coefficients, gamma_rms

theta = np.linspace(0.0, 2*np.pi, 4096, endpoint=True)
gamma = 0.25 - np.sin(theta) + 0.35*np.sin(2*theta) + 0.18*np.cos(3*theta)
a0, a, b, c, phase = compute_fourier_coefficients(theta, gamma, n_harmonics=4)
print("c0,c1,c2,c3 =", round(a0,3), round(c[1],3), round(c[2],3), round(c[3],3))
# -> c0,c1,c2,c3 = 0.5 1.0 0.35 0.18
print("Gamma_rms =", round(gamma_rms(theta, gamma),3)) # -> 0.8

Example 2 (one harmonic's contribution to phase noise): with the ISF of Example 1, a small tone of amplitude I0=1 μAI_0=1\ \mu\text{A} is injected at 2ω0+Δω2\omega_0+\Delta\omega (i.e. near the second harmonic). Take qmax=1q_{max}=1 pC and Δf=1\Delta f=1 MHz (Δω=2π×106\Delta\omega=2\pi\times10^6 rad/s). Find the phase-modulation amplitude and the relative single-sideband power this noise produces at offset Δω\Delta\omega from the carrier after downconversion via c2c_2.

Step-by-step substitution:

  1. Only the 22nd harmonic c2=0.35c_2=0.35 responds (the explicit algebra of Step 5: noise near 2ω02\omega_0 is moved to Δω\Delta\omega by c2c_2).
  2. Phase-modulation amplitude (from Eq.(16/17) with cnc2c_n\to c_2):
ϕp=I0c22qmaxΔω=(106A)×0.352×(1012C)×(6.283×106rad/s).\phi_p=\frac{I_0\,c_2}{2q_{max}\,\Delta\omega}=\frac{(10^{-6}\,\text{A})\times0.35}{2\times(10^{-12}\,\text{C})\times(6.283\times10^{6}\,\text{rad/s})}.
  1. Denominator =2×1012×6.283×106=1.257×105 Crad/s=2\times10^{-12}\times6.283\times10^{6}=1.257\times10^{-5}\ \text{C}\cdot\text{rad/s}; numerator =3.5×107 A=3.5\times10^{-7}\ \text{A}. Dividing gives ϕp=2.785×102 rad\phi_p=2.785\times10^{-2}\ \text{rad}.
  2. Relative single-sideband power ([P1] Eq.(18), (I0c24qmaxΔω)2=(ϕp/2)2\left(\dfrac{I_0c_2}{4q_{max}\Delta\omega}\right)^2=(\phi_p/2)^2):
PSBC=(ϕp2)2=(2.785×1022)2=1.939×104.P_{SBC}=\left(\frac{\phi_p}{2}\right)^2=\left(\frac{2.785\times10^{-2}}{2}\right)^2=1.939\times10^{-4}.

Result: ϕp27.9\phi_p\approx27.9 mrad, PSBC1.94×104=10log1037.1P_{SBC}\approx1.94\times10^{-4}=10\log_{10}\to-37.1 dBc.

Dimension check: ϕp\phi_p: AC(rad/s)=A(As)s1rad=AArad=rad1\dfrac{\text{A}}{\text{C}\cdot(\text{rad/s})}=\dfrac{\text{A}}{(\text{A}\cdot\text{s})\cdot\text{s}^{-1}\cdot\text{rad}}=\dfrac{\text{A}}{\text{A}\cdot\text{rad}}=\text{rad}^{-1}... in the simplification the rad of Δω\Delta\omega sits in the denominator, so ϕp\phi_p carries rad (C=AsC=\text{A}\cdot\text{s}; the s of rad/s cancels the s of C) → rad ✓. PSBC=(rad/rad)2P_{SBC}=(\text{rad}/\text{rad})^2 is dimensionless ✓ (a power ratio).

import numpy as np
I0, c2, qmax, dw = 1e-6, 0.35, 1e-12, 2*np.pi*1e6
phi_p = I0*c2/(2*qmax*dw)
P_sb = (I0*c2/(4*qmax*dw))**2
print(round(phi_p*1e3,1), "mrad ;", round(10*np.log10(P_sb),1), "dBc")
# -> 27.9 mrad ; -37.1 dBc
  • Feel: the same 1 μA1\ \mu\text{A} tone, if injected near the fundamental instead (using c1=1c_1=1 rather than c2=0.35c_2=0.35), makes ϕp\phi_p larger by a factor of 1/0.352.861/0.35\approx2.86 and the power larger by (1/0.35)28.2(1/0.35)^2\approx8.2 (+9.1+9.1 dB). This is the numerical face of "cnc_n as mixer gains": the larger a harmonic's coefficient, the harder it folds that band's noise back.

(Full library: simulations/common/isf_utils.py.)

Applicability and failure conditions

ConditionWhen it holdsWhat happens when it fails
Oscillator in periodic steady stateΓ\Gamma is strictly 2π2\pi-periodic, Fourier-expandableduring startup transients / under injection pulling, Γ\Gamma is not purely periodic
Noise is a small perturbationlinear superposition in Eq.(13) holdslarge injection → harmonic interaction; the single-cnc_n picture breaks down
Device noise is stationarysimple per-band bookkeepingcyclostationary noise requires Γeff=Γα\Gamma_{eff}=\Gamma\cdot\alpha (see effective_isf)
Γ\Gamma correctly extractedcoefficients are trustworthytransient / adjoint simulation needed to obtain Γ\Gamma

Key takeaways

  • Γ\Gamma is a 2π2\pi-periodic function, expandable as Γ=c02+n1cncos(nω0τ+θn)\Gamma=\dfrac{c_0}{2}+\sum_{n\ge1}c_n\cos(n\omega_0\tau+\theta_n) ([P1] Eq.(12), p.183).
  • The oscillator acts like a time-varying mixer: the nn-th coefficient cnc_n down-converts device noise near nω0n\omega_0 to the carrier ([P1] Eq.(16), Fig. 8).
  • c0c_0 (the DC coefficient; the DC value =c0/2=c_0/2) upconverts baseband flicker noise into close-in 1/f31/f^3 ([P1] Eq.(15),(23),(24)).
  • Waveform symmetry sets the parity of the coefficients: odd function ⟹ c0=0c_0=0 (no 1/f1/f upconversion); half-wave symmetry ⟹ even harmonics vanish.
  • Ideal LC: c0=0, c1=1c_0=0,\ c_1=1, the rest zero; Γrms=1/20.707\Gamma_{rms}=1/\sqrt2\approx0.707.
  • Numerically, compute_fourier_coefficients (trapezoidal rule; theta including both the 00 and 2π2\pi endpoints) computes the coefficients.

Further reading