完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
之前做课设的时候接触过FFT,看了一些资料,没整明白,现在做项目又用到FFT了,花了点时间整明白了。但此处的明白并非把FFT的原理啥的整明白了,只是明白在STM32上怎么用了。开发环境如下
打开下载的固件库,文件名为STM32Cube_FW_F7_V1.9.0, Drivers文件夹下,CMISIS文件夹中包含上图所示文件夹,DSP_Lib和Lib是DSP库相关文件,其中DSP_Lib又包含两个文件夹,Examples和Source。 Examples 中的文件如下(这些是 ARM 官方提供的 DSP 实例): Source 中的文件如下(这些是 DSP库的源文件): 源文件不需要添加到工程中,真正需要添加到工程中的是官方提供的DSP库,文件格式为.lib。库文件位于Lib文件夹中,有ARM和GCC两种开发环境的库,我们选择ARM。如图所示。 库文件有好多种,关于每种库文件的说明参见官方说明。 CMSIS DSP Software Library。该网站上有详细说明。如下图所示。 确定了用哪个库后,添加到工程中。我的工程是用CubeMX建的,因此添加DSP库的时候在软件中操作,勾选后自动添加,如图。 下图为DSP库已添加到工程中。 库添加到工程中,在需要用到库函数的文件中引用头文件,#include “arm_math.h”,即可调用所需函数。 函数说明 我用到的是实数FFT,即rfft。相关函数参见官方说明。 函数名中f32代表32位浮点数,q31代表32位定点数,q15代表16位定点数,q7代表8位定点数。 arm_rfft_fast_f32是FFT实现的主要函数,函数原型如下。 S是 arm_rfft_instance_f32 类型的结构体,p和pOut是输入和输出的缓冲区,ifftFlag是变换的标志位。 另外还有一个实现rfft的函数 arm_rfft_instance_f32,函数原型如下。 官方不推荐使用此函数。“Do not use this function. It has been superceded by arm_rfft_fast_f32 and will be removed in the future. ” 除了FFT函数之外,还要用到一个函数对arm_rfft_fast_f32中的参数S进行初始化,该函数为 arm_rfft_fast_init_f32,用于 初始化结构体S中的参数 ,函数原型如下。 另外一个重要的函数是arm_cmplx_mag_f32,计算频率的幅值。函数原型如下。 代码示例 include "DSP.h" include "arm_math.h" define NPT 1024 //1024点FFT define Fs 5120 //采样频率 5120Hz 频率分辨率 5Hz define PI2 6.28318530717959 float32_t testInput_f32[NPT]; float32_t testOutput_f32[NPT]; float32_t testOutput[NPT]; /* ********************************************************************************************************* * 函 数 名: arm_rfft_fast_f32_app * 功能说明: 调用函数arm_rfft_fast_f32计算1024点实数序列的幅频响应并跟使用函数arm_cfft_f32计算结果做对比 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void arm_rfft_fast_f32_app(void) { uint16_t i; arm_rfft_fast_instance_f32 S; /* 实数序列FFT长度 */ uint16_t fftSize = NPT; /* 正变换 */ uint8_t ifftFlag = 0; /* 初始化结构体S中的参数 */ arm_rfft_fast_init_f32(&S, fftSize); /* 按照实部,虚部,实部,虚部..... 的顺序存储数据 */ for(i=0; i<1024; i++) { /*3种频率 50Hz 2500Hz 2550Hz */ testInput_f32 = 1000*arm_sin_f32(PI2*i*50.0/Fs) + 2000*arm_sin_f32(PI2*i*2500.0/Fs) + 3000*arm_sin_f32(PI2*i*2550.0/Fs); } /* 1024点实序列快速FFT */ arm_rfft_fast_f32(&S, testInput_f32, testOutput_f32, ifftFlag); /* 为了方便跟函数arm_cfft_f32计算的结果做对比,这里求解了1024组模值,实际函数arm_rfft_fast_f32 只求解出了512组 */ arm_cmplx_mag_f32(testOutput_f32, testOutput, fftSize); /* 串口打印求解的模值 */ for(i=0; i printf("%frn", testOutput); } } 结果 在单片机上运行,将串口助手接收到的数据保存到TXT文件,利用matlab进行分析。 对数据plot画图,结果如下 可以看出,FFT之后分析出包含信号的频率为50Hz,2500Hz,2550Hz,与生成信号 testInput_f32 = 1000*arm_sin_f32(PI2*i*50.0/Fs) + 2000*arm_sin_f32(PI2*i*2500.0/Fs) + 3000*arm_sin_f32(PI2*i*2550.0/Fs); 吻合。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
568浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 14:20 , Processed in 0.903813 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号