Parseval's Theorem: Energy in Time = Energy in Frequency
Parseval's theorem explained: how signal energy in time equals energy in frequency, with DFT formulas, code to verify it, and embedded pitfalls.

Contents & prerequisites
Why Energy Conservation Matters in Signal Processing
Energy as a fundamental signal property
Every signal that passes through an ADC, a filter, or a wireless channel carries a physical quantity: energy. Whether you're looking at a voltage waveform on an oscilloscope or its spectrum on an FFT analyzer, the total energy contained in that signal is a fixed number — it doesn't care which domain you choose to measure it in. This invariant is formalized by Parseval's theorem, which states that the energy computed by integrating (or summing) the squared magnitude of a signal in time equals the energy computed by integrating (or summing) the squared magnitude of its spectrum in frequency. Nothing is created or destroyed by the Fourier transform; it's just a change of coordinates.
Why embedded systems need energy-aware signal analysis
In resource-constrained systems, you rarely get the luxury of storing raw time-domain buffers alongside full FFT outputs. Engineers routinely move between domains — doing peak detection in frequency, computing RMS in time, applying filters that are easiest to reason about spectrally. If you don't have an energy invariant to check against, bugs in scaling, windowing, or FFT normalization go unnoticed until a system misbehaves in the field: an audio codec that clips unexpectedly, a vibration monitor that under-reports a fault frequency, or a power-quality analyzer that disagrees with a calibrated reference meter.
Connection to real-world power budgets and efficiency
Signal energy maps directly to physical power when you're dealing with electrical quantities — V²/R for voltage signals, I²R for current. Spectral energy analysis lets you attribute power dissipation to specific frequency bands: switching noise at the PWM frequency, mechanical vibration harmonics, or RF spurs. Parseval's theorem is the bridge that lets you trust that a frequency-domain power budget (watts per bin) adds up to the same total as a time-domain power measurement (watts from V²/R), which matters when you're certifying EMI compliance or budgeting battery life around a known load profile.
The Core Principle: Time-Domain Energy
Defining signal energy in the time domain
For a continuous-time signal x(t), the total energy is defined as
E = ∫ |x(t)|² dt, integrated over all time.
This comes directly from physics: if x(t) is a voltage across a 1 Ω resistor, |x(t)|² is instantaneous power, and integrating power over time gives energy in joules. The same definition extends to complex-valued signals, which is why |x(t)|² (not x(t)²) appears — it correctly handles phase and magnitude for analytic or modulated signals.
Finite energy vs. power signals
Not every signal has finite energy. A signal that persists forever with constant amplitude (like an unmodulated carrier) has infinite energy but finite power — the energy integral diverges, so instead you work with the time-averaged power, P = lim(T→∞) (1/2T)∫|x(t)|² dt over [-T, T]. Parseval's theorem in its basic form applies cleanly to finite-energy signals; power signals require the related but distinct concept of power spectral density, which you'll typically estimate with Welch's method rather than a direct Fourier transform.
Computing energy from samples: discrete-time formulation
For a sampled, finite-length signal x[n] with N samples, energy is
E = Σ |x[n]|², n = 0 to N-1.
This is the quantity your embedded code actually computes — a sum of squared ADC codes (scaled to physical units), not an integral. It's exact and requires no assumptions about the signal shape, which makes it your most trustworthy reference point for validation.
Practical interpretation for embedded signals
If x[n] is in volts and your sample rate is fs, the energy sum above has units of volt²·samples, which converts to volt²·seconds by dividing by fs — that's genuine joules once you divide by resistance. Keep track of this scaling explicitly; it's the single most common source of "Parseval doesn't match" bugs in real code.
Frequency-Domain Energy and the Parseval Relationship
Energy spectral density in the frequency domain
The magnitude-squared of the Fourier transform, |X(f)|² or |X(e^{jω})|², is called the energy spectral density (ESD) — it tells you how much energy is concentrated per unit frequency. Integrating or summing the ESD across all frequencies recovers the same total energy you computed in time.
Statement of Parseval's theorem for continuous and discrete signals
For the continuous-time Fourier transform, defined as in Continuous-Time Fourier Transform (CTFT): X(jω) = ∫x(t)e^(-jωt)dt:
∫ |x(t)|² dt = (1/2π) ∫ |X(jω)|² dω
For discrete sequences analyzed via the Discrete-Time Fourier Transform (DTFT): X(e^(jω)):
Σ |x[n]|² = (1/2π) ∫_{-π}^{π} |X(e^{jω})|² dω
For a finite-length sequence and its N-point DFT X[k], the practical embedded form (often called Parseval's relation for the DFT) is:
Σ_{n=0}^{N-1} |x[n]|² = (1/N) Σ_{k=0}^{N-1} |X[k]|²
Why the scaling factor matters (normalization)
That 1/N (or 1/2π for the DTFT) is not optional — it comes directly from how the forward and inverse transforms are normalized. FFT libraries vary: some normalize the forward transform by 1/N, some normalize the inverse, some split the factor as 1/√N on each side. If you don't know which convention your FFT library uses, your Parseval check will be off by a constant factor that looks like a bug but is actually a documentation question — always confirm normalization in your FFT library's reference manual before troubleshooting further.
Energy distribution across frequency components
Because Parseval holds bin-by-bin in the sense that summing |X[k]|²/N over any subset of bins gives the energy contributed by that frequency range, you can partition total energy into bands of interest — fundamental, harmonics, noise floor — directly from an FFT magnitude output, without ever touching the original time-domain buffer again.
Mathematical Derivation (Intuitive)
Starting from the Fourier transform definition
Parseval's theorem falls out of substituting the inverse Fourier transform into the energy integral: E = ∫ x(t) x*(t) dt, then replacing one x(t) with its inverse-transform definition in terms of X(jω), and swapping the order of integration.
How orthogonality of basis functions guarantees energy conservation
The deep reason this works is that complex exponentials e^{jωt} (or e^{j2πkn/N} in discrete form) form an orthogonal basis — the inner product of two different-frequency exponentials integrates to zero. When you expand the energy integral this way, every cross-term between different frequencies vanishes, leaving only the "self" terms |X(ω)|², which is exactly the statement that energy doesn't leak between orthogonal components. This is the same orthogonality property discussed alongside linearity and scaling in CTFT Properties: Linearity, Shift, Scaling, Duality.
Step-by-step for DTFT and CTFT cases
- Write E = ∫ x(t)x*(t) dt.
- Substitute x*(t) = (1/2π)∫X*(jω)e^{-jωt} dω.
- Swap integration order: E = (1/2π)∫X*(jω) [∫x(t)e^{-jωt}dt] dω.
- Recognize the inner bracket as X(jω), giving E = (1/2π)∫|X(jω)|² dω.
The DTFT and DFT derivations follow identically, with sums replacing integrals and the orthogonality of discrete complex exponentials replacing the continuous integral identity.
Why the integral and sum give identical results
Both derivations rely on exactly one property: orthogonality of the basis functions used to decompose the signal. The domain (continuous vs. discrete, infinite vs. finite) only changes the bookkeeping, not the underlying conservation law.
Practical Applications in Embedded Systems
Detecting dominant frequency bands without time-domain analysis
Once you trust Parseval, you can discard raw samples after computing an FFT and still answer "what fraction of total energy is above 10 kHz?" purely from |X[k]|², which is valuable when memory is tight and you only need summary statistics for a classifier or threshold check.
Power consumption profiling via spectral energy
For current-sense signals, converting |X[k]|² bins into watts (after scaling by sense resistance and sample rate) lets you build a frequency-resolved power budget — useful for isolating switching regulator losses from load-dependent draw without separate measurement setups.
Validating signal acquisition and quantization loss
Compute time-domain energy directly from raw ADC samples, then compute frequency-domain energy from the FFT of the same buffer. A mismatch beyond floating-point rounding (relative error > 1e-6 for double precision, larger for fixed-point) indicates a bug: wrong normalization, windowing applied inconsistently, or a scaling error in unit conversion.
Compression and noise floor estimation
Lossy compression schemes (audio codecs, vibration data loggers) often discard low-energy frequency bins. Parseval tells you precisely how much total signal energy you're sacrificing by zeroing out a given set of bins, turning "we dropped some high-frequency content" into a quantifiable percentage of total energy, which is far more defensible in a design review.
Common Pitfalls and Verification
Windowing effects and energy leakage
Applying a window function (Hann, Hamming, Blackman) before an FFT changes the energy of the signal itself, because you've multiplied x[n] by a non-unity window w[n]. Parseval still holds exactly for the windowed signal — Σ|x[n]w[n]|² = (1/N)Σ|X_w[k]|² — but it no longer equals the energy of the original unwindowed signal. To compare against the true signal energy, you must divide by the window's own energy (Σw[n]²) or use a correction factor documented for your chosen window.
Sampling rate and normalization gotchas
Energy computed as a raw sum of squared samples is in "sample units," not joules or volt²-seconds, until you divide by the sampling rate fs. Mixing signals captured at different sample rates without this correction will make cross-domain or cross-measurement comparisons wrong even though each individual Parseval check passes internally.
Checking Parseval in your own measurements
A minimal verification in Python-style pseudocode:
x = acquire_samples() # N real samples, volts
E_time = sum(xi**2 for xi in x)
X = fft(x) # length-N complex FFT
E_freq = sum(abs(Xk)**2 for Xk in X) / N
assert abs(E_time - E_freq) / E_time < 1e-9
If this assertion fails by a large factor, check FFT normalization convention first, then windowing, then real vs. complex sample counting.
When one-sided vs. two-sided spectra apply
For real-valued signals, the DFT is conjugate-symmetric, so a one-sided spectrum (showing only bins 0 to N/2) must double the energy of all non-DC, non-Nyquist bins to match the full two-sided sum — forgetting this factor of two is one of the most common Parseval mismatches in practice.
Connecting to Convolution and System Response
How Parseval relates to filter energy transfer
When a signal passes through a linear time-invariant filter, the output spectrum is the product of input spectrum and filter frequency response, as described by the Convolution Theorem: Multiplication ↔ Convolution. Combined with Parseval, this means the output energy at each frequency is scaled by |H(f)|² — the filter's squared magnitude response directly predicts how much energy survives at each frequency, without needing to convolve in time at all.
Energy behavior when signals pass through LTI systems
A lossless filter (|H(f)| = 1 for all f, e.g., an all-pass or ideal delay) preserves total energy exactly. A low-pass filter discards energy above cutoff — the exact amount discardable is computable in advance from Σ|H(f)|²|X(f)|² over the stopband, letting you predict filtering losses before implementation.
Why spectral energy is preserved by linear operations
This is just Parseval applied twice — once to the input, once to the output — connected by the multiplicative relationship from the convolution theorem. It's why spectral energy accounting is such a reliable design tool: any linear operation's effect on energy is fully characterized by its frequency response alone.
Learning
Sign in to track your progress.
Evidence
Public projects engineers linked to Parseval's Theorem: Energy in Time = Energy in Frequency.
No engineer has linked a project to this topic yet. Built something that proves it? Add the project and tag it with signal-processing-parsevals-theorem-energy-in-time-energy-in-frequen — it then shows here and on your public profile.
