use cute_dsp::fft::{SimpleFFT, SimpleRealFFT};
use num_complex::Complex;
fn main() {
println!("FFT Example");
println!("===========");
complex_fft_example();
real_fft_example();
}
fn complex_fft_example() {
println!("\nComplex FFT Example:");
let mut fft = SimpleFFT::<f32>::new(1024);
let mut time_domain = vec![Complex::new(0.0, 0.0); 1024];
let mut freq_domain = vec![Complex::new(0.0, 0.0); 1024];
for i in 0..1024 {
time_domain[i] = Complex::new((i as f32 * 2.0 * std::f32::consts::PI * 10.0 / 1024.0).sin(), 0.0);
}
fft.fft(&time_domain, &mut freq_domain);
println!("Frequency domain magnitudes (first 15 bins):");
for i in 0..15 {
println!("Bin {}: {}", i, (freq_domain[i].norm() / 1024.0));
}
fft.ifft(&freq_domain, &mut time_domain);
let mut max_error = 0.0;
for i in 0..1024 {
let original = (i as f32 * 2.0 * std::f32::consts::PI * 10.0 / 1024.0).sin();
let error = (time_domain[i].re - original).abs();
if error > max_error {
max_error = error;
}
}
println!("Maximum reconstruction error: {}", max_error);
}
fn real_fft_example() {
println!("\nReal FFT Example:");
let mut real_fft = SimpleRealFFT::<f32>::new(1024);
let mut time_domain = vec![0.0; 1024];
let mut freq_domain = vec![Complex::new(0.0, 0.0); 1024/2 + 1];
for i in 0..1024 {
time_domain[i] = (i as f32 * 2.0 * std::f32::consts::PI * 10.0 / 1024.0).sin();
}
real_fft.fft(&time_domain, &mut freq_domain);
println!("Frequency domain magnitudes (first 15 bins):");
for i in 0..15 {
println!("Bin {}: {}", i, (freq_domain[i].norm() / 1024.0));
}
real_fft.ifft(&freq_domain, &mut time_domain);
let mut max_error = 0.0;
for i in 0..1024 {
let original = (i as f32 * 2.0 * std::f32::consts::PI * 10.0 / 1024.0).sin();
let error = (time_domain[i] - original).abs();
if error > max_error {
max_error = error;
}
}
println!("Maximum reconstruction error: {}", max_error);
}