如何使用stm32f4 dsp库做fft运算

发布者:BlissfulJourney最新更新时间:2023-09-12 来源: elecfans关键字:stm32f4  dsp库  fft运算 手机看文章 扫描二维码
随时随地手机看文章

  FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform),它根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

  FFT运算效率

  使用STM32官方提供的DSP库进行FFT,虽然在使用上有些不灵活(因为它是基4的FFT,所以FFT的点数必须是4^n),但其执行效率确实非常高效,看图1所示的FFT运算效率测试数据便可见一斑。


  如何使用STM32提供的DSP库函数

  1.下载STM32的DSP库

  大家可以从网上搜索下载得到STM32的DSP库

  2.添加DSP库到自己的工程项目中

  下载得到STM32的DSP库之后,就可以将其添加到自己的工程项目中了。

  其中,inc文件夹下的stm32_dsp.h和table_fft.h两个文件是必须添加的。stm32_dsp.h是STM32的DSP库的头文件。src文件夹下的文件可以有选择的添加(用到那个添加那个即可)。

  3.模拟采样数据

  根据采样定理,采样频率必须是被采样信号最高频率的2倍。这里,我要采集的是音频信号,音频信号的频率范围是20Hz到20KHz,所以我使用的采用频率是44800Hz。那么在进行256点FFT时,将得到44800Hz / 256 = 175Hz的频率分辨率

  为了验证FFT运算结果的正确性,这里我模拟了一组采样数据,并将该采样数据存放到了long类型的lBufInArray数组中,且该数组中每个元素的高16位存储采样数据的实部,低16位存储采样数据的虚部(总是为0)。

 今天小编选择了使用STM32f4提供的DSP库这种方法来做fft的运算,下面我们我看下具体详情:

  STM32F4 dsp库做FFT运算:

  环境:iar 6.2

  板子:STM32F4DISCOVERY

  第一 首先下载官方的 STM32F4xx_DSP_StdPeriph_Lib_V1.0.0 没有的同学请自己去官网下一个

  DSP库在 STM32F4xx_DSP_StdPeriph_Lib_V1.0.0LibrariesCMSIS

如何使用stm32f4 dsp库做fft运算

  然后我们使用IAR建立工作空间,这个教程到处都有,我就不说了在编译器里面加入

如何使用stm32f4 dsp库做fft运算

  $PROJ_DIR$。。。。。。LibrariesCMSISDSP_LibSource

  ARM_MATH_CM4

  ARM_MATH_MATRIX_CHECK

  ARM_MATH_ROUNDING

  __FPU_PRESENT

  __FPU_USED

  这样才可以使用DSP库

  注意 我的是IAR MDK貌似不是这样的 。。。。。

如何使用stm32f4 dsp库做fft运算

  然后再编译器里面打开 FPU

  然后再你的EWARM 目录下添加官方的例子文件

  我们用的就是这几个文件 STM32F4xx_DSP_StdPeriph_Lib_V1.0.0LibrariesCMSISDSP_LibExamplesarm_fft_bin_example

如何使用stm32f4 dsp库做fft运算

  接着像我这样加入这些组 在里面添加文件 文件在STM32F4xx_DSP_StdPeriph_Lib_V1.0.0LibrariesCMSISDSP_LibSource添加,然后在IAR里面加入 arm_fft_bin_example_f32 这个就是官方的例子 和官方的数据 arm_fft_bin_data

如何使用stm32f4 dsp库做fft运算

  连接下载

  使用WATCH窗口可以看见值

如何使用stm32f4 dsp库做fft运算

  然后 我讲一下这几个函数的作用

  /* Initialize the CFFT/CIFFT module */

  status = arm_cfft_radix4_init_f32(&S, fftSize,

  ifftFlag, doBitReverse); //这里是FFT的初始化

  /* Process the data through the CFFT/CIFFT module */ //FFT计算的函数 注意 testInput_f32_10khz 这个数组 不能是const 因为计算值是覆盖在这里面的

  arm_cfft_radix4_f32(&S, testInput_f32_10khz);

  /* Process the data through the Complex Magnitude Module for // FFT出来的是复数 这里是把复数求模 得幅值

  calculating the magnitude at each bin */

  arm_cmplx_mag_f32(testInput_f32_10khz, testOutput,

  fftSize);

  /* Calculates maxValue and returns corresponding BIN value */ //这里是求FFT出来数据模的最大值

  arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);

  最后,如果你的运行到这一步 你就成功了

如何使用stm32f4 dsp库做fft运算


