Skip to main content

Python for RF and SDR prototyping.

Project description

rfproto

CI Pipeline PyPI - Version PyPI - License Code style: black

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).

Features & Modules

The library is organized into focused modules for different aspects of RF/SDR signal processing:

Core 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 generation
  • filter.py: Filter design including Raised Cosine, Root Raised Cosine, and polyphase filtering
  • multirate.py: Multirate signal processing (interpolation, decimation, rational resampling with polyphase filters)
  • sig_gen.py: Signal generation utilities for test waveforms and modulated signals
  • modulation.py: Modulation/demodulation schemes for digital communications

Measurements & Analysis

  • 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)

Fixed-Point Arithmetic

  • fxp_int.py: Fixed-point integer class modeling hardware bit-width constraints with overflow/wrapping behavior
  • utils.py: Fixed-point/floating-point conversion, binary representation, rounding methods, and dB/magnitude conversions

Control & Processing

  • agc_magest.py: Automatic Gain Control (AGC) using magnitude estimation
  • pi_filter.py: Proportional-Integral filter implementations
  • signal.py: Basic signal operations and transformations
  • frequency.py: Frequency-related utilities and conversions

Architecture

Fixed-Point Arithmetic Support

A key feature of rfproto is dual floating-point and fixed-point implementations for hardware prototyping:

  1. fxp_int class: Models fixed bit-width integers with 2's complement overflow/wrapping behavior
  2. Conversion utilities: dbl_to_fxp() / fxp_to_dbl() for converting between representations
  3. Rounding operations: fxp_round_halfup() / fxp_truncate() for proper fixed-point arithmetic
  4. Q-format notation: Uses standard Q-format (e.g., Q0.15 for 16-bit signed with 15 fractional bits)
  5. Switchable implementations: Some modules like nco.py have use_fxp flags to toggle between floating-point and fixed-point

Design Patterns

  • 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

Developing

Building & CI

  • Install editable local version (preferably within a venv) with all optional packages for testing with $ pip install --upgrade -e .[docs,test] (add --user if not in venv).
  • 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) on main branch. Note versioning is also inferred from the git tag value, and this will only run on push on tag.

Testing

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

Documentation uses mkdocs-material, preview with $ mkdocs serve -a localhost:8888. Publishes with GitHub action as well.

Code Formatting

The project uses black for code formatting. The pre-commit hook automatically runs the full test suite (including formatting checks) before commits are allowed.

TODO

See auto-generated TODO.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rfproto-0.0.19.tar.gz (33.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rfproto-0.0.19-py3-none-any.whl (33.5 kB view details)

Uploaded Python 3

File details

Details for the file rfproto-0.0.19.tar.gz.

File metadata

  • Download URL: rfproto-0.0.19.tar.gz
  • Upload date:
  • Size: 33.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rfproto-0.0.19.tar.gz
Algorithm Hash digest
SHA256 45edc168c09d466e58ae6ea2459d7d75dd3d97bf907f27c5b19ec75f81ca978f
MD5 e1c031f9ea0b77b2f357abe0b333a998
BLAKE2b-256 54ac7cb188f323c87e1ff6f13577401592e943baabf0273b414aba707ba7aed9

See more details on using hashes here.

Provenance

The following attestation bundles were made for rfproto-0.0.19.tar.gz:

Publisher: publish-to-pypi.yml on JohnnyGOX17/rfproto

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rfproto-0.0.19-py3-none-any.whl.

File metadata

  • Download URL: rfproto-0.0.19-py3-none-any.whl
  • Upload date:
  • Size: 33.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rfproto-0.0.19-py3-none-any.whl
Algorithm Hash digest
SHA256 4b8a70bd15d5c279a2a2e3ad903b97a209bd53056c121a381ea798827d58465f
MD5 9494a157d06bd0e93698e5680e0b8b0f
BLAKE2b-256 5bfb95ff66971099bebb0704cce78929bc003aa44c6a66a9bdcb910ccb31e3a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for rfproto-0.0.19-py3-none-any.whl:

Publisher: publish-to-pypi.yml on JohnnyGOX17/rfproto

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page