Also known as: SigMF, Signal Metadata Format
SigMF (the Signal Metadata Format) is an open standard that stores a raw IQ recording alongside a small JSON file describing everything a decoder needs to interpret it — the sample format, sample rate, centre frequency, and time-stamped annotations.1 It solves the oldest problem in SDR file exchange: a bare IQ file is just a wall of numbers, and without out-of-band notes you cannot even tell whether it is 8-bit unsigned or 32-bit float, let alone what was on the air.
How it works
A SigMF recording is a pair of files sharing a base name. The .sigmf-data file holds the
raw interleaved samples — no header, no framing, just the bytes — exactly like a
GNU Radio cfile. The .sigmf-meta file is JSON with three parts:
global— properties that hold for the whole file:core:datatype(e.g.cf32_lefor complex little-endian float32,cu8for 8-bit unsigned,ci16_lefor 16-bit signed),core:sample_rate, hardware description, author, and SHA-512 hash of the data file.captures— an array of segments, each marking acore:sample_startindex and the RFcore:frequencyand wall-clock time in effect from that sample onward. Retuning mid-file produces a new capture entry rather than a new file.annotations— an array of labelled regions, each spanning a sample range and optional frequency band, carrying a free-formcore:labeland application-specific keys. This is where a bursting signal, a detected emitter, or a training-set class is marked.
The datatype string is the crucial field: it names the element type, real-vs-complex, bit width,
byte order and any offset, so the reader knows precisely how to parse the accompanying data file.
Optional namespaced extensions (antenna:, signal:, capture_details:) add domain fields
without polluting the core schema, and the whole thing can be bundled into a single .sigmf
tarball archive for transport.
Relevance to SDR
SigMF has become the lingua franca for sharing IQ captures across tools that would otherwise disagree on format. GNU Radio, Inspectrum, IQEngine, and numerous machine-learning pipelines read and write it, and it grew out of a DARPA-sponsored effort to make RF datasets reproducible and self-describing. For automatic modulation classification and RF fingerprinting, the annotations array doubles as the label file: each burst carries its class inline, so a dataset is one directory rather than IQ plus a fragile external CSV.
GopherTrunk does not read SigMF natively — its offline replay path (gophertrunk replay) takes
bare captures via a -format flag, understanding u8 (rtl_sdr 8-bit), f32 (GNU Radio
cfile float32), and 16-bit PCM wav, with the sample rate and tune
offset supplied on the command line rather than read from a sidecar. Because a SigMF .sigmf-data
file is just one of those raw layouts, you can replay one by pointing GopherTrunk at the data
file and transcribing core:datatype, core:sample_rate, and core:frequency from the meta JSON
into the corresponding flags — the metadata SigMF standardises is exactly the set of parameters
GopherTrunk otherwise expects you to know. Adopting the SigMF sidecar convention when you record
captures for bug reports keeps them self-describing even though the replay tool reads the raw bytes
directly. SigMF’s conceptual cousin inside a live flowgraph is the
stream tag, which attaches the same kind of sample-indexed metadata to
a running stream rather than a file on disk.
Sources
-
SigMF specification — the official standard repository, defining the .sigmf-data / .sigmf-meta pair, the global/captures/annotations objects, and the datatype grammar. ↩