use alloc::vec::Vec;
use crate::fft::Fft;
use core::convert::TryInto;
use microfft::real;
pub use microfft::Complex32;
pub struct FftImpl;
impl Fft<Complex32> for FftImpl {
#[inline(always)]
fn fft_apply(samples: &[f32]) -> Vec<Complex32> {
let buffer = samples;
let mut res = {
if buffer.len() == 2 {
let mut buffer: [_; 2] = buffer.try_into().unwrap();
real::rfft_2(&mut buffer).to_vec()
} else if buffer.len() == 4 {
let mut buffer: [_; 4] = buffer.try_into().unwrap();
real::rfft_4(&mut buffer).to_vec()
} else if buffer.len() == 8 {
let mut buffer: [_; 8] = buffer.try_into().unwrap();
real::rfft_8(&mut buffer).to_vec()
} else if buffer.len() == 16 {
let mut buffer: [_; 16] = buffer.try_into().unwrap();
real::rfft_16(&mut buffer).to_vec()
} else if buffer.len() == 32 {
let mut buffer: [_; 32] = buffer.try_into().unwrap();
real::rfft_32(&mut buffer).to_vec()
} else if buffer.len() == 64 {
let mut buffer: [_; 64] = buffer.try_into().unwrap();
real::rfft_64(&mut buffer).to_vec()
} else if buffer.len() == 128 {
let mut buffer: [_; 128] = buffer.try_into().unwrap();
real::rfft_128(&mut buffer).to_vec()
} else if buffer.len() == 256 {
let mut buffer: [_; 256] = buffer.try_into().unwrap();
real::rfft_256(&mut buffer).to_vec()
} else if buffer.len() == 512 {
let mut buffer: [_; 512] = buffer.try_into().unwrap();
real::rfft_512(&mut buffer).to_vec()
} else if buffer.len() == 1024 {
let mut buffer: [_; 1024] = buffer.try_into().unwrap();
real::rfft_1024(&mut buffer).to_vec()
} else if buffer.len() == 2048 {
let mut buffer: [_; 2048] = buffer.try_into().unwrap();
real::rfft_2048(&mut buffer).to_vec()
} else if buffer.len() == 4096 {
let mut buffer: [_; 4096] = buffer.try_into().unwrap();
real::rfft_4096(&mut buffer).to_vec()
} else {
panic!("`microfft::real` only supports powers of 2 between 2 and 4096!");
}
};
let nyquist_fr_pos_val = res[0].im;
res[0].im = 0.0;
res.push(Complex32::new(nyquist_fr_pos_val, 0.0));
res
}
#[inline(always)]
fn fft_relevant_res_samples_count(samples_len: usize) -> usize {
samples_len / 2 + 1
}
}