| Crates.io | avila-fft |
| lib.rs | avila-fft |
| version | 0.3.0 |
| created_at | 2025-12-01 23:51:31.532558+00 |
| updated_at | 2025-12-02 01:47:02.760622+00 |
| description | Ultimate performance FFT: SIMD, caching, advanced algorithms, parallel, streaming - Zero dependencies |
| homepage | https://github.com/nicolas-avila/avila-fft |
| repository | https://github.com/nicolas-avila/avila-fft |
| max_upload_size | |
| id | 1960873 |
| size | 2,072,664 |
High-performance Fast Fourier Transform library and CLI tool in pure Rust
[dependencies]
avila-fft = "0.1.0"
use avila_fft::*;
// Simple FFT
let signal = vec![1.0, 2.0, 3.0, 4.0];
let planner = FftPlanner::new(4, false)?;
let spectrum = planner.process_real(&signal)?;
// STFT with spectrogram
let config = OverlapConfig::overlap_75(1024);
let processor = StftProcessor::new(config, WindowType::Hann)?;
let spectrogram = processor.process(&signal, 16384.0)?;
# Install
cargo install avila-fft
# Generate test signal
avila-fft generate --type sweep --frequency 100 --end-freq 2000 --output test.txt
# Analyze with advanced features
avila-fft analyze test.txt --harmonics --phase --snr --export results.csv
# Create spectrogram
avila-fft spectrogram test.txt --format db --max-freq 2500 --export spec.csv
# Run benchmarks
avila-fft benchmark
f32 and f64use avila_fft::parallel::*;
let config = ParallelConfig::default();
let processor = ParallelFft::new(config);
// Process batch of 100 signals with 4x speedup
let results = processor.process_batch(signals, false);
Benchmarks:
use avila_fft::streaming::*;
let config = StreamConfig::default();
let mut processor = StreamingStft::new(config);
// Process multi-GB file with constant memory
processor.process_file("huge_audio.txt", |frame_idx, time, spectrum| {
// Process frame (only one in memory at a time)
})?;
Performance:
See PERFORMANCE.md for detailed benchmarks and optimization guide.
| Operation | Size | Time | Throughput |
|---|---|---|---|
| Forward FFT | 1024 | 0.05 ms | 20 million/s |
| Forward FFT | 4096 | 0.63 ms | 6.5 million/s |
| Inverse FFT | 1024 | 0.05 ms | 20 million/s |
| Signal | Frames | Process Time | Inverse Time |
|---|---|---|---|
| 1s audio | 61 | 15 ms | 8 ms |
| 5s audio | 317 | 67 ms | 41 ms |
| Workload | Serial | Parallel (4 threads) | Speedup |
|---|---|---|---|
| 100 FFTs (4096) | 149 ms | 37 ms | 4.0x |
| 50 FFTs (2048) | 43 ms | 25 ms | 1.7x |
| Buffer | Throughput | Realtime Factor |
|---|---|---|
| 16K samples | 612K samples/s | 37x |
| 4K samples | 169K samples/s | 10x |
Professional-grade command-line interface for signal analysis:
generate - Create test signals (chirp, tone, sweep, noise, impulse)analyze - Complete STFT analysis with optional featuresspectrogram - Export time-frequency data to CSVbenchmark - Performance testing# Harmonic analysis
avila-fft analyze signal.txt --harmonics
# Phase coherence
avila-fft analyze signal.txt --phase
# Temporal SNR
avila-fft analyze signal.txt --snr
# All features combined
avila-fft analyze signal.txt --harmonics --phase --snr --export full_analysis.csv
See CLI.md for complete documentation.
Signal β STFT β ISTFT β Recovered Signal
Signal-to-Noise Ratio: 308.8 dB
# Release mode compilation (critical!)
cargo build --release
# Run comprehensive benchmarks
cargo run --release --example scale_benchmark
# Individual feature tests
cargo test --release
use avila_fft::*;
// Create a simple sine wave
let signal: Vec<f64> = (0..1024)
.map(|i| (2.0 * std::f64::consts::PI * 10.0 * i as f64 / 1024.0).sin())
.collect();
// FFT
let planner = FftPlanner::new(1024, false)?;
let spectrum = planner.process_real(&signal)?;
// Find peak frequency
let magnitudes: Vec<f64> = spectrum.iter().map(|c| c.norm()).collect();
let peak_bin = magnitudes.iter()
.enumerate()
.max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
.map(|(i, _)| i)
.unwrap();
let peak_freq = peak_bin as f64 * sample_rate / 1024.0;
println!("Peak frequency: {:.1} Hz", peak_freq); // ~10 Hz
use avila_fft::timefreq::*;
// Generate chirp signal
let sample_rate = 16384.0;
let duration = 2.0;
let signal: Vec<f64> = (0..(sample_rate * duration) as usize)
.map(|i| {
let t = i as f64 / sample_rate;
let freq = 100.0 + 500.0 * t / duration; // 100 to 600 Hz
(2.0 * std::f64::consts::PI * freq * t).sin()
})
.collect();
// STFT
let config = OverlapConfig::overlap_75(1024);
let processor = StftProcessor::new(config, WindowType::Hann)?;
let spec = processor.process(&signal, sample_rate)?;
// Extract features
let centroid = spec.spectral_centroid();
let bandwidth = spec.spectral_bandwidth();
let flatness = spec.spectral_flatness();
println!("Spectral centroid: {:.1} Hz (avg)",
centroid.iter().sum::<f64>() / centroid.len() as f64);
use avila_fft::parallel::*;
// Create batch of signals
let signals: Vec<Vec<Complex<f64>>> = (0..100)
.map(|_| generate_random_signal(4096))
.collect();
// Process in parallel
let config = ParallelConfig::default(); // Auto-detect CPU cores
let processor = ParallelFft::new(config);
let results = processor.process_batch(signals, false);
println!("Processed {} signals", results.len());
use avila_fft::streaming::*;
// Stream-process a huge file
let config = StreamConfig {
window_size: 2048,
hop_size: 512,
buffer_size: 16384,
sample_rate: 44100.0,
};
let mut processor = StreamingStft::new(config);
let mut max_magnitude = 0.0;
processor.process_file("huge_audio.txt", |frame_idx, time, spectrum| {
// Process one frame at a time (constant memory)
let mag: f64 = spectrum.iter().map(|c| c.norm()).sum();
max_magnitude = max_magnitude.max(mag);
if frame_idx % 100 == 0 {
println!("Processed frame {} at time {:.2}s", frame_idx, time);
}
})?;
println!("Max magnitude: {:.2}", max_magnitude);
Contributions welcome! Areas of interest:
MIT License - see LICENSE for details.
Built with β€οΈ in Rust β’ Zero Dependencies β’ Production Ready
Last updated: December 2025 β’ Version 0.1.0