很感谢@STMCU 把论坛bug修复了,自从换了手机号,好几年的时间都不能参加兑换了,一直是手机号格式不合法,虽然以前也反映过多次,不过bug一直存在。这次不但可以参加了,还兑换到了一块G4开发板,原本是想兑换NUCLEO_STM32F446的
G4系列还是第一次接触,看官网介绍,G4系列,处于主流行产品定位。模拟外设资源丰富,更像F3的升级产品。nucleo-G4板最直观的变化就是板载的仿真器从V2版升级到V3版了,之前主控是STM32F103C8,现在居然是高大上的F7了
因为是第一次使用,电脑还需要安装V3版的驱动
不论是keil还是cubeMX,在安装的PCK里都有DSP的运算库,可以直接调用
直接添加相关的文件到工程中去,因为这里是要测试arm_cfft_f32与arm_rfft_fast_f32两个函数,因此添加如下文件
其中,在lib目录下,有四个文件
其后缀分别是Big endian,Floating Point Unit,Little endian,大端还是小端存储模式,是否支持浮点,因此加入了arm_cortexM4lf_math.lib。
计算FFT要涉及大量的浮点运算,所以首先要打开浮点运算单元,实际在现在的keil版本中,默认都是打开的
省去了以前的开启宏定义:__FPU_USED。
要计算FFT,还有定义几个另外的宏
ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,__FPU_PRESENT
最后包含头文件
- #include "arm_math.h"
- #include "arm_const_structs.h"
- #include "stdio.h"
- #include "stdbool.h"
- #include <stdlib.h>
复制代码
这里省去了FFT的验证内容,就是生成一个合成波数据,对标准数据进行FFT,验证代码的准确性。验证无误后,进行主要的目的,时间测算。ADC采集数据,进行1024点FFT计算
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
- HAL_Delay(50);
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);
- HAL_Delay(50);
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
- HAL_TIM_Base_Start_IT(&htim3);
- HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value_Buff, SIZE);
- HAL_TIM_Base_Start(&htim8);
- while(Buf_OK!=true);
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);
- Buf_OK=false;
- arm_rfft_fast_init_f32(&sfft, FFT_LENGTH);
- for(i=0;i<FFT_LENGTH;i++)
- {
- fft_inputbuf[i]=(float)ADC_Value_Buff[j]*33/40960;
- j=j+2;
- }
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
- arm_rfft_fast_f32(&sfft,fft_inputbuf,fft_outputbuf,0);
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);
- arm_cmplx_mag_f32(fft_outputbuf,fft_outputbuf2,FFT_LENGTH/2);
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
- for(int i=0;i<FFT_LENGTH/2;i++)
- {
- if(i!=0)
- {
- printf("%d: %.2f\r\n",i,fft_outputbuf2[i]*2/1024);
- }
- else
- {
- printf("%d: %.2f\r\n",i,fft_outputbuf2[i]/1024);
- }
- }
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);
- for(int i=0;i<FFT_LENGTH;i++)
- {
- fft_inputbuf[2*i]=(float)ADC_Value_Buff[j]*33/40960;
- fft_inputbuf[2*i+1]=0;
- j+=2;
- }
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
- arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,0,1);
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);
- arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);
- HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
复制代码
arm_cfft_f32与arm_rfft_fast_f32全部用来计算实数,虚数部分程序里做赋0处理。
50ms的启动信号:
ADC采集时间:
数组赋值:
arm_rfft_fast_f32的计算时间,mag_32时间:
printf输出:
数组赋值:
arm_cfft_f32计算时间:
mag_32计算时间:
缩小验证:
示波器测量:
用了好几种方法来测试时间,相互验证,printf函数、RTC函数、定时器、示波器、逻辑分析仪,最后结果统一,说明没问题。可以看出arm_rfft_fast_f32确实要比arm_cfft_f32快很多,对于1024点的计算,一个是434us,一个是710us。 |