【正点原子STM32连载】 第五十七章 DSP FFT实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第五十七章 DSP FFT实验

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

57.1 硬件设计
57.1.1 例程功能

  1. 按下KEY0按键进行FFT计算测试,LCD显示计算耗时,USART输出计算耗时和计算结果
  2. LED0闪烁,指示程序正在运行
    57.1.2 硬件资源
  3. LED
    LED0 - PF9
  4. 按键
    KEY0 - PE4
  5. USART1(PA9、PA10连接至板载USB转串口芯片上)
  6. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  7. FPU(可选,使用后相关的计算耗时更少)
  8. 基本定时器6
    57.1.3 原理图
    本章使用的DSP库为软件库,因此没有对应的连接原理图。
    57.2 程序设计
    57.2.1 实验应用代码
    本章实验的应用代码,如下所示:
int main(void)
{
    /* 必要初始化,代码省略 */
    
    while (1)
    {
    		key = key_scan(0);
    		
    		switch (key)
    		{
    			case KEY0_PRES:
    			{
    				/* 初始化FFT测试 */
    				fft_test_init(fft_inputbuf, FFT_LENGTH);
    				TMR_ConfigCounter(BTMR_TMRX_INT, 0);
    				g_timeout = 0;
    				
    				/* FFT计算测试 */
    				fft_test(fft_inputbuf);
    				time = TMR_ReadCounter(BTMR_TMRX_INT) + g_timeout * 0x10000;
    				sprintf(buf, "%0.1fms\r\n", (float)time / 10);
    				lcd_show_string(30 + 12 * 8, 160, 100, 16, 16, buf, BLUE);
    				
    				/* 对FFT运算结果取模求得幅值 */
    				fft_test_get_output(fft_inputbuf, fft_outputbuf, FFT_LENGTH);
    				printf("\r\n%d point FFT runtime:%0.1fms\r\n",
    						FFT_LENGTH, (float)time / 10);
    				printf("FFT Result:\r\n");
    				for (i=0; i<FFT_LENGTH; i++)
    				{
    					printf("fft_outputbuf[%d]:%f\r\n", i, fft_outputbuf[i]);
    				}
    				break;
    			}
    			default:
    			{
    				break;
    			}
    		}
    		
    		/* 省略其他代码 */
    }
}

从上面的代码中可以看出,在检测到KEY0按键被按下后,便会调用函数fft_test_init()以及相关函数对FFT运算测试进行初始化准备,随后调用函数fft_test()进行FFT运算测试,同时使用定时器统计运算耗时,最后调用函数fft_test_get_output()对FFT的运算结果取模,然后在串口调试助手上显示最终的结果。
以上提到的函数fft_test_init()、函数fft_test()和函数fft_test_get_output(),如下所示:

static arm_cfft_radix4_instance_f32 scfft;

/**
 * @brief	初始化FFT测试
 * @param	fft_inputbuf: FFT输入数组
 * @retval	fft_length: FFT长度
 */
void fft_test_init(float *fft_inputbuf, uint16_t fft_length)
{
    uint16_t i;
    
    arm_cfft_radix4_init_f32(&scfft, fft_length, 0, 1);
    
    /* 生成信号序列 */
    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;									/* 虚部 */
    }
}

/**
 * @brief	FFT计算测试
 * @param	fft_inputbuf: FFT输入数组
 * @retval	无
 */
void fft_test(float *fft_inputbuf)
{
    arm_cfft_radix4_f32(&scfft, fft_inputbuf);
}

/**
 * @brie	f对FFT计算测试结果取模求得幅值
 * @param	fft_inputbuf: FFT输入数组
 * @param	fft_outputbuf: FFT输出数组
 * @retval	fft_length: FFT长度
 * @retval	无
 */
void fft_test_get_output(	float *fft_inputbuf,
    							float *fft_outputbuf,
    							uint16_t fft_length)
{
    arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, fft_length);
}

可以看到,这三个函数实际上是对DSP库中函数的简单封装,本质还是调用了DSP库中的函数。但是可以看到,在使用了DSP库后,进行FFT运算变得十分简便,这非常有利于缩短应用开发周期。
57.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关信息,此时若按下KEY0按键进行FFT运算测试,测可以看到,在FFT运算结束后,LCD上显示了本次FFT运算的耗时时长,同时串口调试助手上也显示了本次FFT运算结果取模后的结果值。

你可能感兴趣的:(stm32,julia,嵌入式硬件)