测试环境:单片机:STM32F407ZGT6   IDE:Keil5.20.0.0  固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0

第一部分:使用源码文件的方式,使用void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 * S,float32_t * pSrc)函数进行FFT运算。

准备空工程,配置Keil环境.使能STM32F4的FPU单元。

开启硬件浮点运算,等效于在C/C++->define中定义__FPU_USED,__FPU_PRESENT两个宏

添加全局宏定义,使能DSP库所有的功能

图中STM32F4XX,USE_STDPERIPH_DRIVER是新建工程都会用到的配置宏,新建工程参考:http://blog.csdn.net/qianrushi_jinxifeng/article/details/19673755

其他宏ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING 请参考:http://blog.csdn.net/desert187/article/details/20527921

向工程中添加使用到的DSP库源码

在stm32f4_dsp_stdperiph_lib\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\DSP_Lib\Source目录下会有如下目录,都是DSP函数库

BasicMathFunctions
基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。
CommonTables
arm_common_tables.c文件提供位翻转或相关参数表。
ComplexMathFunctions
复杂数学功能,如向量处理,求模运算的。
ControllerFunctions
控制功能函数。包括正弦余弦,PID电机控制,矢量Clarke变换,矢量Clarke逆变换等。
FastMathFunctions
快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比CMSIS计算库要快的数学函数。
FilteringFunctions
滤波函数功能,主要为FIR和LMS(最小均方根)等滤波函数。
MatrixFunctions
矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、矩阵转置等函数。
StatisticsFunctions
统计功能函数。如求平均值、最大值、最小值、计算均方根RMS、计算方差/标准差等。
SupportFunctions
支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。
TransformFunctions
变换功能。包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。 我们需要CommonTables和TransformFunctions的下的部分文件
添加到工程如图

另外我们需要包含相应的头文件路径,所需的头文件在STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Include路径下可以找到

编写main()函数,
 #include "stm32f4xx_conf.h"
//位带操作
#include "sys.h"
#include "delay.h"
#include "usart.h"
//LCD显示屏功能
#include "Nick_lcd.h"
#include "Nick_keys.h" #include "arm_math.h"
#define FFT_LENGTH 1024 //FFT长度,默认是1024点FFT float fft_inputbuf[FFT_LENGTH*]; //FFT输入输出数组,此数组为arm_cfft_radix4_f32的输入输出数组,前一个元素为实部,后一个为虚部,每两个元素代表一个点.
float fft_outputbuf[FFT_LENGTH]; //arm_cmplx_mag_f32() 幅度输出数组
arm_cfft_radix4_instance_f32 scfft; int main(void)
{
delay_init();
lcd_init(); //初始化LCD
key_init();
uart_init(); //初始化串口波特率为115200 arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,,);//初始化scfft结构体,设定FFT相关参数 while()
{
u32 keyval = (u32)keys_scan();
if(keyval==)
{
for(int i=;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[*i]= + *arm_sin_f32(*PI*i*/FFT_LENGTH) + \
5.5*arm_sin_f32(*PI*i*/FFT_LENGTH); //生成实部 fft_inputbuf[*i+]=;//虚部全部为0
}
arm_cfft_radix4_f32(&scfft,fft_inputbuf); //FFT计算(基4)
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH); //把运算结果复数求模得幅值 printf("FFT Result:\r\n");
for(int i=;i<FFT_LENGTH;i++)
{
printf("%f\r\n",fft_outputbuf[i]);
}
}
delay_ms();
}
}

代码分析:如代码所示,利用arm_sin_f32函数产生了,一个基波幅度为15,频率100Hz是幅度为10,频率150Hz是幅度为5.5的信号。

经过FFT运算后,用arm_cmplx_mag_f32()函数求出赋值,并通过串口打印出来。

编译运行

结果分析:

对串口收到的数据用matlab绘图,如下

如图,基波幅度为:15360/1024 = 15

100Hz成分幅度为: 5120*2/1024 = 10

150Hz成分幅度为: 2816*2/1024 = 5.5

因此所得的结果是正确的。博主目前为测试相位,故在此不做说明。

后记,这是使用源码的方式进行操作的,所有源码可跳转,可编辑。但添加麻烦。

下一篇将使用ST提供的.lib库直接进行运算。链接:http://www.cnblogs.com/NickQ/p/8541156.html

												

最新文章

  1. word20161219
  2. win10 设置声卡驱动 --- 解决喇叭没有声音!
  3. JavaScript跨域提交数据
  4. Bootstrap之字体图标
  5. SimpleAdapter的使用
  6. iOS 自定义图片和文字垂直显示按钮&lt;上面是图片,文字显示下面&gt;
  7. Java.util.ArrayList详解
  8. php正则表达式获取表格内容
  9. jQuery基础学习2——DOM和jQuery对象
  10. effective c++(07)之为多态基类声明virtual析构函数
  11. Oracle 基础知识
  12. js中运算符的优先级
  13. HTTP的学习
  14. Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例
  15. R与并行计算(转)
  16. c#扩展方法的使用,实现的几个功能
  17. linux系统命令学习系列-例行任务管理at命令
  18. openstack,docker,mesos,k8s关系
  19. linux 启动管理
  20. 剑指offer(43)左旋转字符串

热门文章

  1. (python功能定制)复杂的xml文件对比,产生HTML展示区别
  2. C#常用代码片段备忘
  3. 【Oracle】虚拟表Dual
  4. linear-grident的属性和使用以及对颜色后面参数(百分比)的理解
  5. checkbox/input文本框与文字对齐
  6. iOS 利用异常 NSException 调试代码
  7. 深入分析Java ClassLoader的原理(转)
  8. 一个简单清晰的Redis操作类
  9. 算法提高 P1001
  10. 吾八哥学Selenium(三):操作复选框checkbox/单选框radio的方法