stm32使用dsp库计算FFT

发布于 2019-11-26  740 次阅读


1、代码设置
    如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到HardFault_Handler()中断函数中死循环。因此,需要在系统初始化时开启FPU。在system_stm32f4xx.c中的SystemInit()函数中添加如下代码:
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
 
2、编译控制
    从上面的代码可以看出,当__FPU_PRESENT=1__FPU_USED=1时,编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。但是对于复杂运算要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h而非编译器自带的math.h,这个文件根据编译控制项(__FPU_USED ==1)来决定是使用哪一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
   在arm_math.h开头部分有一些编译控制信息:

#ifndef _ARM_MATH_H
#define _ARM_MATH_H

#define __CMSIS_GENERIC              /* disable NVIC and Systick functions */

#if defined (ARM_MATH_CM4)
  #include "core_cm4.h"
#elif defined (ARM_MATH_CM3)
  #include "core_cm3.h"
#elif defined (ARM_MATH_CM0)
  #include "core_cm0.h"
#else
#include "ARMCM4.h"
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
#endif

#undef  __CMSIS_GENERIC              /* enable NVIC and Systick functions */
  #include "string.h"
  #include "math.h"

从中可以看出,为了使用STM32F4的arm_math.h,我们需要定义ARM_MATH_CM4;否则如果不使用CMSIS的库,就会调用Keil自带的math.h。

    另外,定义控制项__CC_ARM在某些数学函数中会使用VSQRT指令(浮点运算指令),运算速度比Q指令要快很多。
    总结一下,需要在Project->Options for target"XXXX")中的C/C++选项卡的Preprocessor Symbols栏的Define中加入如下的语句:ARM_MATH_CM4, __FPU_PRESENT=1, __FPU_USED =1, __CC_ARM

注意中间用英文逗号分开。其中ARM_MATH_MATRIX_CHECK是库函数的参数检查开关,这里添加后,就打开。ARM_MATH_ROUNDING这个是库函数在运算是是否开启四舍五入的功能,我这里添加,可以根据自己的需要进行配置。ARM_MATH_CM4这个就非常重要,必须要配置进去,否则在编译之后,会默认使用math.h的库函数,而不会用到硬件的FPU的。__CC_ARM是不同编译器的编译配置宏定义,__CC_ARM就是代表MDK开发环境。

3、keilv5 添加DSP库文件

4、使用DSP库文件

#include "arm_math.h"
//0:正变换 1:逆变换
uint8_t ifftFlag = 0;
arm_rfft_fast_instance_f32 S;
//初始化fft函数
arm_rfft_fast_init_f32(&S, fftSize);
//进行fft计算
arm_rfft_fast_f32(&S,testInput_f32, testOutput_f32, ifftFlag);
//求取fft模值 
arm_cmplx_mag_f32(testOutput_f32, testOutput, fftSize);


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。