207 lines
14 KiB
C
207 lines
14 KiB
C
#ifndef __FFTVEC_MATH_DRV_H_
|
|
#define __FFTVEC_MATH_DRV_H_
|
|
|
|
typedef struct {
|
|
unsigned long fft_con;
|
|
unsigned long fft_iadr;
|
|
unsigned long fft_oadr;
|
|
unsigned long fft_null;
|
|
} hwfft_ctx_t;
|
|
|
|
#define COMPLEX_FFT10_CONFIG ((2<<28)|(10<<16)|(1<<8)|(1<<13)|(0<<12)|(0<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT10_CONFIG ((2<<28)|(10<<16)|(1<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.125
|
|
#define COMPLEX_FFT20_CONFIG ((2<<28)|(20<<16)|(2<<8)|(1<<13)|(0<<12)|(0<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT20_CONFIG ((3<<28)|(20<<16)|(2<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.125
|
|
#define COMPLEX_FFT15_CONFIG ((2<<28)|(15<<16)|(0<<8)|(1<<13)|(1<<12)|(0<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT15_CONFIG ((2<<28)|(15<<16)|(0<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.875
|
|
#define COMPLEX_FFT30_CONFIG ((2<<28)|(30<<16)|(1<<8)|(1<<13)|(1<<12)|(0<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT30_CONFIG ((3<<28)|(30<<16)|(1<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.875
|
|
#define COMPLEX_FFT32_CONFIG ((2<<28)|(32<<16)|(5<<8)|(0<<13)|(0<<12)|(1<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT32_CONFIG ((4<<28)|(32<<16)|(5<<8)|(0<<13)|(0<<12)|(1<<4)|(1<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_FFT40_CONFIG ((2<<28)|(40<<16)|(3<<8)|(1<<13)|(0<<12)|(0<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT40_CONFIG ((4<<28)|(40<<16)|(3<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.25
|
|
#define COMPLEX_FFT60_CONFIG ((2<<28)|(60<<16)|(2<<8)|(1<<13)|(1<<12)|(0<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT60_CONFIG ((2<<28)|(60<<16)|(2<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.875
|
|
#define COMPLEX_FFT64_CONFIG ((2<<28)|(64<<16)|(6<<8)|(0<<13)|(0<<12)|(2<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT64_CONFIG ((3<<28)|(64<<16)|(6<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_FFT80_CONFIG ((2<<28)|(80<<16)|(4<<8)|(1<<13)|(0<<12)|(1<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT80_CONFIG ((3<<28)|(80<<16)|(4<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.25
|
|
#define COMPLEX_FFT120_CONFIG ((2<<28)|(120<<16)|(3<<8)|(1<<13)|(1<<12)|(0<<4)|(0<<2)|(0<<1)) // res x 1 1778 cyc
|
|
#define COMPLEX_IFFT120_CONFIG ((3<<28)|(120<<16)|(3<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.875
|
|
#define COMPLEX_FFT128_CONFIG ((2<<28)|(128<<16)|(7<<8)|(0<<13)|(0<<12)|(2<<4)|(0<<2)|(0<<1)) // res x 1 1660 cyc
|
|
#define COMPLEX_IFFT128_CONFIG ((4<<28)|(128<<16)|(7<<8)|(0<<13)|(0<<12)|(1<<4)|(1<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_FFT160_CONFIG ((2<<28)|(160<<16)|(5<<8)|(1<<13)|(0<<12)|(1<<4)|(0<<2)|(0<<1)) // res x 1 2189
|
|
#define COMPLEX_IFFT160_CONFIG ((4<<28)|(160<<16)|(5<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.25
|
|
#define COMPLEX_FFT240_CONFIG ((2<<28)|(240<<16)|(4<<8)|(1<<13)|(1<<12)|(1<<4)|(0<<2)|(0<<1)) // res x 1 3336
|
|
#define COMPLEX_IFFT240_CONFIG ((4<<28)|(240<<16)|(4<<8)|(1<<13)|(1<<12)|(1<<4)|(1<<2)|(0<<1)) // res x 1.875
|
|
#define COMPLEX_FFT256_CONFIG ((2<<28)|(256<<16)|(8<<8)|(0<<13)|(0<<12)|(3<<4)|(0<<2)|(0<<1)) // res x 1 3456
|
|
#define COMPLEX_IFFT256_CONFIG ((3<<28)|(256<<16)|(8<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_FFT320_CONFIG ((2<<28)|(320<<16)|(6<<8)|(1<<13)|(0<<12)|(2<<4)|(0<<2)|(0<<1)) // res x 1 4133
|
|
#define COMPLEX_IFFT320_CONFIG ((3<<28)|(320<<16)|(6<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.25
|
|
#define COMPLEX_FFT480_CONFIG ((2<<28)|(480<<16)|(5<<8)|(1<<13)|(1<<12)|(2<<4)|(0<<2)|(0<<1)) // res x 1 8023
|
|
#define COMPLEX_IFFT480_CONFIG ((3<<28)|(480<<16)|(5<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1.875
|
|
#define COMPLEX_FFT512_CONFIG ((2<<28)|(512<<16)|(9<<8)|(0<<13)|(0<<12)|(3<<4)|(0<<2)|(0<<1)) // res x 1 7780
|
|
#define COMPLEX_IFFT512_CONFIG ((4<<28)|(512<<16)|(9<<8)|(0<<13)|(0<<12)|(1<<4)|(1<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_FFT960_CONFIG ((2<<28)|(960<<16)|(6<<8)|(1<<13)|(1<<12)|(2<<4)|(0<<2)|(0<<1)) // res x 1 15469
|
|
#define COMPLEX_IFFT960_CONFIG ((4<<28)|(960<<16)|(6<<8)|(1<<13)|(1<<12)|(1<<4)|(1<<2)|(0<<1)) // res x 1.875
|
|
#define COMPLEX_FFT1024_CONFIG ((2<<28)|(1024<<16)|(10<<8)|(0<<13)|(0<<12)|(4<<4)|(0<<2)|(0<<1)) // res x 1 16262
|
|
#define COMPLEX_IFFT1024_CONFIG ((3<<28)|(1024<<16)|(10<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_FFT2048_CONFIG ((2<<28)|(2048<<16)|(11<<8)|(0<<13)|(0<<12)|(4<<4)|(0<<2)|(0<<1)) // res x 1
|
|
#define COMPLEX_IFFT2048_CONFIG ((4<<28)|(2048<<16)|(11<<8)|(0<<13)|(0<<12)|(1<<4)|(1<<2)|(0<<1)) // res x 1
|
|
|
|
|
|
//LAST_DIV FFT_NU LOG2 FFT5 FFT3 fft4_sDIV4 IFF REAL
|
|
#define REAL_FFT20_CONFIG ((3<<28)|(20<<16)|(1<<8)|(1<<13)|(0<<12)|(0<<4)|(0<<2)|(1<<1)) // res x 1 180
|
|
#define REAL_IFFT20_CONFIG ((3<<28)|(20<<16)|(1<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.125
|
|
#define REAL_FFT30_CONFIG ((3<<28)|(30<<16)|(0<<8)|(1<<13)|(1<<12)|(0<<4)|(0<<2)|(1<<1)) // res x 1 238
|
|
#define REAL_IFFT30_CONFIG ((3<<28)|(30<<16)|(0<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.875
|
|
#define REAL_FFT40_CONFIG ((3<<28)|(40<<16)|(2<<8)|(1<<13)|(0<<12)|(0<<4)|(0<<2)|(1<<1)) // res x 1 292
|
|
#define REAL_IFFT40_CONFIG ((4<<28)|(40<<16)|(2<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.25
|
|
#define REAL_FFT60_CONFIG ((3<<28)|(60<<16)|(1<<8)|(1<<13)|(1<<12)|(0<<4)|(0<<2)|(1<<1)) // res x 1 516
|
|
#define REAL_IFFT60_CONFIG ((4<<28)|(60<<16)|(1<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.875
|
|
#define REAL_FFT64_CONFIG ((3<<28)|(64<<16)|(5<<8)|(0<<13)|(0<<12)|(1<<4)|(0<<2)|(1<<1)) // res x 1 485
|
|
#define REAL_IFFT64_CONFIG ((3<<28)|(64<<16)|(5<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1
|
|
#define REAL_FFT80_CONFIG ((3<<28)|(80<<16)|(3<<8)|(1<<13)|(0<<12)|(1<<4)|(0<<2)|(1<<1)) // res x 1 635
|
|
#define REAL_IFFT80_CONFIG ((3<<28)|(80<<16)|(3<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.25
|
|
#define REAL_FFT120_CONFIG ((3<<28)|(120<<16)|(2<<8)|(1<<13)|(1<<12)|(0<<4)|(0<<2)|(1<<1)) // res x 1 934 cyc
|
|
#define REAL_IFFT120_CONFIG ((3<<28)|(120<<16)|(2<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.875
|
|
#define REAL_FFT128_CONFIG ((3<<28)|(128<<16)|(6<<8)|(0<<13)|(0<<12)|(2<<4)|(0<<2)|(1<<1)) // res x 1 912 cyc
|
|
#define REAL_IFFT128_CONFIG ((4<<28)|(128<<16)|(6<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1
|
|
#define REAL_FFT160_CONFIG ((3<<28)|(160<<16)|(4<<8)|(1<<13)|(0<<12)|(1<<4)|(0<<2)|(1<<1)) // res x 1 1133
|
|
#define REAL_IFFT160_CONFIG ((4<<28)|(160<<16)|(4<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.25
|
|
#define REAL_FFT240_CONFIG ((3<<28)|(240<<16)|(3<<8)|(1<<13)|(1<<12)|(1<<4)|(0<<2)|(1<<1)) // res x 1 2155
|
|
#define REAL_IFFT240_CONFIG ((4<<28)|(240<<16)|(3<<8)|(1<<13)|(1<<12)|(1<<4)|(1<<2)|(1<<1)) // res x 1.875
|
|
#define REAL_FFT256_CONFIG ((3<<28)|(256<<16)|(7<<8)|(0<<13)|(0<<12)|(3<<4)|(0<<2)|(1<<1)) // res x 1 2061
|
|
#define REAL_IFFT256_CONFIG ((3<<28)|(256<<16)|(7<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1
|
|
#define REAL_FFT320_CONFIG ((3<<28)|(320<<16)|(5<<8)|(1<<13)|(0<<12)|(2<<4)|(0<<2)|(1<<1)) // res x 1 2686
|
|
#define REAL_IFFT320_CONFIG ((3<<28)|(320<<16)|(5<<8)|(1<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.25
|
|
#define REAL_FFT480_CONFIG ((3<<28)|(480<<16)|(4<<8)|(1<<13)|(1<<12)|(2<<4)|(0<<2)|(1<<1)) // res x 1 4073
|
|
#define REAL_IFFT480_CONFIG ((3<<28)|(480<<16)|(4<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.875
|
|
#define REAL_FFT512_CONFIG ((3<<28)|(512<<16)|(8<<8)|(0<<13)|(0<<12)|(3<<4)|(0<<2)|(1<<1)) // res x 1 4239
|
|
#define REAL_IFFT512_CONFIG ((4<<28)|(512<<16)|(8<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1
|
|
#define REAL_FFT960_CONFIG ((3<<28)|(960<<16)|(5<<8)|(1<<13)|(1<<12)|(2<<4)|(0<<2)|(1<<1)) // res x 1 9480
|
|
#define REAL_IFFT960_CONFIG ((4<<28)|(960<<16)|(5<<8)|(1<<13)|(1<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1.875
|
|
#define REAL_FFT1024_CONFIG ((3<<28)|(1024<<16)|(9<<8)|(0<<13)|(0<<12)|(4<<4)|(0<<2)|(1<<1))// res x 1 9333
|
|
#define REAL_IFFT1024_CONFIG ((3<<28)|(1024<<16)|(9<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1))// res x 1
|
|
#define REAL_FFT2048_CONFIG ((3<<28)|(2048<<16)|(10<<8)|(0<<13)|(0<<12)|(4<<4)|(0<<2)|(1<<1)) // res x 1 19351
|
|
#define REAL_IFFT2048_CONFIG ((4<<28)|(2048<<16)|(10<<8)|(0<<13)|(0<<12)|(0<<4)|(1<<2)|(1<<1)) // res x 1
|
|
|
|
#define FFT_SAME_ADR (1<<0)
|
|
|
|
|
|
|
|
typedef struct {
|
|
unsigned long vector_con;
|
|
unsigned long vector_xadr;
|
|
unsigned long vector_yadr;
|
|
unsigned long vector_zadr;
|
|
unsigned long vector_config0;
|
|
unsigned long vector_config1;
|
|
unsigned long vector_config2;
|
|
unsigned long null;
|
|
} hwvec_ctx_t;
|
|
|
|
|
|
#define VECX_S32 (2<<6) //x输入位宽32bit
|
|
#define VECX_S16 (1<<6) //x输入位宽16bit
|
|
#define VECX_S8 (0<<6) //x输入位宽8bit
|
|
|
|
#define VECY_S32 (2<<8) //y输入位宽32bit
|
|
#define VECY_S16 (1<<8) //y输入位宽16bit
|
|
#define VECY_S8 (0<<8) //y输入位宽8bit
|
|
|
|
#define VECZ_S64 (3<<10) //z输入输出位宽64bit(只用于复数平方运算)
|
|
#define VECZ_S32 (2<<10) //z输入输出位宽32bit
|
|
#define VECZ_S16 (1<<10) //z输入输出位宽16bit
|
|
#define VECZ_S8 (0<<10) //z输入输出位宽8bit
|
|
|
|
|
|
#define VEC_MIN (1<<20) //实数与CONST比较取最小值
|
|
#define VEC_MAX (1<<19) //实数与CONST比较取最大值
|
|
#define VEC_CPX_QDT (1<<18) //复数平方运算
|
|
#define VEC_CONST_MUL (1<<17) //常数乘矢量运算
|
|
#define VEC_RES_NEG_ZERO (1<<16) //当运算结果为负数时, 将输出结果设为0
|
|
#define VEC_MAC32 (1<<15) //复数或实数乘加运算(只支持32位运算)
|
|
#define VEC_QDT (1<<14) //平方运算
|
|
#define VECY_CONJ (1<<13) //复数乘时, 输入y_data先做共轭运算(Y_CONJ与X_CONJ不能同时配置)
|
|
#define VECX_CONJ (1<<12) //复数乘时, 输入x_data先做共轭运算(Y_CONJ与X_CONJ不能同时配置)
|
|
|
|
#define VEC_ACC (1<<5) //矢量点乘累加运算
|
|
#define VEC_SUB (1<<4) //矢量减法运算
|
|
|
|
#define VEC_REAL_ADDSUB_MODE (0<<0) //实数加减法运算
|
|
#define VEC_REAL_MUL_MODE (1<<0) //实数乘法运算
|
|
#define VEC_CPX_MUL_MODE (2<<0) //复数乘法运算
|
|
#define VEC_QDT_MODE (3<<0) //平方运算
|
|
|
|
|
|
// FIX_ME,借用硬件无用到的BIT
|
|
#define VEC_CPY_REAL_OR_VEC (1<<31) //区分复制长度是实数还是向量, just for mark,
|
|
#define VEC_ZPTR_CPY (1<<30) //是否需要复制输入ZPTR, just for mark,
|
|
#define VEC_ZPTR_CPY_DOT (1<<29) //区分ZPTR输出结果复制长度是一个点还是向量, just for mark,
|
|
#define VEC_YPTR_NOCPY (1<<28) //是否需要复制输入YPTR, just for mark,
|
|
|
|
|
|
void hwfft_exec_batch(hwfft_ctx_t *ctx, int nbatch);
|
|
void hwfft_exec_once(hwfft_ctx_t *ctx);
|
|
int hwfft_get_nfft(unsigned long fft_config);
|
|
//0---forward 1---backward
|
|
int hwfft_get_backward(unsigned long fft_config);
|
|
//0---complex 1---real
|
|
int hwfft_get_real(unsigned long fft_config);
|
|
int hwfft_check_fft_config(unsigned long fft_config, int nfft, int backward, int real);
|
|
void hwfft_fill_fft_ctx(hwfft_ctx_t *ctx, unsigned long fft_config, long *iadr, long *oadr);
|
|
void hwfft_ifft_scale(long *iadr, int nfft);
|
|
void hwfft_fft_i32(hwfft_ctx_t *ctx);
|
|
void hwfft_ifft_i32(hwfft_ctx_t *ctx);
|
|
void hwfft_fft_f32(hwfft_ctx_t *ctx, float scale);
|
|
void hwfft_ifft_f32(hwfft_ctx_t *ctx, float scale);
|
|
|
|
void fast_i2f(const int *in, float *out, int N, float scale);
|
|
void fast_f2i(const float *in, int *out, int N, float scale);
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//VECTOR
|
|
|
|
void hwvec_exec(
|
|
void *xptr,
|
|
void *yptr,
|
|
void *zptr,
|
|
short x_inc,
|
|
short y_inc,
|
|
short z_inc,
|
|
short nlen,
|
|
short nloop,
|
|
char q,
|
|
long config,
|
|
long const_dat
|
|
);
|
|
|
|
void vector_complex_add(void *zptr, void *yptr, void *xptr, short len, long config);
|
|
void vector_complex_sub(void *zptr, void *yptr, void *xptr, short len, long config);
|
|
void vector_complex_mul(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_complex_mac32(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_complex_msc32(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_complex_dot_product(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_complex_qdt(void *zptr, void *xptr, short len, char q, long config);
|
|
void vector_complex_qdtsum(void *zptr, void *xptr, short len, char q, long config);
|
|
void vector_real_add(void *zptr, void *yptr, void *xptr, short len, long config);
|
|
void vector_real_add_dot_product(void *zptr, void *yptr, void *xptr, short len, long config);
|
|
void vector_real_sub(void *zptr, void *yptr, void *xptr, short len, long config);
|
|
void vector_real_mul(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_real_mac32(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_real_msc32(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_real_dot_product(void *zptr, void *yptr, void *xptr, short len, char q, long config);
|
|
void vector_real_sum(void *zptr, void *xptr, short len, char q, long config);
|
|
void vector_real_sum_dot_product(void *zptr, void *xptr, short len, char q, long config);
|
|
void vector_real_qdt(void *zptr, void *xptr, short len, char q, long config);
|
|
void vector_real_qdtsum(void *zptr, void *xptr, short len, char q, long config);
|
|
void vector_real_mac_const(void *zptr, void *yptr, void *xptr, short len, char q, long const_dat, long config);
|
|
void vector_real_msc_const(void *zptr, void *yptr, void *xptr, short len, char q, long const_dat, long config);
|
|
void vector_real_mul_const(void *zptr, void *xptr, short len, char q, long const_dat, long config);
|
|
void vector_real_max(void *zptr, void *xptr, short len, char q, long config, long const_dat);
|
|
void vector_real_min(void *zptr, void *xptr, short len, char q, long config, long const_dat);
|
|
|
|
#endif
|