本帖最后由 sky.sun.zz 于 2016-7-31 19:14 编辑
评测(4)FFT 这个FFT评测利用原来的UART.C修改而成。 1、打开工程,在manage_Run-Time Environment中添加DSP库: 2、在Options for Target “ STM32F767ZI-Nucleo”的-C/C++中Define添加:ARM_MATH_CM7 __FPU_PRESENT=1 3、添加FFT_DATA.C文件 在程序上生成了一个输入信号序列用于测试,输入信号序列表达式: for(i=0;i<FFT_LENGTH;i++) { inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i*50/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*200/FFT_LENGTH)+10*arm_cos_f32(2*PI*i*400/FFT_LENGTH); inputbuf[2*i+1]=0; } 通过该表达式我们可知,信号的直流分量为100,外加2个正弦信号和一个余弦信号,其幅值分别为10、30和10。 同时将取模后的模值大于1时通过串口打印出来。可以看出:624以后的数据是前面数据的镜像。
- #define BUFFER_SIZE 1024
- #define FFT_LENGTH 1024
- float inputbuf[BUFFER_SIZE*2];
- float outputbuf[BUFFER_SIZE];
- int main(void)
- {
- MPU_Config();
- CPU_CACHE_Enable();
- HAL_Init();
- SystemClock_Config();
- BSP_LED_Init(LED3);
- UartHandle.Instance = USARTx;
- UartHandle.Init.BaudRate = 9600;
- UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
- UartHandle.Init.StopBits = UART_STOPBITS_1;
- UartHandle.Init.Parity = UART_PARITY_ODD;
- UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- UartHandle.Init.Mode = UART_MODE_TX_RX;
- UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
- if (HAL_UART_Init(&UartHandle) != HAL_OK)
- {
- Error_Handler();
- }
- printf("\n\r STM32F767ZI-Nucleo-144 FFT demo\n\r");
- FFT_read();
- while (1)
- {
-
- }
- }
- static void CPU_CACHE_Enable(void)
- {
- /* Enable I-Cache */
- SCB_EnableICache();
- /* Enable D-Cache */
- SCB_EnableDCache();
- }
- static void MPU_Config (void) {
- MPU_Region_InitTypeDef MPU_InitStruct;
-
- /* Disable the MPU */
- HAL_MPU_Disable();
- /* Configure the MPU attributes as WT for SRAM */
- MPU_InitStruct.Enable = MPU_REGION_ENABLE;
- MPU_InitStruct.BaseAddress = 0x20010000;
- MPU_InitStruct.Size = MPU_REGION_SIZE_256KB;
- MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
- MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
- MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
- MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
- MPU_InitStruct.Number = MPU_REGION_NUMBER0;
- MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
- MPU_InitStruct.SubRegionDisable = 0x00;
- MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
- HAL_MPU_ConfigRegion(&MPU_InitStruct);
- /* Enable the MPU */
- HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
- }
- static void FFT_read(void)
- {uint16_t i;
- arm_cfft_radix4_instance_f32 scfft;
- arm_cfft_radix4_init_f32(&scfft,BUFFER_SIZE,0,1);
- for(i=0;i<FFT_LENGTH;i++)
- {
- inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i*50/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*200/FFT_LENGTH)+10*arm_cos_f32(2*PI*i*400/FFT_LENGTH);
- inputbuf[2*i+1]=0;
- }
- arm_cfft_radix4_f32(&scfft,inputbuf);
- arm_cmplx_mag_f32(inputbuf,outputbuf,BUFFER_SIZE);
-
- for(i=0;i<1024;i++)
- {
- if((uint32_t)outputbuf[i]>1)
- {
- printf("\n\r%4d \n\r",i);
- printf("\n\r%f \n\r",outputbuf[i]);
- }
- }
- }
最后。测试一下STM32F767运行FFT的速度,去掉FFT_read()函数中的printf输出语句,在主循环中加入:
for(i=0;i<100;i++)
{
FFT_read();
}
GPIOB->ODR ^=0X4000;
实测PB14(LED3)上脉冲为150mS,可知:STM32F767做1次1024点的FFT大概需要1.5mS,相比之下STM32F446需要4mS。
|