本帖最后由 正点原子运营 于 2024-5-23 18:02 编辑
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
本章将使用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 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
- {
- uint8_t t = 0;
- uint8_t key;
- float time;
- char buf[50];
- arm_cfft_radix4_instance_f32 s;
- uint16_t i;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
- delay_init(72); /* 初始化延时 */
- usart_init(115200); /* 初始化串口 */
- led_init(); /* 初始化LED */
- key_init(); /* 初始化按键 */
- lcd_init(); /* 初始化LCD */
- btim_timx_int_init(0xFFFF, 7200 - 1); /* 初始化基本定时器 */
-
- lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
- lcd_show_string(30, 70, 200, 16, 16, "DSP FFTTEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
-
- lcd_show_string(30, 110, 200, 16, 16, "WKUP:RunFFT", RED);
- lcd_show_string(30, 130, 200, 16, 16, "FFTruntime:", RED);
-
- /* FFT计算初始化 */
- arm_cfft_radix4_init_f32(&s, FFT_LENGTH, 0, 1);
-
- while (1)
- {
- key = key_scan(0);
- if (key == WKUP_PRES)
- {
- /* 生成输入数据 */
- for (i=0; i<FFT_LENGTH; i++)
- {
- fft_inputbuf[2 * i] = 100 +
- 10 * arm_sin_f32(2 * PI * i / FFT_LENGTH) +
- 30 * arm_sin_f32(2 * PI * i * 4 / FFT_LENGTH) +
- 50 * arm_cos_f32(2 * PI * i * 8 / FFT_LENGTH);
- fft_inputbuf[2 * i + 1] = 0;
- }
-
- /* FFT计算并计算耗时 */
- __HAL_TIM_SET_COUNTER(&g_timx_handle, 0);
- g_timeout = 0;
- arm_cfft_radix4_f32(&s, fft_inputbuf);
- time = __HAL_TIM_GET_COUNTER(&g_timx_handle) +
- (uint32_t)g_timeout * 0x10000;
- sprintf(buf, "%0.1fms\r\n", time / 10);
- lcd_show_string(126, 130, 200, 16, 16, buf, BLUE);
-
- /* 对FFT计算结果取模并通过串口输出 */
- arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);
- printf("\r\n%d point FFT runtime:%0.1fms\r\n",
- FFT_LENGTH, time / 10);
- printf("FFT Result:\r\n");
- for (i=0; i<FFT_LENGTH; i++)
- {
- printf("fft_outputbuf[%d]:%f\r\n", i, fft_outputbuf);
- }
- }
-
- if (++t == 20)
- {
- t = 0;
- LED0_TOGGLE();
- }
-
- delay_ms(10);
- }
- }
复制代码从上面的代码中可以看出,在检测到WKUP按键被按下后,便会调用DSP库中的函数arm_cfft_radix4_f32()进行FFT运算测试,同时使用定时器统计运算耗时,最后调用函数arm_cmplx_mag_f32()对FFT的运算结果取模,然后在串口调试助手上显示最终的结果。在使用了DSP库后,进行FFT运算变得十分简便,这非常有利于缩短应用开发周期。
51.3 下载验证 在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关信息,此时若按下WKUP按键进行FFT运算测试,测可以看到,在FFT运算结束后,LCD上显示了本次FFT运算的耗时时长,同时串口调试助手上也显示了本次FFT运算结果取模后的结果值。 |