49次发布
0.4.3 | 2024年4月20日 |
---|---|
0.4.1 | 2023年11月14日 |
0.3.11 | 2023年11月17日 |
0.3.10 | 2023年10月29日 |
0.1.15 | 2023年9月20日 |
#189 in 数学
36次每月下载
1MB
6K SLoC
Rust Radio
一个以GNU Radio为灵感的数字信号处理库。
为了额外的速度(?), 使用以下环境变量构建 RUSTFLAGS="-C target-cpu=native"
发布新版本
./extra/bump_version.sh
git push && cargo publish
基准测试
cargo +nightly bench
有用命令
绘制I/Q数据
$ od -A none -w8 -f test.c32 > t
$ gnuplot
gnuplot> plot 't' using 1 w l, 't' using 2 w l
lib.rs
:
此库为运行SDR(软件定义无线电)应用程序提供一个框架。
它受到了GNURadio的极大启发,当然是用Rust编写的。
它目前具有非常少的块,并且缺少标签和PDU消息。
除了此crate中的示例应用程序外,还有一个使用此框架的项目sparslog,该项目解码IKEA Sparsnäs电力表RF信号。
架构概述
RustRadio应用程序由通过单向流连接的块组成。每个块有零个或多个输入流,以及零个或多个输出流。
信号通过块从“源”(没有输入流的块)流向“汇”(没有输出流的块)。
这些块和流被称为“图”,就像具有节点和边的数学概念图一样。
块对其输入(们)进行一些操作,并将结果传递给其输出(们)。
一个典型的图将类似于
[ Raw radio source ]
↓
[ Filtering ]
↓
[ Resampling ]
↓
[ Demodulation ]
↓
[ Symbol Sync ]
↓
[ Packet assembly and save ]
具体来说,对于sparslog
[ RtlSdrSource ]
↓
[ RtlSdrDecode to convert from ]
[ own format to complex I/Q ]
↓
[ FftFilter ]
↓
[ RationalResampler ]
↓
[ QuadratureDemod ]
↓
[ AddConst for frequency offset ]
↓
[ ZeroCrossing symbol sync ]
↓
[ Custom Sparsnäs decoder ]
[ block in the binary, ]
[ not in the framework ]
示例
这里有一个简单的示例,它创建了一些块,通过流将它们连接起来,并运行图。
use rustradio::graph::Graph;
use rustradio::blocks::{AddConst, VectorSource, DebugSink};
use rustradio::Complex;
let src = Box::new(VectorSource::new(
vec![
Complex::new(10.0, 0.0),
Complex::new(-20.0, 0.0),
Complex::new(100.0, -100.0),
],
));
let add = Box::new(AddConst::new(src.out(), Complex::new(1.1, 2.0)));
let sink = Box::new(DebugSink::new(add.out()));
let mut g = Graph::new();
g.add(src);
g.add(add);
g.add(sink);
g.run()?;
链接
- 主仓库: https://github.com/ThomasHabets/rustradio
- crates.io: https://crates.io/crates/rustradio
- 本文档: https://docs.rs/rustradio/latest/rustradio/
测试辅助函数。
依赖关系
~5-15MB
~212K SLoC