1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
//! Library for computing fast fourier transforms on embedded systems. //! //! microfft provides an in-place implementation of the Radix-2 FFT algorithm. //! All computations are performed directly on the input buffer and require no //! additional allocations. This makes microfft suitable for `no_std` //! environments. //! //! In addition to the standard FFT implementation on [`Complex32`] values //! ([`complex`]), an implementation working on real (`f32`) input values is //! provided ([`real`]). An `N`-point RFFT internally computes an `N/2`-point //! CFFT, making it roughly twice as fast as the complex variant. //! //! # Example //! //! ``` //! use std::convert::TryInto; //! use std::f32::consts::PI; //! //! // generate 16 samples of a sine wave at frequency 3 //! let sample_count = 16; //! let signal_freq = 3.; //! let sample_interval = 1. / sample_count as f32; //! let mut samples: Vec<_> = (0..sample_count) //! .map(|i| (2. * PI * signal_freq * sample_interval * i as f32).sin()) //! .collect(); //! //! // compute the RFFT of the samples //! let mut samples: [_; 16] = samples.try_into().unwrap(); //! let spectrum = microfft::real::rfft_16(&mut samples); //! // since the real-valued coefficient at the Nyquist frequency is packed into the //! // imaginary part of the DC bin, it must be cleared before computing the amplitudes //! spectrum[0].im = 0.0; //! //! // the spectrum has a spike at index `signal_freq` //! let amplitudes: Vec<_> = spectrum.iter().map(|c| c.norm_sqr() as u32).collect(); //! assert_eq!(&litudes, &[0, 0, 0, 64, 0, 0, 0, 0]); //! ``` //! //! [`complex`]: complex/index.html //! [`real`]: real/index.html //! [`Complex32`]: type.Complex32.html #![no_std] #![deny(missing_docs)] #![warn(rust_2018_idioms)] pub mod complex; pub mod real; pub use num_complex::Complex32; mod cfft; mod rfft; mod tables; use static_assertions::assert_cfg; assert_cfg!( any( feature = "maxn-4", feature = "maxn-8", feature = "maxn-16", feature = "maxn-32", feature = "maxn-64", feature = "maxn-128", feature = "maxn-256", feature = "maxn-512", feature = "maxn-1024", feature = "maxn-2048", feature = "maxn-4096", ), "One of the `maxn-*` features of this crate must be set." );