Fourier Series of the ISF
β: This English translation is in beta — the Traditional-Chinese original is the authoritative version.
Prerequisites: isf_definition ( is dimensionless and -periodic), impulse_to_phase_shift (the operational definition of ), 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, , and pointed out that is a dimensionless, -periodic function. This page answers the next key question:
Given that 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):
Physical intuition (conclusion first): an oscillator is a time-varying mixer. Its phase sensitivity to noise, , varies periodically with the waveform phase — equivalent to multiplying the noise by a "periodic weight" with fundamental . Multiplying noise by a periodic function is, mathematically, shifting the noise spectrum to and summing. So device noise near each is weighted by the -th Fourier coefficient and then down-converted to the carrier vicinity as phase noise. The (DC) term is especially important: it moves the 1/f flicker noise near DC straight up, producing the close-in phase noise.
Step 1: why can be expanded as a Fourier series
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 ), so "kicking at phase " and "kicking at phase " have exactly the same effect. In other words is -periodic in its argument :
- Math used: any -periodic function that is square-integrable over one period () 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: is ✓, dimensionless; itself is dimensionless, and so are (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 -periodic function:
with the coefficients obtained by inner products (projections) over one period:
- Math used: are orthogonal on , (); this orthogonality "sifts" out the corresponding component.
- Watch the and the DC factor: , while the mean (DC value) of is . So the first term of the series must be written to equal the true mean. This is not arbitrary; the definition of below inherits it.
Step 3: merge into amplitude–phase form to get
Combine the same-frequency pair into a single cosine via the trig identity:
where
- Math used: ; matching coefficients gives , ; inverting yields the expressions above.
- DC correspondence: set (the DC coefficient), so the constant term . Substituting gives [P1] Eq.(12):
- Notation trap (important): is the Fourier coefficient, while the DC value of the ISF is . This factor
is the easiest place to slip when computing the corner (Eq.(24)); later chapters will keep reminding you. The
a0returned by this site's Pythoncompute_fourier_coefficientsequals this (see Step 8).
Step 4: the physics of — DC, controls upconversion
Substitute the Fourier expansion of the ISF back into the LTV phase response ([P1] Eq.(11)→Eq.(13), p.183):
The first term (the term) integrates the noise current directly, without any modulation. Meaning:
- The 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, (): only the term responds (the other harmonics are averaged out by ), giving ([P1] Eq.(15), p.183):
- Why this is called " upconversion": device flicker / noise is concentrated at low frequency (near DC). The 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 skirt ([P1] Eq.(23),(24)).
- Design implication: the smaller , the weaker the flicker upconversion. With (a perfectly symmetric waveform), close-in theoretically has no 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 — frequency-translating noise near to the carrier
Look at the -th component of the second term of Eq.(13): it multiplies the noise current by and then integrates. Multiplying by is, in the frequency domain, shifting the noise spectrum by (modulation theorem). So:
- Device noise near (and ) is weighted by and down-converted to , becoming the phase noise at offset from the carrier.
- Inject a small tone near , , into Eq.(13): only the -th harmonic responds, giving ([P1] Eq.(16)/(17), p.183):
Explicit algebra: using to move noise near 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 -th component of the second term of Eq.(13) and substitute the single tone :
Step (i): product-to-sum. The product of the two cosines uses the identity
with , ; compute the difference and sum frequencies:
The integrand becomes two terms:
This line is the core of "frequency translation": noise that originally lived at , once multiplied by , has its difference frequency collapse down to at baseband (moved down), while its sum frequency is pushed to (higher, useless).
Step (ii): the integrator amplifies only the slow term and averages out the fast one. is a low-pass:
Step (iii): keep only the slow term.
Absorbing the fixed phase into the origin recovers Eq.(16/17). Conclusion: the -th Fourier coefficient really does take the noise near , "multiply it by and collapse it to " — 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 summation.)
- This is exactly the picture of [P1] Fig. 8 (p.183): noise is spread across the bands at ; the ISF's 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 are — after simplification is rad (dimensionless), and is dimensionless ✓. (Remember .)
Step 6: why close-in () is dominated by and the low-order coefficients
Put the two steps above together into one "frequency map":
| Where the device noise lives | Via which coefficient | What it becomes next to the carrier |
|---|---|---|
| flicker near DC | close-in, slope (very steep) | |
| White noise near | skirt ( dB/dec) | |
| White noise at | also folds back, merged into (counted via ) |
- Why flicker becomes through : flicker is already (power spectrum ). The term moves it intact next to the carrier; the phase integrator (the in Eq.(13)) then adds another (integration divides by in frequency, i.e. by in power), → .
- Why the higher-order mainly feed : white noise is flat — flat wherever it is moved — and the integrator only adds → . All harmonic contributions are summarized by a single number, , which is exactly the Parseval relation and of the next page rms_isf.
- The full / 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 , giving the designer a knob to "switch off certain upconversions via the waveform shape":
| Symmetry of | Mathematical result | Physical consequence |
|---|---|---|
| Even function | all (pure cos) | , simple phases |
| Odd function | all and ⟹ | no upconversion (the ideal-LC is of this type) |
| Half-wave symmetry | even harmonics | noise near does not fold back |
DC offset (toy gamma_asymmetric) | appears (close-in degrades) |
- Example (ideal LC): is odd ⟹ . So the ideal LC has, to first order, no flicker upconversion; it is real-world asymmetry (hard switching, bias asymmetry) that props up.
- Example (half-wave symmetry): differential / push-pull structures make the rising and falling edges mirror images ⟹ ⟹ the even harmonics are suppressed, and noise at (often supply ripple and second-harmonic distortion) does not fold back to the carrier.
- Note (mechanism of the toy model): the
gamma_asymmetricin the table props up in the simplest possible way — adding a DC offset to the whole ISF (); in real circuits, asymmetric rise/fall transition slopes are a different — and more common — mechanism that likewise makes and turns on upconversion, but with a different waveform shape. The toy on this page exists only to isolate the " knob". - This is exactly the message of the figure below: symmetric waveform , asymmetric waveform .
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 : the function docstring states explicitly that
thetamust span[0, 2*pi](endpoint included), otherwise 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. ) and you get , , and the rest — confirming that is exactly the knob that "props up the DC and turns on 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
() and reconstructs it with terms,
showing how the partial sums of Eq.(12) converge step by step to the original waveform.

