想要进行FFT操作就得配置DSP环境,操作如下
STM32 keil极速配置DSP环境
关于FFT,先上操作再讲含义
操作
添加定义
#define fftsize 256 //对256个数据进行FFT
#define ifftFlag 0
float32_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得到如下图像
数据含直流分量
横坐标 => 一格/(Fs / N)