测试环境:单片机: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()函数,
 1 #include "stm32f4xx_conf.h"
 2 //位带操作
 3 #include "sys.h"
 4 #include "delay.h"
 5 #include "usart.h"
 6 //LCD显示屏功能
 7 #include "Nick_lcd.h"
 8 #include "Nick_keys.h"
 9
10 #include "arm_math.h"
11 #define FFT_LENGTH        1024         //FFT长度,默认是1024点FFT
12
13 float fft_inputbuf[FFT_LENGTH*2];    //FFT输入输出数组,此数组为arm_cfft_radix4_f32的输入输出数组,前一个元素为实部,后一个为虚部,每两个元素代表一个点.
14 float fft_outputbuf[FFT_LENGTH];     //arm_cmplx_mag_f32() 幅度输出数组
15 arm_cfft_radix4_instance_f32 scfft;
16
17 int main(void)
18 {
19     delay_init(168);
20     lcd_init(0);    //初始化LCD
21     key_init();
22     uart_init(115200);        //初始化串口波特率为115200
23
24     arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);//初始化scfft结构体,设定FFT相关参数
25
26     while(1)
27     {
28         u32 keyval = (u32)keys_scan(0);
29         if(keyval==1)
30         {
31             for(int i=0;i<FFT_LENGTH;i++)//生成信号序列
32             {
33                  fft_inputbuf[2*i]=15 + 10*arm_sin_f32(2*PI*i*100/FFT_LENGTH) + \
34                                    5.5*arm_sin_f32(2*PI*i*150/FFT_LENGTH); //生成实部
35
36                  fft_inputbuf[2*i+1]=0;//虚部全部为0
37             }
38             arm_cfft_radix4_f32(&scfft,fft_inputbuf);    //FFT计算(基4)
39             arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);    //把运算结果复数求模得幅值
40
41             printf("FFT Result:\r\n");
42             for(int i=0;i<FFT_LENGTH;i++)
43             {
44                 printf("%f\r\n",fft_outputbuf[i]);
45             }
46         }
47         delay_ms(60);
48     }
49 }

代码分析:如代码所示,利用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


转载于:https://www.cnblogs.com/NickQ/p/8540487.html

STM32F4使用FPU+DSP库进行FFT运算的测试过程一相关推荐

  1. 【STM32】STM32F4调用DSP库实现FFT运算

    写在前面 最近在整理之前的stm32笔记,打算把一些有价值的笔记发到CSDN分享一下. 奎斯特定理 在进行模拟/数字信号的转换过程中,当采样频率F大于信号中最高频率 fmax 的 2 倍时(F> ...

  2. 华大半导体HC32F4A0笔记(五),使用CMSIS-DSP库进行FFT运算

    一.开启FPU功能 点这个麻将牌四筒,展开CMSIS,把DSP勾了. 点开后 然后点这个锤子 No Auto Includes的勾不要打,让它自动include,因为CMSIS-DSP库在KEIL的安 ...

  3. STM32 HAL库 CUBEMX FPU 和 DSP库

    转自:https://blog.csdn.net/yuleitao/article/details/105621492?ivk_sa=1024320u FPU 简介 FPU 即浮点运算单元(Float ...

  4. STM32F4单片机ADC采样及ARM-DSP库的FFT

    模拟信号经过ADC采样后变成数字信号,数字信号可以进行FFT运算,在频域中更容易分析信号的特征.本文将介绍如何用STM32F4的进行ADC采样,并利用ARMDSP库里的FFT算法对ADC采样值进行快速 ...

  5. STM32CubeMx移植DSP库 傅立叶变化(FFT)测试

    文章目录 前言 一.STM32L496简介? 二.FFT简介 三.STM32CubeMx配置 四.MDK配置与程序 4.1宏定义的添加 4.2程序编写 五.结果 总结 前言 本篇文章采用的是ST公司的 ...

  6. STM32F4 FPU和DSP库使用

    参考网页: http://blog.csdn.net/electrocrazy/article/details/73456697 STM32F4xx属于Cortex M4F架构,带有32位的单精度硬件 ...

  7. STM32F4xx FPU和DSP库的使用

    STM32F4xx属于Cortex M4F架构,带有32位的单精度硬件FPU(Float Point Unit),支持浮点指令集,相对比M0和M3架构,浮点运算性能高出数十倍甚至上百倍.CortexT ...

  8. CubeMX生成的STM32F4xx MDK工程FPU和DSP库的使用

    CubeMX生成的STM32F4xx MDK工程FPU和DSP库的使用 STM32F4xx属于Cortex M4F架构,带有32位的单精度硬件FPU(Float Point Unit),支持浮点指令集 ...

  9. stm32f4进行fft运算

    0.前言 我是个小菜鸡,最近需要用fft,就学习使用了一下,感觉还挺好玩的,文章内容可能有描述不准确或者错误的地方,希望读者带着辩证的眼光阅读,如果方便指出错误,那就很感谢了. 本文主要关注fft实际 ...

最新文章

  1. Mybatis入门:4(多表查询操作)
  2. SharedPreferences源码解析
  3. OpenCart之商品管理教程
  4. python类继承的重写和super
  5. 学好单片机编程设计的方法和3个步骤
  6. 5款非常好用的免费数据库建模工具(免费)
  7. python时域转频域_语音预处理(二):时域转频域
  8. 对称加密算法原理简介
  9. 周未特别节目《前赤壁赋》
  10. 计算机开题报告万能模板,计算机开题报告ppt模板
  11. IDEA删除多余空行
  12. [转载]基于Servlet的Google Earth之旅
  13. Springboot项目启动异常 org.springframework.beans.factory.UnsatisfiedDependencyException
  14. 网络实用技术--登录--第三方登录--百度第三方登录
  15. 计算机毕业设计之java+ssm企业员工考勤系统
  16. 解决单元测试时报Could not instantiate问题
  17. 汉诺塔问题——递归算法
  18. Amazon EKS 使用 EFS服务
  19. DW怎么把两个html放在一起,用Dreamweaver怎么制作网页
  20. FPGA 之 SOPC 系列(二)SOPC开发流程及开发平台简介

热门文章

  1. 第十三次CCF认证经历
  2. 数据库设计(二)——数据库设计原则
  3. 四步完成离线部署wvs
  4. 激活windows转到电脑设置的水印怎么消失
  5. [原]as3 flash web 应用 (2)批量上传之php页面接收flash传递的数据
  6. 3D游戏中的数学运用
  7. CSDN2022总排名前十统计
  8. JavaWeb学生信息管理系统
  9. ROS示例----导航功能包Husky_exploration
  10. 指纹识别综述(8): 唯一性