#fft #order #transform #module #standard #powers #plan

no-std concrete-fft

Concrete-FFT是一个纯Rust高性能快速傅里叶变换库

6个版本 (3个重大更改)

0.4.1 2024年2月28日
0.4.0 2024年2月14日
0.3.0 2023年8月28日
0.2.1 2023年3月24日
0.1.0 2022年9月7日

数学类别中排名第89

Download history 1361/week @ 2024-03-13 1235/week @ 2024-03-20 1060/week @ 2024-03-27 1537/week @ 2024-04-03 1141/week @ 2024-04-10 1195/week @ 2024-04-17 1056/week @ 2024-04-24 863/week @ 2024-05-01 858/week @ 2024-05-08 1325/week @ 2024-05-15 1141/week @ 2024-05-22 1629/week @ 2024-05-29 1716/week @ 2024-06-05 2343/week @ 2024-06-12 2594/week @ 2024-06-19 1836/week @ 2024-06-26

每月下载量8,716
8包中使用(直接使用2个)

BSD-3-Clause-Clear

600KB
17K SLoC

Concrete-FFT是一个纯Rust高性能快速傅里叶变换库,它处理的是大小为2的幂的向量。它被设计成Zama的TFHE-rs库的后端。

此库提供两个FFT模块

  • 有序模块FFT使用标准顺序的输入执行正向/反向FFT,并以标准顺序输出结果。有关FFT计算更详细的信息,请查看有序模块级别的文档。
  • 无序模块FFT执行正向FFT,其输入为标准顺序,输出为FFT计划可能依赖的某种排列顺序。另一方面,反向FFT以相同的排列顺序输入,并以标准顺序输出结果。这在傅里叶域系数顺序不重要的情况下很有用。一个例子是使用傅里叶变换进行向量卷积。傅里叶域中仅执行逐元素操作,因此系数的顺序不会影响结果。

此外,还提供了一个可选的128位递减FFT模块。

特性

  • std(默认):此选项启用运行时架构检测以使用加速的SIMD指令,并测量各种实现以在运行时选择最快的FFT计划。
  • fft128:此标志提供了对128位FFT的访问,可在fft128模块中使用。
  • nightly:此功能通过在支持它们的CPU上启用AVX512F指令,进一步加快FFT的速度,从而启用不稳定的Rust功能。此功能需要nightly Rust工具链。
  • serde:此功能为无序计划启用序列化和反序列化函数。这些函数允许将傅里叶域中的数据从排列顺序序列化为标准顺序,并将数据从标准顺序反序列化为排列顺序。由于逆变换必须与计算/反序列化正变换的同一天计划一起使用(或更具体地说,具有相同内部基本FFT大小的计划),因此需要此功能。

示例

use concrete_fft::c64;
use concrete_fft::ordered::{Plan, Method};
use dyn_stack::{PodStack, GlobalPodBuffer, ReborrowMut};
use num_complex::ComplexFloat;
use std::time::Duration;

const N: usize = 4;
let plan = Plan::new(4, Method::Measure(Duration::from_millis(10)));
let mut scratch_memory = GlobalPodBuffer::new(plan.fft_scratch().unwrap());
let mut stack = PodStack::new(&mut scratch_memory);

let data = [
    c64::new(1.0, 0.0),
    c64::new(2.0, 0.0),
    c64::new(3.0, 0.0),
    c64::new(4.0, 0.0),
];

let mut transformed_fwd = data;
plan.fwd(&mut transformed_fwd, stack.rb_mut());

let mut transformed_inv = transformed_fwd;
plan.inv(&mut transformed_inv, stack.rb_mut());

for (actual, expected) in transformed_inv.iter().map(|z| z / N as f64).zip(data) {
    assert!((expected - actual).abs() < 1e-9);
}

许可证

本软件在BSD-3-Clause-Clear许可证下分发,其中包含一项豁免,允许在研究、评估和原型设计目的以及个人项目中使用我们的专利权。

然而,如果您想在商业产品中使用concrete-fft,则需要购买单独的商业许可证。

如果您有任何疑问,请通过hello@zama.ai.与我们联系

依赖关系

~2.5MB
~54K SLoC