STM32F4使用FPU+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,也就是说每次运算的长度必须是22n等,而arm_cfft_f32()可以运算长度为2n的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()函数
#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"
#include "arm_const_structs.h" #define FFT_LENGTH 1024 //FFT长度,默认是1024点FFT float fft_inputbuf[FFT_LENGTH*]; //FFT输入数组
float fft_outputbuf[FFT_LENGTH]; //FFT输出数组 int main(void)
{ delay_init();
lcd_init(); //初始化LCD
key_init();
uart_init(); //初始化串口波特率为115200 while()
{
u32 keyval = (u32)keys_scan();
if(keyval==)
{
for(int i=;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[*i]=+4.5*arm_sin_f32(*PI*i*/FFT_LENGTH)+\
7.5*arm_sin_f32(*PI*i*/FFT_LENGTH); fft_inputbuf[*i+]=;//虚部全部为0
}
//arm_cfft_sR_f32_len1024,该变量即为"arm_const_structs.h"提供的配置变量,包含头文件后,直接调用即可。
arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,,);
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();
}
}
编译下载运行。
结果分析:
如图,我们产生的信号是基波幅度为10,200Hz幅度为4.5,350Hz幅度为7.5
基波:10240/1024 = 10
200Hz: 2304*2/1024 = 4.5
350Hz:3840*2/1024 = 7.5
STM32F4使用FPU+DSP库进行FFT运算的测试过程二的更多相关文章
- STM32F4使用FPU+DSP库进行FFT运算的测试过程一
测试环境:单片机:STM32F407ZGT6 IDE:Keil5.20.0.0 固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0 第一部分:使用源码文件的方式,使 ...
- 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT
前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...
- 基于HAL库的STM32的DSP库详解(附FFT应用)
1 . 建立工程,生成代码时选择包含所有库. 2. 打开 option for target 选择 Target 标签,在code generatio中,将floating point hardw ...
- 关于stm32f1使用ST官方DSP库中的FFT方法
先分享一下ST官方基于F1的DSP固件库,自从ST推出F4系列的DSP固件库之后,网上好像很难找到原来F1系列的DSP固件库了. 链接:https://pan.baidu.com/s/1S5h2Ti3 ...
- SAM4E单片机之旅——24、使用DSP库求向量数量积
DSP(Digital Signal Processing,数字信号处理)中会使用大量的数学运算.Cortex-M4中,配置了一些强大的部件,以提高DSP能力.同时CMSIS提供了一个DSP库,提供了 ...
- 【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能
测试条件: 1.IAR8.30开最高等级速度优化. 2.MDK5.27正式版使用AC5开最高等级优化3,开启时间优化,测试C标准库和微库MicroLib两种. 3.MDK5.27正式版使用AC6开最高 ...
- TI的32位定点DSP库IQmath在H7和F4上的移植和使用
说明: 1.最近在制作第2版DSP教程,除了ARM家的,这次重点了解下载TI的DSP库,特此移植了一个TI的IQmath. 2.初次使用这个定点库,感觉在各种Q格式的互转,Q格式数值和浮点数的互转处理 ...
- 数字信号处理专题(3)——FFT运算初探
一.前言 FFT运算是目前最常用的信号频谱分析算法.在本科学习数字信号处理这门课时一直在想:学这些东西有啥用?公式推来推去的,有实用价值么?到了研究生后期才知道,广义上的数字信号处理无处不在:手机等各 ...
- pandas库的数据类型运算
pandas库的数据类型运算 算数运算法则 根据行列索引,补齐运算(不同索引不运算,行列索引相同才运算),默认产生浮点数 补齐时默认填充NaN空值 二维和一维,一维和0维之间采用广播运算(低维元素与每 ...
随机推荐
- win10安装mxnet cuda9.0-gpu版
类似于上一篇文章 Anaconda3.6 python3.6.5 cuda9.0+ cudnn7.0 安装MXNet 1.设置清华源 conda config --prepend cha ...
- SpringMvc-自定义视图
1.创建视图: 注意:创建视图的时候需要实现View接口的俩个方法 package com.atguigu.springmvc.views; import java.util.Date; import ...
- delphi7 打开project/options 出错
出错提示:Access violation at address 0012F88F. Write of address 0012F88F.然后又提示一条:Access violation at add ...
- Android(java)学习笔记32:Android布局详解之一:FrameLayout
1. FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义 ...
- BZOJ3531:[SDOI2014]旅行(树链剖分)
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...
- 在Spring整合aspectj实现aop的两种方式
-----------------------------基于XML配置方案目标对象接口1 public interface IUserService { public void add(); pub ...
- json 二进制传输方案
json 传输二进制数组方案 json 是一种很简洁的协议,但可惜的是,它只能传递基本的数型(int,long,string等),但不能传递byte类型.如果想要传输图片等二进制文件的话,是没办法直接 ...
- HDU 1220 Cube(数学,找规律)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1220 Cube Time Limit: 2000/1000 MS (Java/Others) M ...
- unity3D引擎:2D游戏自动瞄准算法实现
转:http://blog.csdn.net/naitu/article/details/39555373 在很多飞行射击类游戏里,都有敌人向玩家自动瞄准并开火的功能.在这里本人用unity3D引擎新 ...
- sudo cd的错误
问题说明 今天用MySQL建了库,想看看. 当到了这步,心里的第一个感觉就是电脑坏了.后来查了查才知道了原因. 原因 cd不是一个应用程序而是Linux内建的命令,而sudo仅仅只对应用程序起作用. ...