/**************************************************************************** Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT be copied by any method or incorporated into another program without the express written consent of Aerospace C.Power. This Information or any portion thereof remains the property of Aerospace C.Power. The Information contained herein is believed to be accurate and Aerospace C.Power assumes no responsibility or liability for its use in any way and conveys no license or title under any patent or copyright and makes no representation or warranty that this Information is free from patent or copyright infringement. ****************************************************************************/ #ifndef IOT_MATRIX_API_H #define IOT_MATRIX_API_H #ifdef __cplusplus extern "C" { #endif /** \defgroup AFFT_APIs AFFT APIs * @brief AFFT APIs * * */ /** @addtogroup AFFT_APIs * @{ * */ /** * @brief Usage: // AFFT apis are used for FFT calculation. FFT size support 256, 512, 1024, 2048 read data, and 128, 256, 512, 1024 complex data. // test case : calculate 2048 FFT, data format is low 24 bits valid. // the pointer of input data uint32_t *src = ...; // the pointer of output data uint32_t *dst = ...; // the length of data uint32_t data_len = ...; // get fft/ifft result iot_afft_real_fft(dst, src, 2048, AFFT_FMT_LOW_24BIT, AFFT_REAL_2048); // another calling function: uint32_t addr = iot_afft_get_address(); iot_real_fft_cfg(AFFT_FMT_LOW_24BIT, AFFT_REAL_2048); // move data into afft addr ...; // start iot_afft_start(); // get the output data from afft addr ...; */ /** * @brief afft_data_fmt_t - input word format * @param AFFT_FMT_LOW_24BIT low 24 bit valid * @param AFFT_FMT_HIGH_24BIT high 24 bit valid * @param AFFT_FMT_FLOAT_32BIT 32 bit valid * @param AFFT_FMT_16BIT data[0]: low 16 bit, data[1]: high 16 bit */ /* [TODO]: KL3 need to adapt the previous program */ typedef enum { /* KL2 */ AFFT_FMT_LOW_24BIT = 0, AFFT_FMT_HIGH_24BIT, AFFT_FMT_FLOAT_32BIT, AFFT_FMT_16BIT, /* KL3 */ AFFT_FMT_KL3_32BIT = 0, AFFT_FMT_KL3_LOW_28BIT, AFFT_FMT_KL3_FLOAT_32BIT, AFFT_FMT_KL3_DOUBLE_16BIT_0, //high 16bits is data1, low 16bits is data0 AFFT_FMT_KL3_LOW_24BIT, AFFT_FMT_KL3_LOW_20BIT, AFFT_FMT_KL3_LOW_18BIT, AFFT_FMT_KL3_DOUBLE_16BIT_1, //high 16bits is data0, low 16bits is data1 } afft_data_fmt_t; typedef enum { AFFT_REAL_256 = 0, AFFT_REAL_512, AFFT_REAL_1024, AFFT_REAL_2048, AFFT_REAL_64, AFFT_REAL_128, } afft_real_mode_t; typedef enum { AFFT_COMPLEX_128 = 0, AFFT_COMPLEX_256, AFFT_COMPLEX_512, AFFT_COMPLEX_1024, AFFT_COMPLEX_32, AFFT_COMPLEX_64, } afft_complex_mode_t; typedef enum { AFFT_WIN_RECTANGULAR = 0, AFFT_WIN_HANNING, AFFT_WIN_HAMMING, } afft_win_sel_t; /** * @brief iot_afft_real_fft() - calculate real data fft input format as below: 0 31 0 31 0 ... 31 0 31 |---------|---------|---------|---------| | real[0] | real[1] | ... | real[n] |, data type is real, n is the number of input real data, support 256,512,1024,2048 FFT calculation, reference to afft_real_mode_t struct. Output format as below: 0 31 0 31 0 ... 31 0 31 0 31 |---------|---------|---------|---------|---------| | real[0] | imag[1] | ... | real[m] | imag[m] |, ouput complex data, include real and imaginary part. m is the number of complex data, m = n/2. * @param dst the destination pointer of FFT * @param src the source pointer of real data * @param len the length of source data, uint is word * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_real_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_afft_real_fft(uint32_t *dst, uint32_t *src, uint32_t len, uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); /** * @brief iot_afft_real_ifft() - calculate real data ifft input format as below: 0 31 0 31 0 ... 31 0 31 |---------|---------|---------|---------| | real[0] | real[1] | ... | real[n] |, data type is real, n is the number of input real data, support 256,512,1024,2048 FFT calculation, reference to afft_real_mode_t struct. Output format as below: 0 31 0 31 0 ... 31 0 31 0 31 |---------|---------|---------|---------|---------| | real[0] | imag[1] | ... | real[m] | imag[m] |, ouput complex data, include real and imaginary part. m is the number of complex data, m = n/2. * @param dst the destination pointer of IFFT * @param src the source pointer of real data * @param len the length of source data, uint is word * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_real_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_afft_real_ifft(uint32_t *dst, uint32_t *src, uint32_t len, uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); /** * @brief iot_afft_complex_fft() - calculate complex data fft input format as below: 0 31 0 31 0 ... 31 0 31 0 31 |---------|---------|---------|---------|---------| | real[0] | imag[1] | ... | real[n] | imag[n] |, data type is complex,n is the number of input real data, support 128,256,512,1024 FFT calculation, reference to afft_complex_mode_t struct. Output format as below: 0 31 0 31 0 ... 31 0 31 0 31 |---------|---------|---------|---------|---------| | real[0] | imag[1] | ... | real[m] | imag[m] |, ouput complex data, include real and imaginary part. m is the number of complex data, m = n. * @param dst the destination pointer of FFT * @param src the source pointer of complex data * @param len the length of source data, uint is word * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_complex_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_afft_complex_fft(uint32_t *dst, uint32_t *src, uint32_t len, uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); /** * @brief iot_afft_complex_ifft() - calculate complex data ifft input format as below: 0 31 0 31 0 ... 31 0 31 0 31 |---------|---------|---------|---------|---------| | real[0] | imag[1] | ... | real[n] | imag[n] |, data type is complex,n is the number of input real data, support 128,256,512,1024 FFT calculation, reference to afft_complex_mode_t struct. Output format as below: 0 31 0 31 0 ... 31 0 31 0 31 |---------|---------|---------|---------|---------| | real[0] | imag[1] | ... | real[m] | imag[m] |, ouput complex data, include real and imaginary part. m is the number of complex data, m = n. * @param dst the destination pointer of IFFT * @param src the source pointer of complex data * @param len the length of source data, uint is word * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_complex_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_afft_complex_ifft(uint32_t *dst, uint32_t *src, uint32_t len, uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); void iot_afft_init(); /** * @brief iot_real_fft_cfg() - real data fft configuration * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_real_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_real_fft_cfg(uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); /** * @brief iot_real_ifft_cfg() - real data ifft configuration * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_real_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_real_ifft_cfg(uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); /** * @brief iot_complex_fft_cfg() - complex data fft configuration * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_real_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_complex_fft_cfg(uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); /** * @brief iot_complex_ifft_cfg() - complex data ifft configuration * @param bit the format of data, reference to afft_data_fmt_t * @param mode the mode of TTF, reference to afft_real_mode_t * @param stage the right shift bits of twiddle stage * @param lsf_in the left-shift bits of fft/ifft input * @param rsf_out the right-shift bits of fft/ifft output */ void iot_complex_ifft_cfg(uint8_t bit, uint8_t mode, uint8_t stage, uint8_t lsf_in, uint8_t rsf_out); /** * @brief iot_complex_fft_win() - select window * @param win window, see afft_win_sel_t * @return ERR_OK - success; ERR_NOSUPP - not support */ uint8_t iot_complex_fft_win(afft_win_sel_t win); /** * @brief iot_afft_start() - start to run afft module */ void iot_afft_start(); /** * @brief iot_afft_get_address() - get afft address to read or write * @return return the afft address */ uint32_t iot_afft_get_address(); /** * @brief iot_afft_real_mode_id_get() - get afft mode id * @return return the afft mode id, see afft_real_mode_t */ uint8_t iot_afft_real_mode_id_get(uint32_t data_len); /** * @brief iot_afft_complex_mode_id_get() - get complex fft mode id * @return return the complex mode id, see afft_complex_mode_t */ uint8_t iot_afft_complex_mode_id_get(uint32_t data_len); #ifdef __cplusplus } #endif #endif //IOT_AFFT_API_H