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_radix4_instance_f32 * S,float32_t * pSrc)函数。

偶然发现,这个函数在STM32F4xx_DSP_StdPeriph_Lib_V1.4.0库说明中,描述为--不要使用该功能,已经被arm_cfft_f32()替代。

这一类不推荐使用的函数还有很多,例如arm_cfft_radix2_f32,arm_cfft_radix2_init_f32等等,在此不再展开,详细可在\STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\index.html中查看。这是ST提供的,以网页的形式描述的说明文档。。

通过使用arm_cfft_f32()替代arm_cfft_radix4_f32后发现,arm_cfft_f32()函数确实更简单易用。因此此教程中我们使用arm_cfft_f32(),而不再使用arm_cfft_radix4_f32。

我们知道,arm_cfft_radix4_f32是基于4的FFT,也就是说每次运算的长度必须是32,256,1024等,而arm_cfft_f32()也可以运算长度为512的FFT,另外,在arm_cfft_f32()函数不需要使用诸如arm_cfft_radix4_init_f32的初始化配置函数。取而代之的是包含"arm_const_structs.h"头文件,并使用它说提供的配置变量即可。下图是arm_const_structs.h提供的配置变量。

准备空工程,配置Keil环境.请参考 STM32F4使用FPU+DSP库进行FFT运算的测试过程一 的配置,使能STM32的FPU等,在此不做赘述。

添加文件到工程,我们需要DSP的lib库,路径为STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Libraries\CMSIS\Lib\ARM

该文件夹下有如下lib库,
    arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)
    arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)
    arm_cortexM4l_math.lib (Little endian on Cortex-M4)
    arm_cortexM4b_math.lib (Big endian on Cortex-M4)
    arm_cortexM3l_math.lib (Little endian on Cortex-M3)
    arm_cortexM3b_math.lib (Big endian on Cortex-M3)
    arm_cortexM0l_math.lib (Little endian on Cortex-M0)
    arm_cortexM0b_math.lib (Big endian on Cortex-M3)

因为测试环境所使用的是STM32F407xx,属于Cortex-M4内核,小端模式,支持浮点运算单元。因此选择第一个 lib库,arm_cortexM4lf_math.lib

将其添加到工程中,并包含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 #include "arm_const_structs.h"
12
13 #define FFT_LENGTH        1024         //FFT长度,默认是1024点FFT
14
15 float fft_inputbuf[FFT_LENGTH*2];    //FFT输入数组
16 float fft_outputbuf[FFT_LENGTH];    //FFT输出数组
17
18 int main(void)
19 {
20
21     delay_init(168);
22     lcd_init(0);    //初始化LCD
23     key_init();
24     uart_init(115200);        //初始化串口波特率为115200
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]=10+4.5*arm_sin_f32(2*PI*i*200/FFT_LENGTH)+34                                           7.5*arm_sin_f32(2*PI*i*350/FFT_LENGTH);
35
36                      fft_inputbuf[2*i+1]=0;//虚部全部为0
37                 }
38                //arm_cfft_sR_f32_len1024,该变量即为"arm_const_structs.h"提供的配置变量,包含头文件后,直接调用即可。
39                arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,0,1);
40                arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);    //把运算结果复数求模得幅值
41
42                 printf("FFT Result:\r\n");
43                 for(int i=0;i<FFT_LENGTH;i++)
44                 {
45                     printf("%f\r\n",fft_outputbuf[i]);
46                 }
47         }
48         delay_ms(60);
49     }
50 }

编译下载运行。

结果分析:

如图,我们产生的信号是基波幅度为10,200Hz幅度为4.5,350Hz幅度为7.5

基波:10240/1024 = 10

200Hz: 2304*2/1024 = 4.5

350Hz:3840*2/1024 = 7.5

原文地址:https://www.cnblogs.com/NickQ/p/8541156.html

时间: 2024-10-30 13:01:39

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

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++->defin

【玩转单片机系列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具体原理和公

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

封装ios静态库碰到的一些问题(二)

在静态库建立好了之后呢,于是应用程序就引用它,加上拷贝的h文件,但是引用之后Build之后提示很多sybmbol 重复 于是进行检查,确实由于是从其他工程修改过来的,很多基础库都引用了,删除之,最后就只剩下xxx.h,死活就是报重复符号,我看来看去都没有 不得其解,后面突然想不过,使用了下definition,发现跳转到了一个文件,里面全部被注释的文件,于是明了,原来偷懒,有的代码是拷贝的,于是h和m文件都在,但是里面内容被注释了,结果xcode不买账啊,直接删除掉,Ok,解决问题 封装ios静