你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G431测试两个常用的FFT运算时间

[复制链接]
数码小叶 发布时间:2020-7-29 09:48
很感谢@STMCU  把论坛bug修复了,自从换了手机号,好几年的时间都不能参加兑换了,一直是手机号格式不合法,虽然以前也反映过多次,不过bug一直存在。这次不但可以参加了,还兑换到了一块G4开发板,原本是想兑换NUCLEO_STM32F446的
G4系列还是第一次接触,看官网介绍,G4系列,处于主流行产品定位。模拟外设资源丰富,更像F3的升级产品。nucleo-G4板最直观的变化就是板载的仿真器从V2版升级到V3版了,之前主控是STM32F103C8,现在居然是高大上的F7了
微信图片_20200729090253.jpg


微信图片_20200729090328.jpg

因为是第一次使用,电脑还需要安装V3版的驱动
Snipaste_2020-07-29_09-19-17.jpg

不论是keil还是cubeMX,在安装的PCK里都有DSP的运算库,可以直接调用

Snipaste_2020-07-28_14-23-01.jpg

Snipaste_2020-07-28_14-22-49.jpg


直接添加相关的文件到工程中去,因为这里是要测试arm_cfft_f32与arm_rfft_fast_f32两个函数,因此添加如下文件
Snipaste_2020-07-28_14-38-32.jpg
其中,在lib目录下,有四个文件
Snipaste_2020-07-28_14-39-50.jpg
其后缀分别是Big endian,Floating Point Unit,Little endian,大端还是小端存储模式,是否支持浮点,因此加入了arm_cortexM4lf_math.lib。

计算FFT要涉及大量的浮点运算,所以首先要打开浮点运算单元,实际在现在的keil版本中,默认都是打开的


Snipaste_2020-07-28_14-27-20.jpg
省去了以前的开启宏定义:__FPU_USED。
要计算FFT,还有定义几个另外的宏
ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING,__FPU_PRESENT

Snipaste_2020-07-28_14-18-36.jpg

最后包含头文件
  1. #include "arm_math.h"
  2. #include "arm_const_structs.h"
  3. #include "stdio.h"
  4. #include "stdbool.h"
  5. #include <stdlib.h>
复制代码

这里省去了FFT的验证内容,就是生成一个合成波数据,对标准数据进行FFT,验证代码的准确性。验证无误后,进行主要的目的,时间测算。ADC采集数据,进行1024点FFT计算

  1. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
  2. HAL_Delay(50);
  3. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);
  4. HAL_Delay(50);
  5. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
  6. HAL_TIM_Base_Start_IT(&htim3);
  7. HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value_Buff, SIZE);
  8. HAL_TIM_Base_Start(&htim8);

  9. while(Buf_OK!=true);


  10. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);


  11. Buf_OK=false;

  12. arm_rfft_fast_init_f32(&sfft, FFT_LENGTH);
  13. for(i=0;i<FFT_LENGTH;i++)
  14. {
  15. fft_inputbuf[i]=(float)ADC_Value_Buff[j]*33/40960;
  16. j=j+2;
  17. }

  18. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);

  19. arm_rfft_fast_f32(&sfft,fft_inputbuf,fft_outputbuf,0);

  20. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);

  21. arm_cmplx_mag_f32(fft_outputbuf,fft_outputbuf2,FFT_LENGTH/2);


  22. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);


  23. for(int i=0;i<FFT_LENGTH/2;i++)
  24. {
  25. if(i!=0)
  26. {
  27. printf("%d: %.2f\r\n",i,fft_outputbuf2[i]*2/1024);
  28. }
  29. else
  30. {
  31. printf("%d: %.2f\r\n",i,fft_outputbuf2[i]/1024);
  32. }        
  33. }

  34. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);


  35. for(int i=0;i<FFT_LENGTH;i++)
  36. {
  37. fft_inputbuf[2*i]=(float)ADC_Value_Buff[j]*33/40960;

  38. fft_inputbuf[2*i+1]=0;
  39. j+=2;
  40. }

  41. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);


  42. arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,0,1);

  43. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_SET);



  44. arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);


  45. HAL_GPIO_WritePin(Ceshi_GPIO_Port, Ceshi_Pin, GPIO_PIN_RESET);
复制代码

arm_cfft_f32与arm_rfft_fast_f32全部用来计算实数,虚数部分程序里做赋0处理。


50ms的启动信号:
Snipaste_2020-07-14_10-03-41.jpg

ADC采集时间:
Snipaste_2020-07-14_10-04-14.jpg

数组赋值:
Snipaste_2020-07-14_10-04-36.jpg

arm_rfft_fast_f32的计算时间,mag_32时间:
Snipaste_2020-07-14_10-05-01.jpg

printf输出:
Snipaste_2020-07-14_10-06-00.jpg


数组赋值:
Snipaste_2020-07-14_10-06-34.jpg

arm_cfft_f32计算时间:
Snipaste_2020-07-14_10-06-43.jpg

mag_32计算时间:
Snipaste_2020-07-14_10-06-54.jpg

缩小验证:
Snipaste_2020-07-14_10-11-48.jpg
示波器测量:
微信图片_20200728162118.jpg

微信图片_20200728162126.jpg

微信图片_20200728162145.jpg

用了好几种方法来测试时间,相互验证,printf函数、RTC函数、定时器、示波器、逻辑分析仪,最后结果统一,说明没问题。可以看出arm_rfft_fast_f32确实要比arm_cfft_f32快很多,对于1024点的计算,一个是434us,一个是710us。
收藏 评论0 发布时间:2020-7-29 09:48

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版