ADCToolbox Algorithm Overview#
Last Updated: 2025-12-03
Introduction#
This document describes the working principles and architectural design of the MATLAB algorithms in ADCToolbox. The toolbox has been streamlined for efficiency, maintainability, and consistent output formatting.
Toolset Architecture#
Design Principles#
Separation of Concerns: Tool execution and panel generation are separate functions
Data-Driven Execution: Tool lists defined as data structures to eliminate repetitive code
Auto-Detection: Panel functions automatically locate plot files using naming conventions
Consistent Formatting: All tools use standardized figure properties and output
File Organization#
matlab/src/
├── toolset_aout.m # 9 analog analysis tools
├── toolset_aout_panel.m # Combine AOUT plots into 3×3 panel
├── toolset_dout.m # 6 digital analysis tools
├── toolset_dout_panel.m # Combine DOUT plots into 3×2 panel
└── [individual tool functions]
toolset_aout: Analog Output Analysis#
Files:
MATLAB:
matlab/src/toolset_aout.mPython:
python/src/adctoolbox/toolset_aout.py
Purpose#
Executes 9 diagnostic tools on calibrated ADC analog output data (sine wave). Covers time-domain, frequency-domain, and statistical error analysis.
Algorithm Workflow#
1. Parse inputs (aout_data, outputDir, optional parameters)
2. Create output directory if needed
3. Pre-compute common parameters:
- freqCal = findfreq(aout_data) % Auto-detect input frequency
- FullScale = max(aout_data) - min(aout_data)
- err_data = aout_data - sinfit(aout_data) % Error signal
4. For each tool i = 1:9:
- Create figure (800×600, visible/hidden)
- Execute tool function with pre-computed params
- Format (title, font size 14)
- Save PNG: <prefix>_<i>_<toolname>.png
- Close figure
- Print progress message
5. Return cell array of 9 file paths
Tool Execution Pattern#
Each tool follows a standardized pattern:
fprintf('[%d/9] toolname');
figure('Position', [100, 100, 800, 600], 'Visible', opts.Visible);
tool_function(params...);
title('Tool Name');
set(gca, 'FontSize', 14);
plot_files{i} = fullfile(outputDir, sprintf('%s_%d_toolname.png', opts.Prefix, i));
saveas(gcf, plot_files{i});
close(gcf);
fprintf(' -> %s\n', plot_files{i});
Tools Executed#
# |
Tool |
Key Parameters |
|---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
Key Features#
Pre-computation: Expensive calculations (frequency detection, sine fit) done once and reused
Memory Management: Figures closed immediately after save to prevent memory buildup
Fail-Fast: Execution stops on first error (use
try-catchfor fail-safe execution)Standardized Output: All plots have consistent size and formatting
toolset_dout: Digital Output Analysis#
Files:
MATLAB:
matlab/src/toolset_dout.mPython:
python/src/adctoolbox/toolset_dout.py
Purpose#
Executes 6 diagnostic tools on ADC digital bit outputs (for SAR ADCs and bit-weighted architectures). Performs calibration, weight analysis, and performance evaluation.
Algorithm Workflow#
1. Parse inputs (bits, outputDir, optional parameters)
2. Create output directory if needed
3. Extract resolution: nBits = size(bits, 2)
4. Calibrate bit weights:
[w_cal, ~, ~, ~, ~, f_cal] = wcalsine(bits, 'freq', 0, 'order', Order, 'verbose', 0)
5. Pre-compute digital codes:
- digitalCodes = bits * (2.^(nBits-1:-1:0))' % Nominal binary weights
- digitalCodes_cal = bits * w_cal' % Calibrated weights
6. Define tool execution table (struct array with 6 entries)
7. For each tool i = 1:6:
- Create figure (variable size, visible/hidden)
- Execute tool function handle from struct
- Format (title, font size 14)
- Save PNG with exportgraphics (150 DPI)
- Close figure
- Print progress message
8. Return cell array of 6 file paths
Data-Driven Tool Execution#
Unlike the old repetitive approach, tools are defined as a struct array:
tools = {
struct('idx', 1, 'name', 'Spectrum (Nominal)', 'suffix', '1_spectrum_nominal', ...
'pos', [100, 100, 800, 600], ...
'fn', @() plotspec(digitalCodes, 'label', 1, 'harmonic', 5, 'OSR', 1, 'window', @hann));
struct('idx', 2, 'name', 'Spectrum (Calibrated)', 'suffix', '2_spectrum_calibrated', ...
'pos', [100, 100, 800, 600], ...
'fn', @() plotspec(digitalCodes_cal, 'label', 1, 'harmonic', 5, 'OSR', 1, 'window', @hann));
% ... 4 more tools
};
for i = 1:6
fprintf('[%d/6] %s', i, tools{i}.name);
figure('Position', tools{i}.pos, 'Visible', p.Results.Visible);
tools{i}.fn(); % Execute function handle
title(tools{i}.name);
set(gca, 'FontSize', 14);
plot_files{i} = fullfile(outputDir, sprintf('%s_%s.png', p.Results.Prefix, tools{i}.suffix));
exportgraphics(gcf, plot_files{i}, 'Resolution', 150);
close(gcf);
fprintf(' -> %s\n', plot_files{i});
end
Benefits of Data-Driven Approach:
Code Reduction: 109 lines → 66 lines (40% reduction)
Consistency: Single point of control for formatting
Maintainability: Easy to add/remove/modify tools
Readability: Tool properties clearly visible in struct definition
Tools Executed#
# |
Tool |
Purpose |
Figure Size |
|---|---|---|---|
1 |
|
Spectrum before calibration |
800×600 |
2 |
|
Spectrum after |
800×600 |
3 |
|
Bit toggle rate analysis |
1000×750 |
4 |
|
Overflow/redundancy check |
1000×600 |
5 |
|
Radix visualization |
800×600 |
6 |
|
ENoB vs number of bits |
800×600 |
Panel Functions#
toolset_aout_panel#
File: matlab/src/toolset_aout_panel.m
Combines 9 individual AOUT plots into a 3×3 panel figure.
Algorithm#
1. Parse inputs (outputDir, optional Prefix, PlotFiles, Visible)
2. If PlotFiles not provided:
- Auto-construct file paths: <outputDir>/<prefix>_<i>_<name>.png
3. Validate 9 files expected
4. Create 3×3 tiled layout figure (1800×1000)
5. For each plot i = 1:9:
- nexttile
- If file exists: imread, imshow, title
- Else: display "Missing" text in red
6. Add super title "AOUT Toolset Overview"
7. Export panel: PANEL_<PREFIX>.png (300 DPI)
8. Close figure
9. Return status struct (.success, .panel_path, .errors)
File Naming Convention#
Auto-detected files:
<prefix>_1_tomdec.png
<prefix>_2_plotspec.png
<prefix>_3_plotphase.png
<prefix>_4_errsin_code.png
<prefix>_5_errsin_phase.png
<prefix>_6_errPDF.png
<prefix>_7_errAutoCorrelation.png
<prefix>_8_errSpectrum.png
<prefix>_9_errEnvelopeSpectrum.png
toolset_dout_panel#
File: matlab/src/toolset_dout_panel.m
Combines 6 individual DOUT plots into a 3×2 panel figure.
Algorithm#
Same as toolset_aout_panel but with 6 plots in 3×2 layout (1200×1000).
File Naming Convention#
Auto-detected files:
<prefix>_1_spectrum_nominal.png
<prefix>_2_spectrum_calibrated.png
<prefix>_3_bitActivity.png
<prefix>_4_overflowChk.png
<prefix>_5_weightScaling.png
<prefix>_6_ENoB_sweep.png
Key Features#
Auto-Detection: Uses prefix to find files - no need to manually specify paths
Flexible: Can override with explicit
PlotFilesparameterRobust: Handles missing files gracefully (shows placeholder)
Reusable: Can re-generate panels without re-running tools
Common Utility Functions#
findfreq#
File: matlab/src/findfreq.m
Auto-detects sine wave frequency from time-domain signal using FFT.
Algorithm:
Compute FFT of input signal
Find peak in magnitude spectrum
Convert bin index to normalized frequency
Return frequency (0 to 0.5, normalized to sampling rate)
sinfit#
File: matlab/src/sinfit.m
Fits a 4-parameter sine wave to data: A*sin(2πft + φ) + DC
Algorithm:
Use
findfreqto detect frequencySet up nonlinear least squares problem
Optimize amplitude, frequency, phase, DC offset
Return fitted sine wave
Naming Conventions#
File Naming#
Individual tool outputs:
<prefix>_<index>_<toolname>.png
Examples:
aout_1_tomdec.pngdout_3_bitActivity.png
Panel outputs:
PANEL_<PREFIX>.png
Examples:
PANEL_AOUT.pngPANEL_DOUT.png
Variable Naming#
plot_files— Cell array of PNG file pathsoutputDir— Directory for output filesfreqCal— Calibrated/detected frequencyw_cal— Calibrated bit weightsdigitalCodes— Digital output codes (nominal weights)digitalCodes_cal— Digital output codes (calibrated weights)
Performance Optimizations#
Memory Management#
Figures closed immediately after save
Use
'Visible', falsefor batch processing (faster)Pre-allocate cell arrays for file paths
Computation Efficiency#
Pre-computation: Expensive operations (frequency detection, sine fit, calibration) done once
Data-driven loops: Eliminates repetitive code
Minimal disk I/O: Each plot saved once
Code Efficiency#
Before (repetitive):
% Tool 1
fprintf('[1/6] Tool1...');
f = figure('Visible', figVis, 'Position', [100, 100, 800, 600]);
tool1_function(params);
save_and_close(f, outputDir, opts.Prefix, '1_tool1', 'Tool 1');
% Tool 2
fprintf('[2/6] Tool2...');
f = figure('Visible', figVis, 'Position', [100, 100, 800, 600]);
tool2_function(params);
save_and_close(f, outputDir, opts.Prefix, '2_tool2', 'Tool 2');
% ... repeated 4 more times
After (data-driven):
tools = {struct('name', 'Tool1', 'suffix', '1_tool1', 'pos', [100,100,800,600], 'fn', @() tool1_function(params)); ...};
for i = 1:6
fprintf('[%d/6] %s', i, tools{i}.name);
figure('Position', tools{i}.pos, 'Visible', figVis);
tools{i}.fn();
% ... standardized save
end
Result: 109 lines → 66 lines (40% reduction)
Usage Patterns#
Pattern 1: Generate plots and panel together#
% AOUT
plot_files = toolset_aout(aout_data, 'output/test1');
panel_status = toolset_aout_panel('output/test1', 'Prefix', 'aout');
% DOUT
plot_files = toolset_dout(bits, 'output/test1');
panel_status = toolset_dout_panel('output/test1', 'Prefix', 'dout');
Pattern 2: Batch generate plots, then gather panels#
% Generate all plots first
for i = 1:N
toolset_aout(data{i}, sprintf('output/run%d', i), 'Prefix', sprintf('run%d', i));
end
% Then generate all panels
for i = 1:N
toolset_aout_panel(sprintf('output/run%d', i), 'Prefix', sprintf('run%d', i));
end
Pattern 3: Re-generate panels only (plots already exist)#
% No need to re-run toolset - just regenerate panels
toolset_aout_panel('output/test1', 'Prefix', 'aout');
toolset_dout_panel('output/test2', 'Prefix', 'dout');
Error Handling#
Current Behavior#
Both toolsets use fail-fast error handling:
Execution stops on first error
MATLAB displays error message
Partial results may be saved
Implementing Fail-Safe Execution#
To continue execution after errors, wrap tools in try-catch:
for i = 1:length(tools)
try
% ... tool execution
success(i) = true;
catch ME
fprintf(' ✗ %s\n', ME.message);
errors{end+1} = sprintf('Tool %d: %s', i, ME.message);
success(i) = false;
end
end
Future Enhancements#
Planned Features#
Python panel functions: Implement
toolset_aout_panelandtoolset_dout_panelin PythonParallel execution: Run independent tools in parallel using
parforProgress callbacks: Optional callback function for progress updates
Custom tool selection: Allow users to specify which tools to run
Fail-safe mode: Option to continue execution after errors
Architectural Improvements#
Tool registry: Central registry of all available tools
Plugin system: Easy addition of custom tools
Configuration files: YAML/JSON config for tool parameters
Result caching: Cache expensive computations for reuse
References#
IEEE Std 1241-2010: Standard for ADC Test Methods
IEEE Std 1057-2017: Standard for Digitizing Waveform Recorders
MATLAB documentation: Function handles, struct arrays, exportgraphics
Version History#
Version |
Date |
Changes |
|---|---|---|
2.0 |
2025-12-03 |
Streamlined toolsets with data-driven execution, separated panel functions |
1.0 |
2025-01-28 |
Initial implementation |