use num_complex::Complex;
use crate::ffi_apis::ffi_api::update_last_error;
use crate::numerical::transforms;
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_num_fft_inplace(
real: *mut f64,
imag: *mut f64,
len: usize,
) -> i32 {
unsafe {
if real.is_null() || imag.is_null() {
update_last_error(
"Null pointer passed to \
rssn_num_fft_inplace"
.to_string(),
);
return -1;
}
if !len.is_power_of_two() {
update_last_error(
"FFT length must be a \
power of two for \
in-place operation."
.to_string(),
);
return -1;
}
let mut data: Vec<Complex<f64>> = (0..len)
.map(|i| Complex::new(*real.add(i), *imag.add(i)))
.collect();
transforms::fft_slice(&mut data);
for (i, c) in data.iter().enumerate() {
*real.add(i) = c.re;
*imag.add(i) = c.im;
}
0
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_num_ifft_inplace(
real: *mut f64,
imag: *mut f64,
len: usize,
) -> i32 {
unsafe {
if real.is_null() || imag.is_null() {
update_last_error(
"Null pointer passed to \
rssn_num_ifft_inplace"
.to_string(),
);
return -1;
}
if !len.is_power_of_two() {
update_last_error(
"IFFT length must be \
a power of two for \
in-place operation."
.to_string(),
);
return -1;
}
let mut data: Vec<Complex<f64>> = (0..len)
.map(|i| Complex::new(*real.add(i), *imag.add(i)))
.collect();
transforms::ifft_slice(&mut data);
for (i, c) in data.iter().enumerate() {
*real.add(i) = c.re;
*imag.add(i) = c.im;
}
0
}
}