Signal Generation (siggen)

The siggen module provides tools for generating test signals.

Signal Generation Module for ADC Testing

Provides signal generators and non-ideality appliers for simulating various ADC imperfections and effects.

class adctoolbox.siggen.ADC_Signal_Generator(N, Fs, Fin, A, DC)[source]

Bases: object

Generates ADC test signals with various non-idealities using the Applier Pattern.

Each method accepts optional input_signal parameter. If None, uses clean base signal. Methods return signal with non-ideality applied. Supports chaining multiple effects.

Parameters:
  • N (int) – Number of samples

  • Fs (float) – Sampling frequency (Hz)

  • Fin (float) – Input signal frequency (Hz)

  • A (float) – Input signal amplitude (e.g., 0.49)

  • DC (float) – Input signal DC offset (e.g., 0.5)

__init__(N, Fs, Fin, A, DC)[source]

Initialize ADC_Signal_Generator with signal parameters.

get_clean_signal()[source]

Return clean sine wave: A*sin(2π*Fin*t) + DC (explicit public interface).

apply_thermal_noise(input_signal=None, noise_rms=5e-05)[source]

Apply white thermal noise. Params: input_signal (None->clean), noise_rms (default 50e-6).

apply_quantization_noise(input_signal=None, n_bits=10, quant_range=(0.0, 1.0))[source]

Apply quantization noise. Params: quant_range: tuple (v_min, v_max), e.g., (0, 1) or (-0.5, 0.5).

apply_jitter(input_signal=None, jitter_rms=2e-12)[source]

Apply sampling jitter.

Logic: - Case 1 (Source Generation): If input_signal is None, regenerates from scratch (Perfect Precision). - Case 2 (Chain Processing): If input is provided, uses Cubic Spline interpolation (Preserves previous errors).

apply_static_nonlinearity(input_signal=None, k2=0, k3=0, k4=0, k5=0)[source]

Applies static nonlinear distortion to the signal using direct polynomial coefficients (k2 to k5).

apply_static_nonlinearity_hd(input_signal=None, hd2_dB=None, hd3_dB=None, hd4_dB=None, hd5_dB=None)[source]

Converts specified Harmonic Distortion levels (dBc) to polynomial coefficients and applies the nonlinearity.

apply_memory_effect(input_signal=None, memory_strength=0.009)[source]

Apply memory effect (charge injection). The previous MSB decision leaks back to the input. Params: input_signal, memory_strength (default 0.009).

apply_incomplete_sampling(input_signal=None, T_track=None, tau_nom=4e-11, coeff_k=0.15)[source]

Apply dynamic nonlinearity (tracking/settling). Models slew-rate and signal-dependent settling errors. Params: input_signal, T_track, tau_nom (default 40ps), coeff_k (default 0.15).

apply_ra_gain_error(input_signal=None, relative_gain=0.99, msb_bits=4, lsb_bits=12)[source]

Apply interstage gain error (2-stage pipeline ADC). Params: input_signal, relative_gain (default 0.99 = 1% error).

apply_ra_gain_error_dynamic(input_signal=None, relative_gain=1, coeff_3=0.15, msb_bits=4, lsb_bits=12)[source]

Applies dynamic gain error to the interstage residue amplifier in a pipeline ADC. G[n] is non-linearly dependent on the previous residue output magnitude (V_prev_ac^3), modeling HD3 memory effects.

apply_reference_error(input_signal=None, settling_tau=2.0, droop_strength=0.01)[source]

Apply Reference Incomplete Settling error (Vref Memory Effect).

This simulates the reference voltage dropping due to load current (kick) and failing to recover fully before the next sample.

Params:

input_signal: The input signal. settling_tau: Recovery time constant in units of samples (e.g., 2.0).

Larger = Slower recovery = Worse settling.

droop_strength: How much Vref drops proportional to signal amplitude (0.01 = 1%).

apply_am_noise(input_signal=None, strength=0.01)[source]

Apply random AM noise (Multiplicative Thermal Noise). Params:

input_signal: The signal to modulate. am_noise_depth: The RMS level of the noise relative to signal amplitude (default 0.1).

Note

There is NO frequency parameter here because white noise contains ALL frequencies.

apply_am_tone(input_signal=None, am_tone_freq=500000.0, am_tone_depth=0.05)[source]

Apply AM tone (coherent modulation). Params: input_signal, am_tone_freq (default 500kHz), am_tone_depth (default 0.05).

apply_clipping(input_signal=None, percentile_clip=1.0)[source]

Apply hard clipping based on signal’s percentile (e.g., 1.0 clips top/bottom 1%).

apply_drift(input_signal=None, drift_scale=5e-05)[source]

Apply drift (low-frequency random walk). Params: input_signal, drift_scale (default 5e-5).

apply_glitch(input_signal=None, glitch_prob=0.00015, glitch_amplitude=0.1)[source]

Apply random glitches. Params: input_signal, glitch_prob (default 0.00015 = 0.015%), glitch_amplitude (default 0.1).

apply_noise_shaping(input_signal=None, n_bits=10, quant_range=(0.0, 1.0), order=1)[source]

Apply noise-shaped quantization (1st to 5th order delta-sigma).

Noise Transfer Function: NTF(z) = (1 - z^-1)^order

Order characteristics: - 1st order: 20 dB/decade roll-off (common in basic delta-sigma) - 2nd order: 40 dB/decade roll-off (most common for oversampling ADCs) - 3rd order: 60 dB/decade roll-off (aggressive shaping) - 4th order: 80 dB/decade roll-off (maximum practical, stability concerns) - 5th order: 100 dB/decade roll-off (rarely used, high stability risk)

This method applies actual quantization (using apply_quantization_noise), then shapes the quantization error spectrum using the NTF filter. Pushes quantization noise to higher frequencies, improving in-band SNR.

Params:

input_signal: Input signal (None -> clean sine wave) n_bits: Quantizer resolution (default 10) quant_range: Quantization range (v_min, v_max), e.g., (0, 1) or (-0.5, 0.5) order: Noise shaping order (1, 2, 3, 4, or 5, default 1)

Returns:

Signal with noise-shaped quantization noise added

Raises:

ValueError – If order is not in [1, 2, 3, 4, 5]