use alloc::vec::Vec;
use crate::fft::Fft;
use core::convert::TryInto;
use microfft::complex;
pub use microfft::Complex32;
pub struct FftImpl;
impl FftImpl {
#[inline(always)]
fn samples_to_complex(samples: &[f32]) -> Vec<Complex32> {
samples
.iter()
.map(|x| Complex32::new(*x, 0.0))
.collect::<Vec<Complex32>>()
}
}
impl Fft<Complex32> for FftImpl {
#[inline(always)]
fn fft_apply(samples: &[f32]) -> Vec<Complex32> {
let buffer = Self::samples_to_complex(samples);
if buffer.len() == 2 {
let mut buffer: [_; 2] = buffer.try_into().unwrap();
complex::cfft_2(&mut buffer).to_vec()
} else if buffer.len() == 4 {
let mut buffer: [_; 4] = buffer.try_into().unwrap();
complex::cfft_4(&mut buffer).to_vec()
} else if buffer.len() == 8 {
let mut buffer: [_; 8] = buffer.try_into().unwrap();
complex::cfft_8(&mut buffer).to_vec()
} else if buffer.len() == 16 {
let mut buffer: [_; 16] = buffer.try_into().unwrap();
complex::cfft_16(&mut buffer).to_vec()
} else if buffer.len() == 32 {
let mut buffer: [_; 32] = buffer.try_into().unwrap();
complex::cfft_32(&mut buffer).to_vec()
} else if buffer.len() == 64 {
let mut buffer: [_; 64] = buffer.try_into().unwrap();
complex::cfft_64(&mut buffer).to_vec()
} else if buffer.len() == 128 {
let mut buffer: [_; 128] = buffer.try_into().unwrap();
complex::cfft_128(&mut buffer).to_vec()
} else if buffer.len() == 256 {
let mut buffer: [_; 256] = buffer.try_into().unwrap();
complex::cfft_256(&mut buffer).to_vec()
} else if buffer.len() == 512 {
let mut buffer: [_; 512] = buffer.try_into().unwrap();
complex::cfft_512(&mut buffer).to_vec()
} else if buffer.len() == 1024 {
let mut buffer: [_; 1024] = buffer.try_into().unwrap();
complex::cfft_1024(&mut buffer).to_vec()
} else if buffer.len() == 2048 {
let mut buffer: [_; 2048] = buffer.try_into().unwrap();
complex::cfft_2048(&mut buffer).to_vec()
} else if buffer.len() == 4096 {
let mut buffer: [_; 4096] = buffer.try_into().unwrap();
complex::cfft_4096(&mut buffer).to_vec()
} else {
panic!("`microfft::complex` only supports powers of 2 between 2 and 4096!");
}
}
#[inline(always)]
fn fft_relevant_res_samples_count(samples_len: usize) -> usize {
samples_len / 2 + 1
}
}