FFT

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

备注

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_StartFFTHAL_FFT_StartDCT 等函数处理数据。

备注

源和目的地址需要保证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)
{
    FFT_ConfigTypeDef config;
    HAL_StatusTypeDef res;

    /* 初始化 */
    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)
{
    FFT_ConfigTypeDef config;
    HAL_StatusTypeDef res;

    /* 初始化 */
    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)
    {
    }
}

API参考

bf0_hal_fft.h