Rust: library for frequency spectrum analysis using FFT
A simple and fast no_std library to get the frequency spectrum of a digital signal (e.g. audio) using FFT.
It follows the KISS principle and consists of simple building blocks/optional features.
I'm not an expert on digital signal processing. Code contributions are highly welcome! :)
How to use
use ;
use hann_window;
How to scale values
// e.g. like this
Performance
Measurements taken on i7-8650U @ 3 Ghz (Single-Core) with optimized build
| Operation | Time |
|---|---|
| Hann Window with 4096 samples | ≈70µs |
| Hamming Window with 4096 samples | ≈10µs |
| Hann Window with 16384 samples | ≈175µs |
| Hamming Window with 16384 samples | ≈44µs |
| FFT to spectrum with 4096 samples @ 44100Hz | ≈240µs |
| FFT to spectrum with 16384 samples @ 44100Hz | ≈740µs |
Example visualization
In the following example you can see a basic visualization of frequencies 0 to 4000Hz for
a layered signal of sine waves of 50, 1000, and 3777Hz @ 41000Hz sample rate. The peaks for the
given frequencies are clearly visible. Each calculation was done with 2048 samples, i.e. ≈46ms.
The noise (wrong peaks) also comes from clipping of the added sine waves!
Spectrum without window function on samples
Peaks (50, 1000, 3777 Hz) are clearly visible but also noise.

Hann window function on samples before FFT
Peaks (50, 1000, 3777 Hz) are clearly visible and overall noise is much smaller, but a few noisy peaks.

Hamming window function on samples before FFT
Peaks (50, 1000, 3777 Hz) are clearly visible and overall noise is smaller.

Trivia / FAQ
Why f64 and no f32?
I tested f64 but the additional accuracy doesn't pay out the ~40% calculation overhead (on x86_64).
What can I do against the noise?
Apply a window function, like Hann window or Hamming window. But I'm not an expert on this.