#sdr #helper #signal #complex-numbers #radio

aether_primitives

常见 SDR 和信号生成操作的辅助工具

1 个不稳定版本

0.1.0 2018 年 11 月 21 日

#2080Rust 模式

MPL-2.0 许可证

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的选择(RustFFTchfft
    • 实现chfft的包装器
    • 实现RustFFT的包装器
      • 问题:cf32 与 RustFFTs 版本的 cf32 不兼容(可能需要添加一些可疑的转换,因为结构体是相同的)
  • 添加vec_align!宏以创建对齐的vecs以用于SIMD指令
  • 添加固定大小的cf32 Vecs
    • 可能为了方便而将引用转换为切片
  • 添加VecStats(f32,cf32)
    • Min(index),Max(index),Mean(index),Power
  • 添加VecOps功能
    • FFTs:vec_fft,vec_ifft, vec_rifft, vec_rfft, vec_rifft;rifft/rfft重用fft::Cfft的现有实例,该实例目前通过启用fft_chfft构建得到支持。
    • 当它再次稳定工作时使用 faster
    • 功能:使用 VOLK 进行操作
      • 添加测试以确保生成的代码正确对齐 - 应该确保,因为cf32(2x4字节)是8字节。VOLK 更喜欢 32字节对齐 /libfftw 更喜欢 16字节对齐
      • 还必须挂钩到vec_align宏
  • 添加基于频域卷积的互相关
  • 添加FIR

许可证

Mozilla Public License 2.0

依赖

~205–295KB