Skip to main content

mmwcore

mmwcore is a standalone library for lossless mmWave ADC compression/decompression, deterministic radar signal processing, and classical tracking through Rust-backed Python APIs. Use it to turn completed raw captures or in-memory ADC frames into radar tensors and point clouds with explicit geometry, axes, and units.

The maintained hardware contract is TI IWR6843 ES2 with DCA1000. Generic numerical kernels can be composed with explicit specifications; other radar devices are not validated by this repository. Acquisition, model training, stream management, and visualization belong to the applications calling mmwcore.

Version and installation

The current Python release is 0.8.0. See the migration notes before upgrading from 0.7.1.

Install with CPython 3.12 on Windows x86-64 or Linux x86-64:

python -m pip install "mmwcore==0.8.0"

For current development, install from source with CPython 3.12 and Rust 1.97:

git clone https://github.com/AIoT-Laboratory/mmwcore.git
cd mmwcore
uv sync --python 3.12 --extra dev --locked

Source installation needs the platform's Rust linker/build tools. Current CI validates Linux and Windows; macOS is not covered by the current CI matrix. Numerical kernels and the built-in TI tracker require no TI SDK or external GTRACK library.

Quick start

This synthetic example runs without hardware or recorded data:

import numpy as np

from mmwcore.core import ADCDecodeSpec, ADCFrameSpec, RangeDopplerPipeline
from mmwcore.dsp import range_doppler

adc = ADCFrameSpec(num_chirps=2, num_rx=1, num_samples=8)
raw = np.zeros(adc.raw_values_per_frame, dtype=np.int16)
cube = range_doppler(raw, RangeDopplerPipeline(decode=ADCDecodeSpec(adc)))
print(cube.axes, cube.data.shape)

For real captures, specify the actual ADC layout, TDM order, waveform, and antenna geometry. See file examples, architecture, ADC compression, and tracking.

Library scope

raw ADC files -> compression/decompression -> frame readers -> radar DSP
in-memory ADC frames -> radar DSP -> tensors / point clouds -> tracking

Public APIs, examples, tests, and benchmarks can be used from this repository alone. Callers supply raw ADC files, capture specifications, or in-memory frames. Acquisition, buffering, model training, and visualization are application responsibilities.

ADC files and capture packages

ADC storage uses explicit lossless compression/decompression APIs:

from mmwcore.io import compress_adc_file, decompress_adc_file

# capture is the RadarCaptureSpec describing the complete raw ADC file.
compressed = compress_adc_file("adc.bin", "radar.mmwa", capture)
raw_frames = compressed.decompress_frames(0, 4)
restored_capture = decompress_adc_file("radar.mmwa", "restored.bin")

The standardized format carries frame geometry and the decoding contract; it preserves raw ADC bytes exactly. See file and frame-group APIs. Take packaging below adds the capture/setup/context contract around that compressed ADC file.

The optional take API packages a completed mmwcli.take.v3 capture with verified setup and context metadata:

from pathlib import Path

from mmwcore.io import read_capture, write_take

capture = read_capture("dataset/takes/subject/scene/action/take-001.capture")
context = Path("context.json").read_bytes()
take = write_take(capture, "dataset/takes/dataset/scenario/c01/take-001", context=context)

The published v4 take contains session.json, hashed context.json, the byte-exact immutable setup.json, radar.cfg, and radar.mmwa, plus camera.mjpeg and camera.index.bin when a camera participated. Mount height and boresight pitch come only from the setup snapshot. The contract accepts downward pitch 0, 30, or 90 degrees. DSP recipes use explicit sensor-to-level geometry. Open the verified take for frame processing:

from mmwcore.io import open_take

take = open_take("dataset/takes/dataset/scenario/c01/take-001")
frames = take.archive.decompress_frames(0, 4)

The .mmwa archive stores exact ADC bytes, frame geometry, capture specification, index, and digests. Use verify_all() when a complete integrity check is required before processing.

DSP composition lives in mmwcore.dsp: ADC decoding, range/Doppler processing, TDM virtual-array mapping, Cartesian projection, and bounded sparsification. Applications choose processing windows and consume the resulting tensors, point clouds, or tracks.

An opt-in native ISK dynamic Capon frontend provides the complete default RA-Capon/CFAR/elevation/weighted-Doppler chain from ADC. It retains stage diagnostics and source-specific behavior without changing the existing RPC pipeline; host arithmetic is not TI DSP bit emulation.

Tracking and benchmarks

TiGTrack3D implements the pinned IWR6843 TI 3DA nine-state tracker in Rust. Normal installations need no TI SDK, C compiler or GTRACK DLL. Association, allocation, update, lifecycle and static support run inside mmwcore's native extension. This component retains TI's TI-device-only license, included in source and wheels; other mmwcore code remains Apache-2.0. See API and validation.

