OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 585|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第五十一章 DSP FFT实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-23 18:02:48 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-23 18:02 编辑

第五十一章 DSP FFT实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版

3)购买链接:https://detail.tmall.com/item.htm?&id=609293737870

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144


155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章将使用DSP进行快速傅里叶变换(FFT)的运算测试。通过本章的学习,读者将学习到DSP库中FFT运算的简单应用。
本章分为如下几个章节:
51.1 硬件设计
51.2 程序设计
51.3 下载验证

51.1 硬件设计
51.1.1 例程功能
1. 按下WKUP按键可进行FFT计算,并在LCD上显示计算耗时,同时通过串口输出计算结果
2. LED0闪烁,提示程序正在运行

51.1.2 硬件资源
1. LED
       LED0 - PB5
2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块
3. 按键
       WKUP - PA0
4. USART1
       USART1_TX - PA9
       USART1_RX - PA10

51.1.3原理图
本章使用的DSP库为软件库,因此没有对应的连接原理图。

51.2 程序设计
51.2.1 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint8_t t = 0;
  4.     uint8_t key;
  5.     float time;
  6.     char buf[50];
  7.    arm_cfft_radix4_instance_f32 s;
  8.     uint16_t i;
  9.    
  10.    HAL_Init();                             /* 初始化HAL库 */
  11.    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 配置时钟,72MHz */
  12.    delay_init(72);                         /* 初始化延时 */
  13.    usart_init(115200);                     /* 初始化串口 */
  14.    led_init();                             /* 初始化LED */
  15.    key_init();                             /* 初始化按键 */
  16.    lcd_init();                             /* 初始化LCD */
  17.    btim_timx_int_init(0xFFFF, 7200 - 1);   /* 初始化基本定时器 */
  18.    
  19.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  20.    lcd_show_string(30, 70, 200, 16, 16, "DSP FFTTEST", RED);
  21.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  22.    
  23.    lcd_show_string(30, 110, 200, 16, 16, "WKUP:RunFFT", RED);
  24.    lcd_show_string(30, 130, 200, 16, 16, "FFTruntime:", RED);
  25.    
  26.     /* FFT计算初始化 */
  27.    arm_cfft_radix4_init_f32(&s, FFT_LENGTH, 0, 1);
  28.    
  29.     while (1)
  30.     {
  31.          key = key_scan(0);
  32.          if (key == WKUP_PRES)
  33.          {
  34.              /* 生成输入数据 */
  35.              for (i=0; i<FFT_LENGTH; i++)
  36.              {
  37.                  fft_inputbuf[2 * i] = 100 +
  38.                                  10 * arm_sin_f32(2 * PI * i / FFT_LENGTH) +
  39.                                  30 * arm_sin_f32(2 * PI * i * 4 / FFT_LENGTH) +
  40.                                  50 * arm_cos_f32(2 * PI * i * 8 / FFT_LENGTH);
  41.                                  fft_inputbuf[2 * i + 1] = 0;
  42.              }
  43.             
  44.              /* FFT计算并计算耗时 */
  45.              __HAL_TIM_SET_COUNTER(&g_timx_handle, 0);
  46.              g_timeout = 0;
  47.              arm_cfft_radix4_f32(&s, fft_inputbuf);
  48.              time = __HAL_TIM_GET_COUNTER(&g_timx_handle) +
  49.                      (uint32_t)g_timeout * 0x10000;
  50.              sprintf(buf, "%0.1fms\r\n", time / 10);
  51.              lcd_show_string(126, 130, 200, 16, 16, buf, BLUE);
  52.             
  53.              /* 对FFT计算结果取模并通过串口输出 */
  54.              arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);
  55.              printf("\r\n%d point FFT runtime:%0.1fms\r\n",
  56.                      FFT_LENGTH, time / 10);
  57.              printf("FFT Result:\r\n");
  58.              for (i=0; i<FFT_LENGTH; i++)
  59.              {
  60.                  printf("fft_outputbuf[%d]:%f\r\n", i, fft_outputbuf);
  61.              }
  62.          }
  63.          
  64.          if (++t == 20)
  65.          {
  66.              t = 0;
  67.              LED0_TOGGLE();
  68.          }
  69.          
  70.          delay_ms(10);
  71.     }
  72. }
复制代码
从上面的代码中可以看出,在检测到WKUP按键被按下后,便会调用DSP库中的函数arm_cfft_radix4_f32()进行FFT运算测试,同时使用定时器统计运算耗时,最后调用函数arm_cmplx_mag_f32()对FFT的运算结果取模,然后在串口调试助手上显示最终的结果。在使用了DSP库后,进行FFT运算变得十分简便,这非常有利于缩短应用开发周期。

51.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关信息,此时若按下WKUP按键进行FFT运算测试,测可以看到,在FFT运算结束后,LCD上显示了本次FFT运算的耗时时长,同时串口调试助手上也显示了本次FFT运算结果取模后的结果值。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表