use scirs2_fft::{fft, get_backend_info, get_backend_name, ifft, list_backends, BackendContext};
#[allow(dead_code)]
fn main() {
println!("FFT Backend System Example");
println!("=========================");
println!();
let backends = list_backends();
println!("Available backends:");
for backend_name in &backends {
if let Some(info) = get_backend_info(backend_name) {
println!(" {}", info);
}
}
println!();
println!("Current backend: {}", get_backend_name());
println!();
let signal: Vec<f64> = (0..16).map(|i| i as f64).collect();
println!("Test signal: {:?}", signal);
println!("\nUsing default backend ({}):", get_backend_name());
let spectrum = fft(&signal, None).expect("Operation failed");
println!(" FFT result (first 4 values): {:?}", &spectrum[0..4]);
let recovered = ifft(&spectrum, None).expect("Operation failed");
println!(
" IFFT recovery successful: {}",
signal
.iter()
.zip(recovered.iter())
.all(|(a, b)| (a - b.re).abs() < 1e-10 && b.im.abs() < 1e-10)
);
println!("\nUsing backend context:");
{
let _ctx = BackendContext::new("rustfft").expect("Operation failed");
println!(" Inside context: backend = {}", get_backend_name());
let _ = fft(&signal, None).expect("Operation failed");
}
println!(" Outside context: backend = {}", get_backend_name());
println!("\nBackend capabilities:");
if let Some(backend_manager) = Some(scirs2_fft::get_backend_manager()) {
let backend = backend_manager.get_backend();
let features = vec![
"1d_fft",
"2d_fft",
"nd_fft",
"cached_plans",
"gpu_acceleration",
];
for feature in features {
println!(
" Supports {}: {}",
feature,
backend.supports_feature(feature)
);
}
}
println!("\nArray interoperability:");
let vec_input = vec![1.0, 2.0, 3.0, 4.0];
let ndarray_input = scirs2_core::ndarray::Array1::from(vec![1.0, 2.0, 3.0, 4.0]);
let result1 = fft(&vec_input, None).expect("Operation failed");
let result2 =
fft(ndarray_input.as_slice().expect("Operation failed"), None).expect("Operation failed");
println!(" Vec input FFT: success");
println!(" ndarray input FFT: success");
println!(
" Results match: {}",
result1
.iter()
.zip(result2.iter())
.all(|(a, b)| (a.re - b.re).abs() < 1e-10 && (a.im - b.im).abs() < 1e-10)
);
}