diff --git a/Cargo.toml b/Cargo.toml index cacf6d9..b08a780 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,16 +16,19 @@ bench = false test = true [dependencies] -num-traits = ">=0.0.0" -num-complex = ">=0.0.0" +num-traits = { version = "0.2.9", default-features = false } +num-complex = { version = "0.2.3", default-features = false } [dev-dependencies] -rand = ">=0.7.0" -rand_xorshift = ">=0.2.0" +rand = "0.7.2" +rand_xorshift = "0.2.0" [dev-dependencies.appro-eq] -version=">=0.0.0" +version= "0.3.0" features=["complex"] [features] +default = ["std"] docs = [] +std = ["num-traits/std", "num-complex/std"] +libm = ["num-traits/libm"] diff --git a/src/cfft1d.rs b/src/cfft1d.rs index 84b5918..8f37658 100644 --- a/src/cfft1d.rs +++ b/src/cfft1d.rs @@ -15,6 +15,9 @@ use num_traits::float::{Float, FloatConst}; use num_traits::identities::{one, zero}; use num_traits::{cast, NumAssign}; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + #[derive(Debug)] enum WorkData { MixedRadix(mixed_radix::MixedRadixData), diff --git a/src/cfft2d.rs b/src/cfft2d.rs index 9f5aabb..b87a8e2 100644 --- a/src/cfft2d.rs +++ b/src/cfft2d.rs @@ -11,6 +11,9 @@ use num_traits::float::{Float, FloatConst}; use num_traits::identities::{one, zero}; use num_traits::{cast, NumAssign}; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + /// Perform a complex-to-complex two-dimensional Fourier transform /// /// diff --git a/src/chirpz.rs b/src/chirpz.rs index e146182..4ae75c6 100644 --- a/src/chirpz.rs +++ b/src/chirpz.rs @@ -12,6 +12,9 @@ use num_traits::float::Float; use num_traits::identities::{one, zero}; use num_traits::NumAssign; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + #[derive(Debug)] pub(crate) struct ChirpzData { pub(crate) level: usize, diff --git a/src/dct1d.rs b/src/dct1d.rs index 7c34c42..ee42c9b 100644 --- a/src/dct1d.rs +++ b/src/dct1d.rs @@ -12,6 +12,9 @@ use num_traits::float::{Float, FloatConst}; use num_traits::identities::{one, zero}; use num_traits::{cast, NumAssign}; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + /// Perform a discrete cosine transform /// /// # Example diff --git a/src/lib.rs b/src/lib.rs index 1d125f1..ce4828e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ #![crate_type = "lib"] +#![cfg_attr(not(feature = "std"), no_std)] //! Chalharu's Fastest Fourier Transform. //! @@ -7,6 +8,13 @@ //! version 2.0 (the "License"). You can obtain a copy of the License at //! http://mozilla.org/MPL/2.0/ . +#[cfg(not(any(feature = "std", feature = "libm")))] +compile_error!("Either feature 'std' or feature 'libm' must be enabled for 'chfft' to work"); + +#[cfg(not(feature = "std"))] +#[macro_use] +extern crate alloc; + mod chirpz; mod mixed_radix; mod precompute_utils; diff --git a/src/mdct1d.rs b/src/mdct1d.rs index cbf29c7..ecdf23c 100644 --- a/src/mdct1d.rs +++ b/src/mdct1d.rs @@ -12,6 +12,9 @@ use num_traits::float::{Float, FloatConst}; use num_traits::identities::zero; use num_traits::{cast, one, NumAssign}; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + /// Perform a Modified discrete cosine transform /// /// diff --git a/src/mixed_radix.rs b/src/mixed_radix.rs index 54065be..bf6afd3 100644 --- a/src/mixed_radix.rs +++ b/src/mixed_radix.rs @@ -12,6 +12,9 @@ use num_traits::float::{Float, FloatConst}; use num_traits::identities::one; use num_traits::{cast, NumAssign}; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + #[derive(Debug)] pub(crate) struct MixedRadixData { pub(crate) ids: Vec, diff --git a/src/precompute_utils.rs b/src/precompute_utils.rs index 099b680..419ee52 100644 --- a/src/precompute_utils.rs +++ b/src/precompute_utils.rs @@ -10,14 +10,21 @@ use num_complex::Complex; use num_traits::cast; use num_traits::float::{Float, FloatConst}; use num_traits::identities::one; + +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; +#[cfg(not(feature = "std"))] +use core::cmp; +#[cfg(feature = "std")] use std::cmp; #[inline] pub(crate) fn calc_omega_item(len: usize, position: usize) -> Complex { - Complex::from_polar( - &one(), - &(cast::<_, T>(-2.0).unwrap() * T::PI() / cast(len).unwrap() * cast(position).unwrap()), - ) + let r: T = one(); + let theta: T = + cast::<_, T>(-2.0).unwrap() * T::PI() / cast(len).unwrap() * cast(position).unwrap(); + // We can't use Complex::from_polar because it is at the time of writing not no_std compatible + Complex::new(r * theta.cos(), r * theta.sin()) } // ωの事前計算 diff --git a/src/prime_factorization.rs b/src/prime_factorization.rs index b7a28c5..7025c25 100644 --- a/src/prime_factorization.rs +++ b/src/prime_factorization.rs @@ -5,6 +5,9 @@ //! version 2.0 (the "License"). You can obtain a copy of the License at //! http://mozilla.org/MPL/2.0/ . +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + #[derive(Debug)] pub(crate) struct Factor { pub(crate) value: usize, diff --git a/src/rfft1d.rs b/src/rfft1d.rs index fd4ae75..363fa5a 100644 --- a/src/rfft1d.rs +++ b/src/rfft1d.rs @@ -12,6 +12,9 @@ use num_traits::float::{Float, FloatConst}; use num_traits::identities::{one, zero}; use num_traits::{cast, NumAssign}; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + /// Perform a real-to-complex one-dimensional Fourier transform /// ///