- Corresponding formula: [P1] Eq.(12) (partial sum ).
- How to read it: captures only the fundamental and has the largest error; by 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 (with Parseval verification)
The figure below (fig_coefficients from lab_05, n_harmonics=8) plots as a bar chart (the coefficient spectrum)
and marks the Parseval check ([P1] Eq.(20), derived in detail on the next page).

- Corresponding formulas: the of [P1] Eq.(12); the of [P1] Eq.(20).
- How to read it: each bar's height is that harmonic's "weight" in the phase noise. The bar is critical — as soon as it is nonzero, close-in appears. The low-order bars dominate; the high orders decay quickly.
- The detailed Parseval derivation and are in rms_isf.
Figure 3: for symmetric vs. asymmetric waveforms
The figure below (fig_symmetric_vs_asymmetric from lab_05) contrasts two toy ISFs: the symmetric
() and the asymmetric (), highlighting that only
upconverts noise.

- Corresponding formulas: ([P1] Eq.(12)); its consequence, the corner of [P1] Eq.(24).
- How to read it: on the left, the symmetric waveform has zero mean and the DC bar disappears → no ; 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_asymmetricare pedagogical toy ISFs, not transistor-level (see theisf_utils.pydocstring). - Design-side extension: symmetry.
Numerical example (building a feel for the numbers)
Take the ideal-LC and hand-compute the first few coefficients.
View as a Fourier expansion of itself: , where ; for this to equal requires (then ), hence , .
- (odd function, zero DC).
- , ().
- Feel: the ideal-LC ISF is a "clean single fundamental" — all the energy sits in . So it folds noise back mainly from near (), and since there is, ideally, no . The next page shows ⟹ .
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 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 , then cross-check in code): given the toy ISF (the synthetic waveform used in the lab_05 reconstruction figure), hand-compute .
Step by step (read the coefficients off directly; no integration needed): compare term by term with the standard expansion :
- DC: the constant term of is , i.e. the mean . Since the DC value , we get , hence .
- Fundamental : contains and no . Comparison gives , . Hence , .
- Second harmonic : contains and no . So , , hence .
- Third harmonic : contains and no . So , , hence .
Result: (the rest ).
Dimension check: is dimensionless (notation); each is one of its Fourier amplitudes, likewise dimensionless; is rad (a phase) ✓.
Parseval cross-check (while we are at it): the strict relation (with the DC factor) is . Substituting: , so . (Note: [P1] Eq.(20) writes using the convention that the DC term carries no extra ; for a symmetric ISF with the two forms agree, but when 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 is injected at (i.e. near the second harmonic). Take pC and MHz ( rad/s). Find the phase-modulation amplitude and the relative single-sideband power this noise produces at offset from the carrier after downconversion via .
Step-by-step substitution:
- Only the nd harmonic responds (the explicit algebra of Step 5: noise near is moved to by ).
- Phase-modulation amplitude (from Eq.(16/17) with ):
- Denominator ; numerator . Dividing gives .
- Relative single-sideband power ([P1] Eq.(18), ):
Result: mrad, dBc.
Dimension check: : ... in the simplification the rad of sits in the denominator, so carries rad (; the s of rad/s cancels the s of C) → rad ✓. 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 tone, if injected near the fundamental instead (using rather than ), makes larger by a factor of and the power larger by ( dB). This is the numerical face of " 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
| Condition | When it holds | What happens when it fails |
|---|---|---|
| Oscillator in periodic steady state | is strictly -periodic, Fourier-expandable | during startup transients / under injection pulling, is not purely periodic |
| Noise is a small perturbation | linear superposition in Eq.(13) holds | large injection → harmonic interaction; the single- picture breaks down |
| Device noise is stationary | simple per-band bookkeeping | cyclostationary noise requires (see effective_isf) |
| correctly extracted | coefficients are trustworthy | transient / adjoint simulation needed to obtain |
Key takeaways
- is a -periodic function, expandable as ([P1] Eq.(12), p.183).
- The oscillator acts like a time-varying mixer: the -th coefficient down-converts device noise near to the carrier ([P1] Eq.(16), Fig. 8).
- (the DC coefficient; the DC value ) upconverts baseband flicker noise into close-in ([P1] Eq.(15),(23),(24)).
- Waveform symmetry sets the parity of the coefficients: odd function ⟹ (no upconversion); half-wave symmetry ⟹ even harmonics vanish.
- Ideal LC: , the rest zero; .
- Numerically,
compute_fourier_coefficients(trapezoidal rule;thetaincluding both the and endpoints) computes the coefficients.
Further reading
- Operational ISF definition (previous step): impulse_to_phase_shift
- Parseval and the rms ISF (next step): rms_isf
- How feeds : white_noise_to_phase_noise
- How feeds : flicker_noise_upconversion
- Design consequences of symmetry: symmetry
- Numerical-feel quick reference: numerical_feeling