本帖最后由 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。
|