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 bits

  • bins (int, default=auto) — Number of histogram bins

  • show_plot (bool, default=False) — Display PDF plot with reference distributions

  • ax (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 counts

  • histogram_edges — PDF bin edges

  • kl_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#

References#

  1. IEEE Std 1241-2010, “IEEE Standard for Terminology and Test Methods for ADCs”

  2. S. Kullback and R. A. Leibler, “On Information and Sufficiency,” Annals of Mathematical Statistics, 1951