1 个不稳定版本
0.1.0 | 2018 年 11 月 21 日 |
---|
#2080 在 Rust 模式
37KB
701 行
aether-primitives - 由 Rust 驱动的软件无线电框架
什么是以太?
以太旨在通过提供方便的(低级)构建块以简化 SDR 应用程序的开发。
示例
核心操作以 VecOps 特性形式实现,该特性适用于 C 兼容的 num::Complex 的 Vecs/Slices(简称 cf32)。
// #[macro_use] // includes the assert_evm macro
// extern crate aether_primitives;
// use aether_primitives::{cf32, vecops::VecOps};
// The main sample type is cf32 which is a type alias for num::Complex<f32>
let mut v = vec![cf32::new(2.0, 2.0); 100];
let twos = v.clone();
let ones = vec![cf32::new(1.0, 1.0); 100];
let correct = vec![cf32::new(1.0, -1.0); 100];
v.vec_div(&twos)
.vec_mul(&twos)
.vec_zero() // zero the vector
.vec_add(&ones)
.vec_sub(&twos)
.vec_clone(&ones)
.vec_mutate(|c| c.im = -1.0)
.vec_conj()
.vec_mirror(); // mirror swaps elements around the midpoint of the array
/// ensure each element's error vector magnitude vs the correct vector is below -80dB
assert_evm!(&v, &correct, -80.0);
设计决策
- 基础版本将使用惯用的 Rust 编写
- 优化和 unsafe 加速将被隐藏在功能标志之后
- aether 不固定 num-traits 和 num-complex crate 的实际版本,因为相同的 trait 的多个并发版本不兼容。
这可能会导致类型级别的不兼容,如果有依赖关系暴露了不同版本的相同类型给用户。因此版本不被固定,因为 cargo 通常会尝试为最大依赖集(在其版本约束内)构建相同的 num-complex 和 num-traits 版本,从而降低这种情况发生的可能性。 - 出于性能原因,将避免使用动态调度(Trait 对象
dyn <Trait>
)。
实现的功能
- 宏
- assert_evm!: 检查两个向量元素相对于彼此具有特定的误差向量幅度(以 dBm 表示)
- Vecops:cf32 向量/切片操作的辅助工具
- 逐元素操作:加、减、除、乘、复共轭、变异 . 镜像:在向量中间交换元素(对于偶数长度的向量)
- 将整个向量置零,从另一个向量复制元素
- 功能:使用新的或现有的傅里叶变换实例执行(i)FFT(通过
fft_chfft
启用)
- 序列:二进制伪随机序列生成的辅助工具(M-序列)
- expand:将种子值扩展为初始化向量
- generate:生成
- 采样
- 线性插值
- 偶数下采样
- FFT
- 执行快速傅里叶变换(正向/反向)并具有不同的缩放因子
- 基准:使用 criterion.rs 框架对 aether 中的大多数操作进行基准测试
- 下采样、插值、FFT
待办事项
- 通过包装器提取FFT的选择(RustFFT 与 chfft)
- 实现chfft的包装器
- 实现RustFFT的包装器
- 问题:cf32 与 RustFFTs 版本的 cf32 不兼容(可能需要添加一些可疑的转换,因为结构体是相同的)
- 添加vec_align!宏以创建对齐的vecs以用于SIMD指令
- 添加固定大小的cf32 Vecs
- 可能为了方便而将引用转换为切片
- 添加VecStats(f32,cf32)
- Min(index),Max(index),Mean(index),Power
- 添加VecOps功能
- 添加基于频域卷积的互相关
- 添加FIR
许可证
依赖
~205–295KB