Release history
WfmOxide a Rust parser (.wfm/.isf) with CLI and time axis releases
All releases
5 shown
Siglent/LeCroy/Rohde formats + fast small‑capture decode
- New `wfm-oxide` CLI with `info` and `convert` subcommands in a separate Cargo workspace crate
- Rigol DHO800/DHO1000 support including zlib-compressed blocks, per-channel voltage calibration, and typed-sample abstraction for future variable-bit-depth ADCs
- Time axis exposed via Python API helpers (`x_origin`, `x_increment`, `sample_rate`, `get_time_axis`) and as a leading column in CSV/NPY exports across multiple oscilloscope families
Full changelog
Highlights
- New
wfm-oxideCLI withinfoandconvertsubcommands, packaged as a sibling crate in a new Cargo workspace so CLI dependencies don't leak into the Python wheel. - Rigol DHO800 / DHO1000 support, including zlib-compressed blocks, per-channel voltage calibration, and a typed-sample abstraction that paves the way for variable-bit-depth ADCs.
- Time axis exposed across DS1000Z, DS2000, DS4000, DHO800/1000, and Tektronix ISF — both in the Python API and as a leading column in CSV/NPY exports.
- Per-channel metadata (vertical scale/offset, coupling, probe ratio, inverted) accessible from Python and the CLI, plus a
--jsonflag oninfofor machine-readable summaries.
Features
WfmFile::time_axis()and Pythonx_origin/x_increment/sample_rate/get_time_axis()helpers; origins use the centered-trigger convention.WfmFile::channel_metadata()and Pythonchannel_metadata(channel)helper covering every supported family.enabled_channels,extract_channel,extract_all_channelsre-exported on the library so the CLI shares the Python code path.wfm-oxide convertwrites CSV (one column per enabled channel) or NPY (1-D for one channel, 2-D / structured dtype for all channels), with--start,--length,--channel,--format, and--no-timeflags.- Batch conversion:
wfm-oxide convertaccepts multiple input paths and writes to a directory via--out-dir. wfm-oxide infoprints sample rate, capture duration, time origin, and per-channel coupling / probe attenuation.- Hard four-channel cap lifted in the Python API; per-format channel validation retained.
Fixes
write_npynow always emits little-endianf32samples regardless of host byte order, matching the'<f4'dtype string on big-endian hosts.model_number/firmware_versionstrings now terminate at the first NUL byte (fixes trailing garbage on some DS2000/DS4000 captures).- DHO time fields upgraded from
f32tof64to preserve precision on deep-memory captures. inforeads channel sample count from the header instead of decoding the full waveform per channel.
Docs
- Support matrix updated for DHO800/DHO1000 and per-family time-axis / metadata availability.
- New CLI section, Repository Layout section, and updated Extending Device Support guide reflecting the workspace and
Affine/SampleTypemachinery. - Added PyPI / License / CI badges.
Full changelog: https://github.com//WfmOxide/compare/v0.2.0...v0.3.0
- Parsing support for Tektronix ISF formats and WFM#001 models (e.g., TDS 210)
- Support for Rigol DS4000 series oscilloscopes
- Slice arguments `start` and `length` added to `get_channel_data` and `get_all_channels`
Full changelog
Version 0.2.0
This release brings support for a few new oscilloscope models and adds some helpful new APIs for dealing with large captures.
New Features & Device Support:
Added parsing support for Tektronix ISF formats and WFM#001 models (like the TDS 210).
Added support for the Rigol DS4000 series.
You can now pass start and length arguments to get_channel_data and get_all_channels. This is useful for zero-copy extraction of smaller slices from massive waveform files.
Added an enabled_channels property so you can check which channels actually contain data before extracting them.
Other Updates:
Cleaned up some of the internal parser code by removing unused binary fields.
Updated the README with a simpler support matrix and proper pip install instructions.
Added some new, large test files and sample scripts to test the new slicing and Tektronix features.
- Zero-copy memory handover delivering raw Rust buffer as contiguous float32 NumPy array
- Memory-mapped I/O via memmap2 bypassing file buffering
- Thread-level parallelism using rayon for multi‑channel extraction
Full changelog
WfmOxide: Zero-Copy Parser for Oscilloscope Datasets
This release marks the initial public availability of WfmOxide (v0.1.0), a high-throughput backend for parsing proprietary oscilloscope binary files (e.g., Rigol .wfm, Tektronix). It is designed to replace pure-Python implementations in deep-memory data pipelines where execution latency and memory overhead are primary bottlenecks.
Architectural Overview
WfmOxide mitigates the standard overhead of Python interpreter execution and object allocation through three primary mechanisms:
- Memory-Mapped I/O: Utilizes
memmap2to project the binary payload directly into virtual memory, bypassing standard file I/O buffering. - Thread-Level Parallelism: Employs the
rayoncrate to parallelize multi-channel extraction. The Python Global Interpreter Lock (GIL) is explicitly released during this phase to ensure true multi-core utilization. - Zero-Copy Memory Handover: Passes the raw Rust memory buffer directly to the Python runtime as a contiguous
float32NumPy array, eliminating secondary data duplication.
Empirical Performance Characteristics
Testing Environment: Dual-core Intel Core i5-6300U, Arch Linux. Designed to establish a conservative baseline on resource-constrained hardware.
- Metadata Parsing: Executes in ~90µs (a multi-order-of-magnitude reduction compared to standard Python
structunpacking). - End-to-End Extraction: Parsing a 12.0 MB / 3.0 M point payload completes in 53.5 ms, representing a 7.0x latency reduction relative to the reference Python implementation.
Installation
The package is distributed as pre-compiled wheels via PyPI, requiring no localized Rust toolchain for the end-user:
pip install wfm-oxide