striqt is a set of open-source python packages for batched real-time signal analysis on CPU or GPU, and rapid prototyping of bespoke radio environment sensors.
🏃 Run a batched acquisition and analysis for measurement or calibration, given a path to a YAML input specification:
sensor-sweep [OPTIONS] YAML_PATH
# Selected options:
# -d, --debug if set, drop to IPython debug prompt on exception
# -v, --verbose verbosity (or -vv, or -vvv)📈 Plot the data variables in captures contained in one sweep of a zarr archive, given a YAML plotting configuration specification:
plot-capture [OPTIONS] ZARR_PATH YAML_PATH
# Selected options:
# -i, --interactive
# --no-save don't save the resulting plotsMore detailed usage instructions for these tools can be discovered with the --help flag.
The API is organized into python packages:
Provides optimized and validated real-time signal analysis of complex-valued IQ baseband:
- Power spectral density and spectrogram evaluation
- Power detectors in various time-domain representation
- Empirical statistical distributions
- Cellular cyclic prefix and synchronization correlators
- Extensible with custom analyses based on custom
Interoperability within the modern python data ecosystem:
- Interchangable across CPU (numpy) and GPU (cupy) based on full-precision (32-bit) floating point
- Fast
numbanumerical kernels for speed and portability across operating systems - Package as multi-dimensional
xarray.Datasetobjects- Detailed coordinates, units, and metadata across all axes
- Load and save
zarrdataset archive format for easy aggregation and dissemination local or cloud storage
Implements batch IQ data acquisition and resampling oriented toward test and measurement
- Input power level calibration based on the Y-factor technique
- Support for exact rational Fourier resampling on CPU/GPU
- Multi-threaded acquisition, analysis, and archival to maximize throughput
- Software-defined radio interoperability via
SoapySDR - Acquisition and analysis input specification schema (and yaml input decode support)
Implements visualization for the data variables produced by striqt.analysis
- Provides a plot function for each type of data variable
- Uses the labeled coordinates and metadata to display proper units
- Generates plots in
matplotlibfor publication-ready in selectable output formats
The following assume access to the open internet.
Installation with radio hardware and GPU support is provided via conda environments. Several variants of a striqt environment are provided here, targeted at different host computing environments.
- Ensure that
condais installed (ormamba/micromambasubstituted in what follows) - Clone this repository
- Download a predefined environment based on needed capabilities:
cpu.yml: acquire radio data, perform CPU-only IQ signal analysis, load/savezarrarchives, and plot datagpu-cpu.yml: support the above, and analyze IQ on CUDA GPUs
- Create the chosen environment:
conda env create -f [path-to-environment-here.yml]
- To activate the environment, select the
striqtconda environment in your IDE, or runconda activate striqt
A limited environment that supports the latest APIs and CLIs for post-analysis, plotting, testing, etc. can be installed via the python package index (pypi):
pip install "striqt @ git+https://github.com/usnistgov/striqt"It is encouraged to use a lockfile (through pipenv, uv, pixi, etc. in lieu of pip above) to enforce a fully reproducable install.
NOTE: In order to create an environment that is reproducible environment and to isolate the install from dependency versioning conflicts, it is highly recommended to install `striqt`` into a container or virtual environment.
NOTE:
SoapySDRis required to to acquire radio captures, but it is not distributed onpypi
striqt is in early beta. The pace of change has slowed
- The API in the base of each module is expected not to change, but internals (
.lib, etc.) may change without warning - Incompatible changes to yaml schemas in
striqt.sensorandstriqt.figure(and the CLIs) may still change slightly - The data variable, coordinate, and metadata field names in
.zarrfiles follow the names in the yaml schemas
In keeping with the early beta development status of this codebase, documentation is limited.