matlab-analyze-ams-waveform
This Claude Code skill analyzes analog and mixed-signal waveform data using MATLAB's Mixed-Signal Blockset utilities. Use it to measure phase noise, clock jitter, timing parameters (rise/fall time, duty cycle), INL/DNL for ADC/DAC characterization, resample non-uniform simulation data to uniform grids, and import HSpice simulation files. It is designed for processing time-domain voltage outputs from PLL/VCO/clock simulations and variable-step solver results.
git clone --depth 1 https://github.com/matlab/matlab-agentic-toolkit /tmp/matlab-analyze-ams-waveform && cp -r /tmp/matlab-analyze-ams-waveform/skills-catalog/rf-and-mixed-signal/matlab-analyze-ams-waveform ~/.claude/skills/matlab-analyze-ams-waveformSKILL.md
# Analyze AMS Waveforms — Mixed-Signal Blockset Utilities
Analyze waveform data using `msblksutilities` functions from the
Mixed-Signal Blockset. Covers timing, phase noise, jitter, lock time,
resampling, INL/DNL, ADC/DAC calibration, and HSpice data import.
## When to Use
- Measuring phase noise from time-domain VCO/PLL simulation output
- Computing period jitter or cycle-to-cycle jitter from clock signals
- Resampling non-uniform (variable-step solver) data to a uniform grid
- Measuring rise/fall time, duty cycle from digital waveforms
- Computing INL/DNL for ADC/DAC characterization
- Importing HSpice simulation results (.tr0, .ac0, .sw0)
- Converting a phase noise profile to integrated RMS jitter
## When NOT to Use
- Spectral analysis with Signal Processing Toolbox (FFT, PSD, spectrogram) — use SPT directly
- Signal quality metrics (SNR, SINAD, THD, SFDR) — use SPT functions (`snr`, `thd`, `sfdr`, `sinad`) directly
- Filtering or envelope detection — use Signal Processing Toolbox directly
- Uniformly-sampled data that doesn't need anti-aliased resampling
---
## Workflow Directive: Phase Noise Parameter Gathering
When the user asks to measure phase noise from waveform data, **ask for frequency
offset points before proceeding**:
1. **Ask:** "At which frequency offsets would you like to measure phase noise?
Default: `[10e3, 100e3, 1e6, 10e6]` Hz — press Enter to use these or specify
your own."
2. Once offsets are confirmed, **propose RBW** based on the lowest offset:
`RBW = min(offsets) / 2` (e.g., 5 kHz for 10 kHz lowest offset). State:
"I'll use RBW = X Hz (lowest offset / 2). Let me know if you'd like a
different value."
3. Proceed with measurement unless the user overrides.
This ensures the measurement matches the user's application without requiring
them to know the API signature upfront.
---
## Phase 1: Ingest Waveform Data
### 1.1 Determine Data Source
```matlab
% From workspace variables
x = t; y = v;
% From .mat file
data = load('waveform.mat');
x = data.time; y = data.voltage;
% From .csv
data = readmatrix('waveform.csv');
x = data(:,1); y = data(:,2);
% From HSpice transient (.tr0)
tr0Reader('sim.tr0', 'output.mat');
data = load('output.mat');
% From HSpice AC (.ac0)
ac0Reader('sim.ac0', 'output.mat');
% From HSpice DC sweep (.sw0)
sw0Reader('sim.sw0', 'output.mat');
% From Simulink simulation output (timeseries in logsout)
sig = simOut.logsout.get('signalName').Values;
x = sig.Time(:); % column vector
y = squeeze(sig.Data(:)); % column vector — squeeze removes trailing dims
```
### 1.2 Basic Waveform Summary
Always print a summary before analysis:
```matlab
fprintf('=== Waveform Summary ===\n');
fprintf('Points : %d\n', numel(x));
fprintf('X range : [%.6g, %.6g]\n', min(x), max(x));
fprintf('Y range : [%.6g, %.6g]\n', min(y), max(y));
fprintf('Y mean : %.6g\n', mean(y));
fprintf('Y RMS : %.6g\n', rms(y));
if all(diff(x) > 0)
dx = diff(x);
if max(dx)/min(dx) < 1.01, uStr = 'yes'; else, uStr = 'no'; end
fprintf('X step : %.6g (uniform: %s)\n', median(dx), uStr);
if median(dx) > 0
fprintf('Sample rate: %.6g Hz\n', 1/median(dx));
end
end
```
### 1.3 MSB Analysis Menu
```
Available MSB analyses for time-domain waveform:
--- Timing Measurements ---
[1] Rise time — timeDomainSignal2RiseTime
[2] Fall time — timeDomainSignal2FallTime
[3] Duty cycle — timeDomainSignal2DutyCycle
--- Clock / PLL Measurements ---
[4] Phase noise from frequency-domain data — phaseNoiseMeasure (default Type='Frequency')
[5] Phase noise from time-domain voltage — phaseNoiseMeasure (Type='Time')
[6] Period jitter & cycle-to-cycle jitter — clockJitterMeasure
[7] Phase noise to jitter conversion — phaseNoiseToJitter
[8] Lock time from control voltage — lockTimeMeasure
--- Resampling ---
[9] Anti-aliased resampling — lowpassResample
--- ADC/DAC Characterization ---
[10] INL / DNL measurement — inldnl
[11] ADC calibration — calibrateADC
[12] DAC calibration — calibrateDAC
--- Data Import ---
[13] HSpice transient (.tr0) — tr0Reader
[14] HSpice AC (.ac0) — ac0Reader
[15] HSpice DC sweep (.sw0) — sw0Reader
--- Frequency-Domain Utilities ---
[16] Interpolate/extrapolate to new grid — interpExtrap
[17] Laplace to biquad SOS — laplace2sos
```
---
## Phase 2: Execute Analysis
### 2.1 Timing Measurements
```matlab
% Rise time — 3rd arg is [low high] percent reference levels (required)
rt = timeDomainSignal2RiseTime(x, y, [10 90]);
fprintf('Rise time (10%%-90%%): mean = %.4g s (std = %.4g s, N=%d)\n', ...
mean(rt), std(rt), numel(rt));
% Fall time — same 3-arg signature
ft = timeDomainSignal2FallTime(x, y, [10 90]);
fprintf('Fall time (90%%-10%%): mean = %.4g s (std = %.4g s, N=%d)\n', ...
mean(ft), std(ft), numel(ft));
% Duty cycle — returns per-cycle values for multi-cycle waveforms
dc = timeDomainSignal2DutyCycle(x, y);
fprintf('Duty cycle: mean = %.4f%%, std = %.4f%%\n', mean(dc)*100, std(dc)*100);
```
### 2.2 Phase Noise Measurement
**Pre-check (mandatory):** Verify simulation duration before measuring.
```matlab
% Sim duration pre-check — STOP if insufficient
minDuration = 10 / min(FrOffset); % need >= 10 cycles of lowest offset
simDuration = x(end) - x(1);
if simDuration < minDuration
error('Simulation too short: %.4g s < %.4g s needed for %.0f Hz offset.\nIncrease sim stop time to >= %.4g s.', ...
simDuration, minDuration, min(FrOffset), minDuration);
end
```
```matlab
% From time-domain voltage waveform (MSB variable-step simulation output)
% Type='Time' is REQUIRED — extracts phase via zero-crossings internally
Rbw = 1e3; % resolution bandwidth (Hz)
FrOffset = [10e3 100e3 1e6 10e6]; % offsets to measure
[PnAtOffsets, freqAxis, pnProfile] = phaseNoiseMeasure( ...
x(:), y(:), Rbw, FrOffset, 'on', 'PN Measurement', ...
-inf, ... % 7th arg: target PN level for plot>
Import recorded driving sensor data (GPS, camera, lidar, actor tracks, lanes) into scenariobuilder.* objects (GPSData, CameraData, LidarData, ActorTrackData, Trajectory, laneData) and run preprocessing — synchronize, offset correction, crop, normalizeTimestamps, convertTimestamps. Also: compute actor tracks from lidar when no annotations exist, attach camera/lidar mounting + intrinsics, export to MAT/workspace/timetable/script. Use for raw driving dataset files (KITTI, nuScenes, Waymo, Pandaset, ROS/ROS2 bags, .mat, .csv, .mp4) or driving/vehicle/sensor logs that need wrapping. drivingLogAnalyzer (DLA) is OPT-IN ONLY — invoke only on explicit user request ('DLA', 'open in DLA', 'inspect/explore/analyze the recording') or reported sensor problem (sync drift, timestamp mismatch, overlay misalignment). NEVER auto-launch DLA after wrapping (Rule 0). For 'build scenario / export to RoadRunner / drivingScenario / OpenSCENARIO / Unreal / simulate', hand off to matlab-scenario-builder.
Generate driving scenes, scenarios, road surfaces, and 3D content from already-wrapped scenariobuilder.* sensor data (GPS, camera, lidar, actor tracks) using Scenario Builder for Automated Driving Toolbox. Use to BUILD, EXPORT, or AUGMENT a virtual scenario/scene/map: ego or actor trajectories, trajectory smoothing, OpenCRG road-surface extraction, 3D asset generation, static-object placement, point-cloud georeferencing + elevation, lane-based ego localization, sensor-fusion tracking, scenario-event extraction (cut-ins, hard brakes, near-misses, ADAS disengagements), or export to RoadRunner, drivingScenario, OpenDRIVE, OpenCRG, OpenSCENARIO, or Unreal Engine. Also: log-to-scenario, scenario harvesting, accident/near-miss reconstruction, SOTIF (ISO 21448) and ISO 26262 scenario coverage, USGS-aerial-lidar scene augmentation, traffic-sign placement from camera+lidar logs. NOT for raw-data import or multi-sensor sync/crop/offset/timestamp normalization — route those to matlab-driving-data-importer.
>
>
>
>
Build, modify, and diagram SimBiology models — API reference, helper functions, and layout patterns. Use when constructing or editing models programmatically or visually.