思澈科技软件开发工具包  2.20
FFT

HAL FFT 模块提供抽象的软件接口操作硬件FFT模块,实现定点数的FFT和DCT变换

Note
SF32LB55x不支持FFT
SF32LB58x不支持DCT

详细的API说明参考 FFT .

使用HAL FFT

首先调用 HAL_FFT_Init 初始化HAL_FFT, 需要在 FFT_HandleTypeDef 中指定使用的FFT硬件模块(即FFT实例),FFT实例个数随芯片有所不同,如SF32LB58x系列有两个FFT实例,::hwp_fft1和::hwp_fft2,而 SF32LB56x系列则只有一个FFT实例,即::hwp_fft1。初始化只需做一次,之后就可以调用 HAL_FFT_StartFFT 、::HAL_FFT_StartDCT 等函数处理数据。

Note
源和目的地址需要保证4字节对齐,支持源和目的地址相同
在初始化HAL_FFT之前需先执行HAL_RCC_EnableModule使能相应的FFT模块

例如,

static FFT_HandleTypeDef fft_handle;
void init_fft(void)
{ // Initialize driver and enable FFT IRQ
HAL_NVIC_SetPriority(FFT1_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(FFT1_IRQn);
HAL_RCC_EnableModule(RCC_MOD_FFT1);
fft_handle.Instance = hwp_fft1 ;
HAL_FFT_Init(&fft_handle);
}

轮询模式

static uint32_t input_data[512];
static uint32_t output_data[512];
void fft_example_polling(void)
{
/* 初始化 */
memset(&config, 0, sizeof(config));
/* 512点16比特复数FFT */
config.bitwidth = FFT_BW_16BIT;
config.fft_length = FFT_LEN_512;
config.ifft_flag = 0;
config.rfft_flag = 0;
config.input_data = input_data;
config.output_data = output_data;
res = HAL_FFT_StartFFT(&fft_handle, &config);
}

中断模式

volatile static uint8_t fft_done_flag;
static uint32_t input_data[512];
static uint32_t output_data[512];
/* FFT1 IRQ ISR in vector table */
void FFT1_IRQHandler(void)
{
HAL_FFT_IRQHandler(&fft_handle);
}
static void fft_done(FFT_HandleTypeDef *fft)
{
fft_done_flag = 1;
}
void fft_example_it(void)
{
/* 初始化 */
memset(&config, 0, sizeof(config));
/* 512点16比特的复数FFT */
config.bitwidth = FFT_BW_16BIT;
config.fft_length = FFT_LEN_512;
config.ifft_flag = 0;
config.rfft_flag = 0;
config.input_data = input_data;
config.output_data = output_data;
fft_done_flag = 0;
fft_handle.CpltCallback = fft_done;
res = HAL_FFT_StartFFT_IT(&fft_handle, &config);
/* wait for interrupt, fft_done_flag is changed to 1 in fft_done */
while (0 == fft_done_flag)
{
}
}
HAL_RCC_EnableModule
void HAL_RCC_EnableModule(RCC_MODULE_TYPE module)
Enable module if it's disabled.
__FFT_HandleTypeDef
Definition: bf0_hal_fft.h:77
HAL_FFT_Init
HAL_StatusTypeDef HAL_FFT_Init(FFT_HandleTypeDef *fft)
Init FFT Accelerator.
FFT_ConfigTypeDef::fft_length
FFT_FFTLengthTypeDef fft_length
Definition: bf0_hal_fft.h:129
FFT_ConfigTypeDef::output_data
void * output_data
Definition: bf0_hal_fft.h:137
HAL_FFT_StartFFT
HAL_StatusTypeDef HAL_FFT_StartFFT(FFT_HandleTypeDef *fft, FFT_ConfigTypeDef *config)
Start FFT in synchronous mode.
FFT_ConfigTypeDef::ifft_flag
uint8_t ifft_flag
Definition: bf0_hal_fft.h:133
__FFT_HandleTypeDef::CpltCallback
void(* CpltCallback)(struct __FFT_HandleTypeDef *fft)
Definition: bf0_hal_fft.h:79
__FFT_HandleTypeDef::Instance
FFT_TypeDef * Instance
Definition: bf0_hal_fft.h:78
FFT_ConfigTypeDef
Definition: bf0_hal_fft.h:122
HAL_FFT_StartFFT_IT
HAL_StatusTypeDef HAL_FFT_StartFFT_IT(FFT_HandleTypeDef *fft, FFT_ConfigTypeDef *config)
Start FFT in asynchronous mode.
FFT_ConfigTypeDef::rfft_flag
uint8_t rfft_flag
Definition: bf0_hal_fft.h:131
HAL_NVIC_SetPriority
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
Set the priority of an interrupt.
HAL_StatusTypeDef
HAL_StatusTypeDef
HAL Status structures definition.
Definition: bf0_hal_def.h:74
HAL_NVIC_EnableIRQ
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
Enable a device specific interrupt in the NVIC interrupt controller.
FFT_ConfigTypeDef::input_data
void * input_data
Definition: bf0_hal_fft.h:135