想要进行FFT操作就得配置DSP环境,操作如下
STM32 keil极速配置DSP环境
关于FFT,先上操作再讲含义
操作
添加定义
#define fftsize 256 //对256个数据进行FFT
#define ifftFlag 0float32_t testInput_f32[256]={0};
float32_t testOutput_f32[256]={0};
float32_t testOutputMag_f32[256]={0};
while循环代码
while (1){HAL_Delay(1000);HAL_GPIO_WritePin(Start_GPIO_Port,Start_Pin,GPIO_PIN_RESET);HAL_Delay(100);HAL_GPIO_WritePin(Start_GPIO_Port,Start_Pin,GPIO_PIN_SET);HAL_SPI_Receive(&hspi1,(uint8_t *)data2,260,0xff);
//SPI接收数据for(int i=2;i<258;i++){testInput_f32[i-2]=data2[i]*5.0/4096;}
/*---------------------FFT----------------------------- */ arm_rfft_fast_instance_f32 d; arm_rfft_fast_init_f32(&d, fftsize); arm_rfft_fast_f32(&d, testInput_f32, testOutput_f32, ifftFlag); arm_cmplx_mag_f32(testOutput_f32, testOutputMag_f32, fftsize);for(int i=0;i<128;i++){printf("%f\r\n",testOutputMag_f32[i]);} /* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
含义
#define fftsize 256 //对256个数据进行FFT
//0正变换 1逆变换
#define ifftFlag 0//定义结构体
arm_rfft_fast_instance_f32 d;
//初始化
arm_rfft_fast_init_f32(&d, fftsize);
//进行快速傅里叶变换
arm_rfft_fast_f32(&d, testInput_f32, testOutput_f32, ifftFlag);
//testInput_f32为输入的数据
// testOutput_f32 变换后生成复数域,即1实数1虚数 总数还为256//求模值,最后生成一半的点(128)
arm_cmplx_mag_f32(testOutput_f32, testOutputMag_f32, fftsize);
对方波进行FFT得到如下图像
数据含直流分量
横坐标 => 每一横坐标点代表 F S N / 2 \frac{F_S}{N/2} N/2FS的频率
比如采样率为256Hz,N为256个点,横坐标的分辨率为2Hz