38 releases
Uses new Rust 2024
new 0.0.38 | Apr 28, 2025 |
---|---|
0.0.37 | Nov 6, 2023 |
0.0.36 | Sep 11, 2023 |
0.0.35 | Jul 12, 2023 |
0.0.1-experimental | Jul 29, 2021 |
#126 in Asynchronous
126 downloads per month
Used in 3 crates
795KB
20K
SLoC
FutureSDR
An experimental asynchronous SDR runtime for heterogeneous architectures that is:
-
Extensible: custom buffers (supporting accelerators like GPUs and FPGAs) and custom schedulers (optimized for your application).
-
Asynchronous: solving long-standing issues around IO, blocking, and timers.
-
Portable: Linux, Windows, Mac, WASM, Android, and prime support for embedded platforms through a REST API and web-based GUIs.
-
Fast: SDR go brrr!
Website | Guides | API Docs | Chat
Overview
FutureSDR supports Blocks with synchronous or asynchronous implementations for stream-based or message-based data processing. Blocks can be combined to a Flowgraph and launched on a Runtime that is driven by a Scheduler.
- Single and multi-threaded schedulers, including examples for application-specific implementations.
- Portable GPU acceleration using the Vulkan API (supports Linux, Windows, Android, ...).
- User space DMA driver for Xilinx Zynq to interface FPGAs.
Development
Since FutureSDR is in an early state of development, it is likely that SDR applications will require changes to the runtime. We, therefore, do not recommend to add it as a dependency in a separate project but to clone the repository and implement the application as binary, example, or sub-crate.
Example
An example flowgraph that forwards 123 zeros into a sink:
use futuresdr::anyhow::Result;
use futuresdr::blocks::Head;
use futuresdr::blocks::NullSink;
use futuresdr::blocks::NullSource;
use futuresdr::macros::connect;
use futuresdr::runtime::Flowgraph;
use futuresdr::runtime::Runtime;
fn main() -> Result<()> {
let mut fg = Flowgraph::new();
let src = NullSource::<u8>::new();
let head = Head::<u8>::new(123);
let snk = NullSink::<u8>::new();
connect!(fg, src > head > snk);
Runtime::new().run(fg)?;
Ok(())
}
Credits
- The LoRa example is based on a Rust port of gr-lora-sdr.
- The M17 example is based on the C implementation of SP5WWP.
- The Rattlegram example is based on the Rattelgram app.
- The Remez Exchange algorithm in FutureDSP is a Rust port of the implementation of Jake Janovetz.
- The WLAN example is based on a Rust port of gr-ieee802-11.
- The ZigBee example is based on a Rust port of gr-ieee802-15-4.
Contributing
Contributions are very welcome. Please see the (work-in-progress) contributing guide for more information. If you develop larger features or work on major changes with the main intention to submit them upstream, it would be great, if you could announce them in advance.
Conduct
The FutureSDR project adheres to the Rust Code of Conduct. It describes the minimum behavior expected from all contributors.
License
This project is licensed under the Apache 2.0 license.
The main motivation for this license is that
- it better fits the Rust ecosystem
- it eases adoption; one can use (parts of) the code with close to no strings attached
- using Open Source and not contributing back (for the time being) seems better than not using Open Source at all
Contributions
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in FutureSDR, shall be licensed as Apache 2.0, without any additional terms or conditions.
Dependencies
~12–58MB
~1M SLoC