Model notes
Ported from ADCToolbox 0.9.1. models/sar.py: sar_convert, sar_reconstruct, sar_apply_cap_mismatch. calibration/: calibrate_weight_sine, scale_calibration_output. siggen/nonidealities.py: apply_jitter. spectrum/: analyze_spectrum. This page is the interactive companion to its examples exp_d02, exp_d03, exp_d15 and exp_g04; python/sar_binary_vs_redundant.py calls ADCToolbox itself and the numbers agree to 0.001 ENOB.
Conversion. Comparison j adds weight wj to the DAC level kept so far and keeps it when the input is not lower. The code is the sum of the kept nominal weights.
Terminating capacitor. The switched capacitors add up to 2N − 1 units, so one more unit terminates the array and makes the total 2N: that is what makes one unit worth exactly one LSB. Half of it is switched to the reference, which puts every decision level half an LSB below a code level, so the converter returns the nearest code rather than the one below and its interior-range error is ±½ LSB instead of −1 … 0 LSB. The endpoints saturate. This is a behavioral decision-threshold offset, not a universal SAR switching scheme.
Weights. Both arrays are specified by the same thing, the nominal resolution N: they cover 2N − 1 LSB and their smallest capacitor is one unit. Binary spends one comparison per bit, wj = 2N−1−j. Redundant takes the fewest comparisons m whose radix 2N/m is still at most 1.8 — 15 for 12 bits, 19 for 16 — and uses that geometric series, with each nonterminal weight limited by the available tail where the cap applies.
What the cap buys. Capping is what leaves each comparison a margin: a comparison that wrongly drops its weight is recovered while the input stays within the later weights plus one LSB, and the nominal array has at least one LSB of that margin before the final comparison. The final comparison has no later weight for recovery. It binds only at the bottom, where it ends the array 4 2 1 1 instead of 4 2 1 — the extra unit capacitor is the last LSB of redundancy, and with ideal capacitors it is the one comparison that never changes anything.
The shaded input ranges. These mark an analog DAC reconstruction error larger than one LSB, sampled on a 0.25 LSB grid. They do not measure an irrecoverable percentage: digital weights can shift reconstruction levels. What calibration cannot recover is information within an overly wide decision interval. Redundancy reduces such intervals when the remaining actual weights cover a decision error; it is not a guarantee for every mismatch or noise draw.
Reachability bars. After each decision the remaining positive weights give an outer DAC range, expanded by ±1 LSB. Being outside proves that the analog reconstruction cannot finish within that tolerance. Being inside does not prove that every level is reachable. This unipolar search mainly tolerates a wrongly rejected weight; a wrongly accepted weight cannot subsequently be subtracted.
Capacitor mismatch. Weight wj is built from wj/wmin unit capacitors, each with relative mismatch σ, so its relative error is σ/√units. New chip draws another set of errors.
Comparator noise. Gaussian, drawn anew for every decision. The stepped conversion uses one draw; New noise replaces it.
Weight calibration. A separate 128-sample sine record estimates each digital reconstruction weight. Those weights are then applied to the 4096-sample spectrum record shown below. A digital weight fit can correct the value of observed decisions; it cannot recreate an input interval that a non-redundant search skipped.
Spectrum. 4096 conversions of a −0.5 dBFS sine, rectangular window. ENOB = (SNDR − 1.76) / 6.02. The largest spur is labelled with its harmonic order when it is one.
Sampling. fs = 100 MS/s. The calibration and spectrum tones use coherent bins, so the FFT needs no window.
Input frequency and clock jitter. Mismatch and comparator noise act on a held sample and do not care about the input frequency; the sampling instant does. Gaussian jitter σt turns the slope of the input into a voltage error, so it alone limits the converter to SNR = −20 log₁₀(2πfinσt) — 6 dB per doubling of the input frequency. Applied as ADCToolbox's siggen.apply_jitter does, by sampling the sine at t + Δt.