/*
 * hal_udsp.h
 *
 *  Created on: 2023年6月25日
 *      Author: jinyaoh
 */

#ifndef DRIVER_INCLUDE_HAL_HAL_UDSP_H_
#define DRIVER_INCLUDE_HAL_HAL_UDSP_H_

#include "platform.h"
/*
 * fft计算输入参数结构体
 * */
typedef struct
{
    //上边界和下边界虚拟连在一起，形成一个类似循环队列。上下边界确定后不需要再改变
    void *in_data_current;      //输入缓存当前地址，当前地址必须在上下边界之间
    void *in_data_low;          //输入缓存下边界地址
    void *in_data_upper;        //输入缓存上边界地址
    void *out_data_current;     //输出缓存当前地址，当前地址必须在上下边界之间
    void *out_data_low;         //输出缓存下边界地址
    void *out_data_upper;       //输出缓存上边界地址
    uint32_t input_size;        //输入每个数据的宽度，例如 sizeof(int)
    uint32_t nmemb;             //输入数据个数，长度只支持 32 64 128 256 512 1024
    uint32_t output_size;       //输出每个数据的宽度，例如 sizeof(int)
    uint32_t win_enable;        //是否对fft计算前加窗 加窗数据计算前加载到buffer1中
    uint32_t spectrum_enable;   //输出求能量
//  uint32_t calculate_over;    //计算完成 需要在中断中调用才有效
} UDSP_FFT_InputStruct;

typedef struct
{
    //上边界和下边界虚拟连在一起，形成一个类似循环队列。上下边界确定后不需要再改变
    void *in_data_current;      //输入缓存当前地址，当前地址必须在上下边界之间
    void *in_data_low;          //输入缓存下边界地址
    void *in_data_upper;        //输入缓存上边界地址
    void *out_data_current;     //输出缓存当前地址，当前地址必须在上下边界之间
    void *out_data_low;         //输出缓存下边界地址
    void *out_data_upper;       //输出缓存上边界地址
    uint32_t input_size;    //输入每个数据的宽度，例如 sizeof(int)
    uint32_t nmemb;         //输入数据个数，长度只支持 32 64 128 256 512 1024
    uint32_t output_size;   //输出每个数据的宽度，例如 sizeof(int)
    int32_t *complex_temp;      //是否对fft计算前加窗

} UDSP_IRFFT_InputStruct;


typedef struct
{
    int16_t real;
    int16_t imag;
} complex16_number_type;

typedef struct
{
    int32_t real;
    int32_t imag;
} complex32_number_type;

typedef struct
{
    int32_t cos;
    int32_t sin;
} udsp_cosine_number_type;



void hal_udsp_init();
void hal_udsp_cmd(uint32_t channelx, uint32_t state);
uint32_t hal_udsp_get_cmd_status(uint32_t channelx);
void hal_udsp_load_buffer1(int channel, void *coef, uint32_t size, uint32_t nmemb, uint32_t bur_addr);
int hal_udsp_irfft(int channel, UDSP_IRFFT_InputStruct *irfft_struct);
int32_t hal_udsp_fir_c1024_d1536_q31(int32_t channel, int32_t *x, int32_t *y, int32_t *coeff);
int32_t hal_udsp_rfft(int channel, UDSP_FFT_InputStruct *fft_struct);
int hal_udsp_actan2(uint32_t channel, complex32_number_type *complex_data, int16_t *radian, uint32_t nmemb);
int32_t hal_udsp_ln(int32_t channel, uint64_t *in_data, int16_t *out_data, uint32_t nmemb);
int32_t hal_udsp_cosine(uint32_t channel, int32_t *radian_q29, udsp_cosine_number_type *cosine_q31, uint32_t nmemb);
int32_t hal_udsp_sqrt(int32_t channel, int64_t *in_data, int64_t *out_data, uint32_t nmemb);
int32_t hal_udsp_div(int32_t channel, int32_t *in_data, uint32_t *out_data, uint32_t nmemb);
int32_t hal_udsp_vmul_32x32(int32_t channel, int32_t *in_data0, int32_t *in_data1, int32_t *out_data, uint32_t nmemb);
int32_t hal_udsp_matrix_mul(int32_t channel, int32_t *in_data, int32_t *out_data, uint16_t nrow, uint16_t mcol);


#endif /* DRIVER_INCLUDE_HAL_HAL_UDSP_H_ */
