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次每月下载

MIT 许可证

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()?;

测试辅助函数。

依赖关系

~5-15MB
~212K SLoC