本帖最后由 sky.sun.zz 于 2015-9-30 16:50 编辑
使用f446re开发板来运行傅里叶运算,是STM32F4系列的强项。
编译环境使用MDK5.14版。在Project中加入ST的DSP库:
添加DSP库
目录树
本例使用DSP库里面的基4浮点FFT算法,输入点数为1024点。模拟输入的信号直流分量为100,外加2个幅值分别为10和30的正弦信号和一个幅值为50的余弦信号。
为了测试运算速度,将GPIOC-10设置成输出,每次运算结束后翻转PC10,实测STM32F446做一次1024点的FFT运算耗时4毫秒。
#include "stm32f4xx.h"
#include "arm_math.h"
#define FFT_LENGTH 1024
float inputbuf[FFT_LENGTH*2];
float outputbuf[FFT_LENGTH];
static void FFT_read(void);
static void GPIO_Config(void);
int main(void)
{
SystemInit();
SysTick_Init();
GPIO_Config();
while(1)
{
FFT_read();
GPIOC->ODR ^=0X0400;
}
}
static void FFT_read(void)
{uint16_t i;
arm_cfft_radix4_instance_f32 scfft;
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);
for(i=0;i<FFT_LENGTH;i++)
{
inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*4/FFT_LENGTH)+50*arm_cos_f32(2*PI*i*8/FFT_LENGTH);
inputbuf[2*i+1]=0;
}
arm_cfft_radix4_f32(&scfft,inputbuf);
arm_cmplx_mag_f32(inputbuf,outputbuf,FFT_LENGTH);
}
static void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
运行结果部分截图:
|