The other maintained backend is ScatterBodyTracker in mmwcore.tracking.multiscale, backed by crates/mmwcore/src/tracking/multiscale: multiscale clustering, scatter-component histories, causal bulk-motion estimation, split-origin body hypotheses, and separate component/body limits. Its ablation components remain available for comparison and subsequent improvements against complete TI GTRACK. Both backends are exported from mmwcore.tracking.

The simplified GTrack2D/six-state GTrack3D, PointTracker2D, ClusterTracker2D, their configuration adapters, ADC runners and dedicated 2D vector benchmark have been removed. There are no compatibility aliases or legacy backend switch. Shared DBSCAN, assignment, geometry, TrackFrame and comparison metrics remain; metric regions use boundary_boxes directly instead of the retired ScenerySpec.

benchmarks/pipeline.py is the performance and regression gate for the fixed IWR6843 workload. It uses deterministic synthetic ADC and requires no hardware or private data. See benchmarking.

Package map

  • mmwcore.io: standardized ADC compression/decompression, frame readers, captures, and takes.
  • mmwcore.config: IWR6843 capture parsing and processing presets.
  • mmwcore.core: explicit array, geometry, DSP, and tracking contracts.
  • mmwcore.dsp: deterministic radar processing and neural-input primitives.
  • mmwcore.tracking: classical tracking baselines and metrics.
  • crates/mmwcore: Rust ADC compression/decompression, DSP, and tracking kernels.
  • crates/mmwcore/src/tracking/multiscale: independent Rust tracking backend.
  • crates/mmwcore-ti-gtrack: TI GTRACK backend with its separate license.

Validation

cargo fmt --all --check
cargo clippy --workspace --all-targets --locked -- -D warnings
cargo test --workspace --locked
uv run --python 3.12 ruff format --check python tests benchmarks examples tools
uv run --python 3.12 ruff check --no-cache python tests benchmarks examples tools
uv run --python 3.12 pyright
uv run --python 3.12 python -m pytest -p no:cacheprovider -q
uv run --python 3.12 python benchmarks/pipeline.py --warmups 0 --samples 1 --stream-frames 2

These checks are local and do not access radar hardware.

CI also builds a source distribution and compiles the wheel from that archive on Windows and Linux. It installs the wheel into a clean environment outside the checkout and runs tests/distribution_smoke.py with python -I. The check verifies installed import paths, license files, type stubs, FFT, ADC compression/decompression round trips and both tracking backends. The source distribution includes the frozen TI oracle fixture; CI extracts the archive and runs its Rust tests independently as well. The same check can be run locally:

uv run --no-sync maturin build --release --locked --sdist --interpreter python --out dist
uv run --no-sync python tools/check_distribution.py dist

Use an output directory containing exactly one wheel and one source distribution.

Contributing and licensing

Bug reports and focused contributions are welcome. Include a minimal reproduction, array contracts, and platform/version information; synthetic data is sufficient for most numerical issues. See contribution guidelines and the release process.

Current Python distributions include Apache-2.0 code and the TI-device-only GTRACK component; their metadata declares Apache-2.0 AND LicenseRef-TI-GTRACK. See LICENSE, NOTICE, and TI-LICENSE.txt. The standalone crates/mmwcore Rust crate is Apache-2.0 and does not depend on the TI tracking crate.

Metadata

Release files for mmwcore 0.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mmwcore 0.8.0
File Size Uploaded
mmwcore-0.8.0.tar.gz 266.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for mmwcore 0.8.0
File Interpreter ABI Platform
mmwcore-0.8.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
mmwcore-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details

Total release size: 3.3 MB

Release files / mmwcore-0.8.0.tar.gz

Download URL mmwcore-0.8.0.tar.gz
Size 266.2 kB
Tags Source
SHA-256 checksum
How to use checksums
b8d9edb035132a25066f65914a3a7b6548d33b11b0bd494b97c9cfe604f64632
BLAKE2b-256 checksum
How to use checksums
f84b16bbdf02a2d326d1e2389cfe338927096b1ae2accaeabd2dcd3e5551defb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.

Transparency log

Release files / mmwcore-0.8.0-cp312-cp312-win_amd64.whl

Download URL mmwcore-0.8.0-cp312-cp312-win_amd64.whl
Size 1.4 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
dbda13a931a8dbe888d2d6229cc7f43e04cb87624b7dfd47c9d29f31c798d065
BLAKE2b-256 checksum
How to use checksums
3a4e3cf4b9c85db63dc918a34887dca9bb9f704c4131fac0aa6b220c1e2858c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.

Transparency log

Release files / mmwcore-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL mmwcore-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.6 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
4b77a270e92e900a38db59c60d587af0226484799ec30d54e144461a74521dd3
BLAKE2b-256 checksum
How to use checksums
7b0a4a42ff7431c4d7f3e1c9a575ca74d03a6ece3c87859d476bd7b30d6755c3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.8.0 This release

3 release files

0.7.1

10 release files

0.7.0

10 release files

0.6.0

10 release files

0.5.1

10 release files

0.5.0

10 release files

0.4.0

10 release files

0.2.2

4 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page