STM32F4使用FPU+DSP库进行FFT运算的测试过程

测试环境:单片机: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

时间: 2024-10-23 03:15:22

STM32F4使用FPU+DSP库进行FFT运算的测试过程的相关文章

STM32F4使用DSP库进行FFT运算的测试过程二

原文地址:http://www.cnblogs.com/NickQ/p/8541156.html 测试环境:单片机:STM32F407ZGT6 IDE:Keil5.20.0.0 固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第二部分:本教程使用DSP--lib库的方式,进行FFT运算. 由于上一篇教程STM32F4使用FPU+DSP库进行FFT运算的测试过程一 ,进行FFT运算的是void arm_cfft_radix4_f32(const arm_cfft_

【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT

前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行比较,最终选择了使用STM32提供的DSP库这种方法. 本文将以一个实例来介绍如何使用STM32提供的DSP库函数进行FFT. 1.FFT运算效率 使用STM32官方提供的DSP库进行FFT,虽然在使用上有些不灵活(因为它是基4的FFT,所以FFT的点数必须是4^n),但其执行效率确实非常高效,看图

STM32的DSP库的应用

前些天理解了fft变换的理论和对其工程应用进行了实例分析,详见我的名为<C语言实现fft理论基础与工程应用的实例分析>的博客,用C语言编写的fft算法比较容易看懂,但带来的缺点就是执行效率低,对于要求实时操作(例如电机控制)的反应速度不够灵敏.本篇内容将简要分析STM32自带的DSP库文件,其用汇编语言编写,代码执行效率明显优于C语言,ST公司封装好了了库文件,我们不必看懂其汇编代码,只要会调用接口函数即可. 1,代码分析 首先我们需要在一个已经建立好的工程文件里添加如下编译路径: 工程需要添

【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能

测试条件: 1.IAR8.30开最高等级速度优化. 2.MDK5.27正式版使用AC5开最高等级优化3,开启时间优化,测试C标准库和微库MicroLib两种. 3.MDK5.27正式版使用AC6开最高等级的速度优化,测试C标准库和微库MicroLib两种. 4.Embedded Studio4.30版使用GCC开最高等级优化,开C库使用Fast模式. 5.Embedded Studio4.30版使用CLANG开最高等级优化,开C库使用Fast模式. 6.DSP库使用最新的CMSIS软件包里面的V

IPP库下FFT的基本实现

首先感谢韩昊同学,他的傅里叶分析入门给我们对数学公式不熟悉的人了解傅里叶算法打开了一扇窗户,其原文发表于知乎:https://zhuanlan.zhihu.com/p/19763358 在了解其基本原理的基础下,我们采用IPP库对FFT的实现进行一个简单的仿真,以便更感性的认识何为傅里叶变换,他能做什么,废话不多,下面开始. IPP版本:w_ipp_9.0.3.207.exe 可以在intel官网进行下载,该文件是开发库,是免费的 下载地址:https://registrationcenter.

数字信号处理专题(3)——FFT运算初探

一.前言 FFT运算是目前最常用的信号频谱分析算法.在本科学习数字信号处理这门课时一直在想:学这些东西有啥用?公式推来推去的,有实用价值么?到了研究生后期才知道,广义上的数字信号处理无处不在:手机等各种通信设备和WIFI的物理层信号处理.摄像头内的ISP.音频信号的去噪等.各种算法中,FFT是查看信号本质,也就是频谱的重要手段.之前仅直接调用FFT/IFFT IP核,今天深入探讨下算法本身和实现方案. 二.FFT运算原理及结构 本文仅对FFT的核心思想.作用和算法结构进行介绍,FFT具体原理和公

Numpy库03_数据运算

#运算 import numpy as np #列表相乘# ll=[1,2,3,4,5]# ll2=ll*2 # [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]# print(ll2) # 列表相加# ll3=[1,2,3,4,5]# ll4=ll3+10 #报错,不能这样用# print(ll4) #numpy中数组相加# nparr1=np.arange(0,10)# print(nparr1) # [0 1 2 3 4 5 6 7 8 9]# print(nparr1+10)

F2833x 调用DSP函数库实现复数的FFT的方法

转载自:http://blog.csdn.net/aeecren/article/details/67644363:个人觉得写的很详细,值得一看 在数字信号处理中,FFT变换是经常使用到的,在DSP中自己编写的FFT变换函数通常会存在计算效率太慢的问题,有时需要调用DSP函数库自带的变换函数.但是,DSP在对FFT运算效率优化的同时,对于函数的调用方式也就有了比较多的要求,下面结合自己的调试经验做一下简单的介绍. 1.准备工作 DSP的数字信号处理的一系列函数都在C28x_FPU_Lib.lib

STM32F407IG开启FPU,做开方运算

STM32F407IG开启FPU,做开方运算 MDK KEIL中使用STM32F4XX芯片硬件浮点单元FPU Keil中使用STM32F4xx硬件浮点单元 STM32F4-浮点DSP库的MDK开发环境的设置