analyze_error_pdf
Overview
analyze_error_pdf analyzes the probability distribution (PDF) of ADC errors by comparing the input signal against a fitted sine wave. This reveals error characteristics: Gaussian noise, uniform quantization, non-Gaussian distortion, etc.
Syntax
from adctoolbox import analyze_error_pdf
# Basic usage
result = analyze_error_pdf(signal, resolution=12, show_plot=True)
# With custom parameters
result = analyze_error_pdf(signal, resolution=12, bins=100, show_plot=True)
Parameters
signal(array_like) — Input ADC signal (sine wave excitation)resolution(int, optional) — ADC resolution in bitsbins(int, default=auto) — Number of histogram binsshow_plot(bool, default=False) — Display PDF plot with reference distributionsax(matplotlib axis, optional) — Axis for plotting
Returns
Dictionary containing:
error— Error signal (data - fitted_sine)sigma— Standard deviation of error (LSB)histogram_counts— PDF histogram countshistogram_edges— PDF bin edgeskl_divergence— KL divergence from Gaussian (measure of non-Gaussianity)
Algorithm
1. Fit Sine Wave
from adctoolbox import fit_sine_4param
result = fit_sine_4param(signal)
fitted_sine = result['fitted_signal']
2. Compute Error
error = signal - fitted_sine
error_lsb = error * 2**resolution # Convert to LSB units
3. Build Histogram
counts, edges = np.histogram(error_lsb, bins=bins, density=True)
4. Compare to References
Compare measured PDF against:
Gaussian: For thermal noise
Uniform: For quantization noise
Other: For specific distortions
Examples
Example 1: Error PDF Analysis
import numpy as np
from adctoolbox import analyze_error_pdf
# Analyze 12-bit ADC with noise
result = analyze_error_pdf(adc_data, resolution=12, show_plot=True)
print(f"Error std: {result['sigma']:.3f} LSB")
print(f"KL divergence: {result['kl_divergence']:.4f}")
Example 2: Multiple Non-Idealities
# Compare different error sources
datasets = {
'Thermal Noise': signal_with_noise,
'Quantization': signal_with_quant,
'Jitter': signal_with_jitter,
}
for name, data in datasets.items():
result = analyze_error_pdf(data, resolution=12, show_plot=False)
print(f"{name:15s}: σ={result['sigma']:.3f} LSB, "
f"KL={result['kl_divergence']:.4f}")
Interpretation
Error Distribution Shapes
PDF Shape |
Likely Cause |
|---|---|
Gaussian |
Thermal noise (random, white) |
Uniform |
Quantization noise (ideal ADC) |
Bimodal |
Missing codes, DNL issues |
Heavy tails |
Impulsive noise, glitches |
Asymmetric |
Systematic offset, drift |
KL Divergence
KL < 0.1: Very close to Gaussian (thermal noise dominant)
0.1 < KL < 0.5: Moderately Gaussian
KL > 0.5: Non-Gaussian (distortion, deterministic errors)
Use Cases
Distinguish thermal noise from quantization noise
Identify non-Gaussian error sources (glitches, interference)
Validate ADC noise models
Compare error characteristics across different non-idealities
See Also
analyze_error_autocorr— Temporal correlation in errorsanalyze_error_spectrum— Frequency content of errorsfit_sine_4param— Sine wave fitting
References
IEEE Std 1241-2010, “IEEE Standard for Terminology and Test Methods for ADCs”
S. Kullback and R. A. Leibler, “On Information and Sufficiency,” Annals of Mathematical Statistics, 1951