关键字:stm32f4  dsp库  fft运算 引用地址:如何使用stm32f4 dsp库做fft运算

上一篇:如何采用STM32单片机来产生PWM输出
下一篇:一种基于ZigBee和STM32的室内智能照明系统的设计

推荐阅读最新更新时间:2024-11-19 05:14

STM32F4学习笔记1——如何使用DSP
配置 1、 安装DSP库文件 2、 配置编译环境, 上述添加是在project→options→C/C++→Define中添加,并且分割用逗号,即 __FPU_PRESENT=1,__FPU_USED=1,ARM_MATH_CM4,__CC_ARM 3、 在需要调用DSP函数的文件中加上 #include arm_math.h 4、 需要在project中添加用到的.c文件,看你用的是哪个函数,就添加哪个.c文件。.c文件目录为 XXX\Drivers\CMSIS\DSP_Lib\Source
[单片机]
<font color='red'>STM32F4</font>学习笔记1——如何使用<font color='red'>DSP</font><font color='red'>库</font>
STM32F4中USB与PC双向通信
STM32F4系列处理器内部集成了USB-OTG控制器,在不要外部USB IC下就可以实现USB通信,最近两天看了下如何利用STM32的USB实现通信,记录下关键步骤: 1. 从http://www.stmcu.org/document/list/index/category-524下载所需要的USB_OTG主机和设备库; 2. 新建STM32工程,并把STM32_USB-Host-Device_Lib下的Libraries中的3个USB库放到工程文件中; 3.在Keil中建立USB相关文件夹,并加入相应的驱动文件:(可参考STM32_USB-Host-Device_Lib— Project— USB_Device_Example
[单片机]
<font color='red'>STM32F4</font>中USB与PC双向通信
STM32F407 外部中断
STM32F4的IO口在第六章有详细介绍,而中断管理分组管理在前面也有详细的阐述。这里我们将介绍STM32F4外部IO口的中断功能,通过中断的代码主要分布在固件库的stm32f4xx_exti.h和stm32f4xx_exti.c文件中。 STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处。STM32F407的中断控制器支持22个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F407的22个外部中断为: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到U
[单片机]
STM32F429之四:UART
void uart_init(u32 bound) { //UART 初始化设置 UART1_Handler.Instance=USART1; //USART1 UART1_Handler.Init.BaudRate=bound; //波特率 UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式 UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位 UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位 UART1_Hand
[单片机]
stm32f407 中断问题
1 中断分组 嵌套中断的含义: 高优先级中断能打断低优先级中断 翻译: STM32分组为:组0-4(没组都有16个优先级) 分组配置在寄存器SCB- AIRCR中 使用示例: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 #define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*! 2 bits for pre-emption priority #define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) v
[单片机]
<font color='red'>stm32f4</font>07 中断问题
STM32F407——串口显示跑马灯状态
#main.c #include sys.h #include delay.h #include usart.h #include led.h //#include beep.h //#include key.h #include exti.h extern u8 onoff,dir,speed,change,flag; extern u16 time; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 delay_init(168); //初始化延时函数 LED_In
[单片机]
<font color='red'>STM32F4</font>07——串口显示跑马灯状态
STM32F407 单通道ADC采样,DMA传输
最近在研究STM32F4的ADC采样功能,中间遇到了一些问题,写下来以备后用。 F4和F1有很多库函数是不一样的,在参照F1的教程的时候,不能直接抄他的实验代码,否则会出错。 因为要用DMA将ADC转换得到的值快速传递到SRAM中,所以就需要对ADC相关的DMA进行设置,这一步很重要。在写ADC1的DMA初始化函数前,一定要查Reference Manual的DMA request mapping,搞清楚是某一个具体的peripheral对应的是DMA1还是DMA2,用到的是哪一个stream和channel。例如这次实验要用到的外设ADC1,可以查到,ADC1归DMA2 Stream0或者Stream4的Channel0管理,不
[单片机]
<font color='red'>STM32F4</font>07 单通道ADC采样,DMA传输
STM32F407 Hal 串口使用指南
首先,当然是在Cube中进行相应的配置,这个就不多讲了。 之后,在生成的工程中,找到main函数,在/* USER CODE BEGIN 2 */下加入 HAL_UART_Receive_IT(&huart1,Uart1_Data_buffer,n); 这是要给接收到的数据定向,存在Uart_Data_buffer 中。上面函数的第三个参数应该是收到n个字节就触发中断。 然后,在stm32f4xx_it.c的最后面,也就是/* USER CODE BEGIN 1 */下编写 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { 。。。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved