use std::{f32::consts::PI, time::Instant};
use num_complex::Complex;
use scientific_cal::{spectrum::{fft, ifft}, ScientificError};


#[test]
fn fft_test() -> Result<(), ScientificError>{
    // 参数输入
    let n = 1024;
    // 仿真数据
    let raw_data: Vec<f32> = (0..n as i64)
        .map(|i| {
            (2.0 * PI * i as f32 / n as f32).sin()
        })
        .collect();
    println!("raw_data: {:?}", &raw_data[0..10]);
    // 开始计算
    let start = Instant::now();

    let mut fft_result = fft(&raw_data)?;
    println!("fft_result: {:?}", &fft_result[0..10]);
    
    // 可以自定义滤波
    // 略
    // ifft
    // 幅值需要取共轭除以 N 
    let n = raw_data.len();
    for f in fft_result.iter_mut(){
        *f = Complex::new(f.re, -f.im) / (n as f32)
    }
    let ifft_result = ifft(&mut fft_result)?;
    println!("fft运行耗时: {:?}", start.elapsed());
    println!("ifft_result: {:?}", &ifft_result[0..10]);
    Ok(())
}