Skip to content

Release history

WfmOxide a Rust parser (.wfm/.isf) with CLI and time axis releases

All releases

5 shown

No immediate action
v0.4.1 Maintenance

Routine maintenance and dependency updates.

No immediate action
v0.4.0 Breaking risk

Siglent/LeCroy/Rohde formats + fast small‑capture decode

v0.3.0 New feature
Notable features
  • 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-oxide CLI with info and convert subcommands, 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 --json flag on info for machine-readable summaries.

Features

  • WfmFile::time_axis() and Python x_origin / x_increment / sample_rate / get_time_axis() helpers; origins use the centered-trigger convention.
  • WfmFile::channel_metadata() and Python channel_metadata(channel) helper covering every supported family.
  • enabled_channels, extract_channel, extract_all_channels re-exported on the library so the CLI shares the Python code path.
  • wfm-oxide convert writes 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-time flags.
  • Batch conversion: wfm-oxide convert accepts multiple input paths and writes to a directory via --out-dir.
  • wfm-oxide info prints 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_npy now always emits little-endian f32 samples regardless of host byte order, matching the '<f4' dtype string on big-endian hosts.
  • model_number / firmware_version strings now terminate at the first NUL byte (fixes trailing garbage on some DS2000/DS4000 captures).
  • DHO time fields upgraded from f32 to f64 to preserve precision on deep-memory captures.
  • info reads 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 / SampleType machinery.
  • Added PyPI / License / CI badges.

Full changelog: https://github.com//WfmOxide/compare/v0.2.0...v0.3.0

v0.2.0 New feature
Notable features
  • 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.

v0.1.0 New feature
Notable 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:

  1. Memory-Mapped I/O: Utilizes memmap2 to project the binary payload directly into virtual memory, bypassing standard file I/O buffering.
  2. Thread-Level Parallelism: Employs the rayon crate to parallelize multi-channel extraction. The Python Global Interpreter Lock (GIL) is explicitly released during this phase to ensure true multi-core utilization.
  3. Zero-Copy Memory Handover: Passes the raw Rust memory buffer directly to the Python runtime as a contiguous float32 NumPy 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 struct unpacking).
  • 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

Beta — feedback welcome: [email protected]