// 秒寻科技
// 傅里叶变换
// 周涛
// 2023-03-04

#ifndef __FFT_H__
#define __FFT_H__

#include "../sysdefine/sysdef.h"

#define UTIL_FFT_2PI (2.0 * PUB_M_PI / PUB_FFT_FRAME_LEN)
#define UTIL_FFT_FRAME_LEN_BIT_NUM log2(PUB_FFT_FRAME_LEN)

// 供外部是使用的接口
void util_fft_init();
int util_fft_init_butterfly_table(int data_frame_length, short *butterfly_table_ptr); // 初始化蝶形运算抽取顺序码表数据

int util_fft_fft(int data_frame_length, float *data_real_ptr, float *data_imag_ptr, short *butterfly_table_ptr);  // 复数fft计算
int util_fft_ifft(int data_frame_length, float *data_real_ptr, float *data_imag_ptr, short *butterfly_table_ptr); // 复数ifft计算

int util_fft_calc_result_sequence_length(int data_frame_length);                                                                                  // 计算结果序列长度（调用者分配结果空间使用）
int util_fft_calc_frequency_sequence(int data_frame_length, int sample_rate, float *frequency_sequence_ptr);                                      // 计算经fft处理后的数据序列的频率序列
int util_fft_calc_amplitude_sequence(float *data_real_ptr, float *data_imag_ptr, int data_frame_length, float *amplitude_sequence_ptr);           // 计算经fft处理后的数据序列的幅值序列（频谱）
int util_fft_calc_power_sequence(float *data_real_ptr, float *data_imag_ptr, int data_frame_length, float *power_sequence_ptr);                   // 计算经fft处理后的数据序列的功率谱序列（功率谱）
int util_fft_calc_phase_sequence(float *data_real_ptr, float *data_imag_ptr, int data_frame_length, int radian2angle, float *phase_sequence_ptr); // 计算经fft处理后的数据序列的相位角序列（相位谱）

// 供内部使用的接口
int util_fft_reverse_number_bit(int number, int total_bit_count);
void util_fft_get_data_ptr(uint8 byIndex, flt32 **pfCosData, flt32 **pfSinData);

#endif