Python library for RF and SDR prototyping. Provides reusable methods for RF measurements, communication systems, radar, antenna arrays, and related signal processing tasks. The library supports both floating-point and fixed-point arithmetic for modeling hardware implementations (FPGA/ASIC).
The library is organized into focused modules for different aspects of RF/SDR signal processing:
nco.py: Numerically Controlled Oscillator (NCO) with both floating-point and fixed-point support, including frequency-to-FCW conversion and Taylor series approximations for sine/cosine generationfilter.py: Filter design including Raised Cosine, Root Raised Cosine, and polyphase filteringmultirate.py: Multirate signal processing (interpolation, decimation, rational resampling with polyphase filters)sig_gen.py: Signal generation utilities for test waveforms and modulated signalsmodulation.py: Modulation/demodulation schemes for digital communications
measurements.py: Signal quality metrics (EVM, PSD, SFDR, SNR, and spectral analysis)plot.py: Visualization utilities (time-domain, frequency-domain, constellation diagrams, eye diagrams)impairments.py: Channel impairment modeling (noise, phase offset, timing errors)
fxp_int.py: Fixed-point integer class modeling hardware bit-width constraints with overflow/wrapping behaviorutils.py: Fixed-point/floating-point conversion, binary representation, rounding methods, and dB/magnitude conversions
agc_magest.py: Automatic Gain Control (AGC) using magnitude estimationpi_filter.py: Proportional-Integral filter implementationssignal.py: Basic signal operations and transformationsfrequency.py: Frequency-related utilities and conversions
A key feature of rfproto is dual floating-point and fixed-point implementations for hardware prototyping:
fxp_intclass: Models fixed bit-width integers with 2's complement overflow/wrapping behavior- Conversion utilities:
dbl_to_fxp()/fxp_to_dbl()for converting between representations - Rounding operations:
fxp_round_halfup()/fxp_truncate()for proper fixed-point arithmetic - Q-format notation: Uses standard Q-format (e.g., Q0.15 for 16-bit signed with 15 fractional bits)
- Switchable implementations: Some modules like
nco.pyhaveuse_fxpflags to toggle between floating-point and fixed-point
- Normalized filters: Filter functions return normalized coefficients (sum to 1.0 for unity passband gain)
- Rational resampling: Use
multirate.get_rational_resampling_factors()for optimal interpolation/decimation ratios - Type hints: All functions include type hints for parameters and return values
- Doctests: Inline documentation examples that serve as both docs and tests
- Install editable local version (preferably within a venv) with all optional packages for testing with
$ pip install --upgrade -e .[docs,test](add--userif not invenv). - Install pre-commit checks with
$ ln -sf ../../scripts/pre-commit ./.git/hooks/pre-commit - Trigger GitHub action to publish to PyPI with a tagged commit (e.x.
git tag -am "test auto versioning" 0.0.2) onmainbranch. Note versioning is also inferred from the git tag value, and this will only run on push on tag.
Run test suite with $ ./scripts/run-tests.sh
Additional testing options:
# Run tests with plots displayed (default suppresses plots)
./scripts/run-tests.sh --show_plots
# Run specific test file
pytest tests/test_filter.py
# Run with coverage report
pytest --doctest-modules --cov-report=term-missing:skip-covered --cov=rfproto/ tests/
# Run mypy static type checking
mypy rfproto/The test suite includes:
- pytest with doctest support for inline documentation examples
- Tests in both
tests/directory and doctests embedded in module docstrings - Coverage reporting via pytest-cov
- Full mypy type checking (enforced in CI)
- Pre-commit hook that runs full test suite and auto-generates TODO.md
Documentation uses mkdocs-material, preview with $ mkdocs serve -a localhost:8888. Publishes with GitHub action as well.
The project uses black for code formatting. The pre-commit hook automatically runs the full test suite (including formatting checks) before commits are allowed.
See auto-generated TODO.md.
- Look at https://github.com/veeresht/CommPy since its unmaintained
- Filtering/convolution kernels like https://joht.github.io/johtizen/algorithm/2022/10/22/a-different-approach-to-convolution.html and https://dsp.stackexchange.com/questions/15412/fir-filters-direct-form-transposed-fir