• 【正点原子STM32连载】第五十六章 DSP BasicMath实验 摘自【正点原子】APM32F407最小系统板使用指南


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

    第五十六章 DSP BasicMath实验

    本章介绍使用DSP库进行基本的数学运算。通过本章的学习,读者将学习到如何使用DSP库进行数学运算。
    本章分为如下几个小节:
    56.1 硬件设计
    56.2 程序设计
    56.3 下载验证

    56.1 硬件设计
    56.1.1 例程功能

    1. 上分别显示不使用DSP库和使用DSP库的计算正弦余弦的耗时
    2. LED0闪烁,指示程序正在运行
      56.1.2 硬件资源
    3. LED
    4. LED0 - PF9
    5. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    6. FPU(可选,使用后相关的计算耗时更少)
    7. 基本定时器6
      56.1.3 原理图
      本章实验使用的DSP库为软件库,因此没有对应的连接原理图。
      56.2 程序设计
      56.2.1 DPS库的使用
      本章实验使用APM32F4xx_SDK中提供的DSP库,将其添加到工程文件夹后,如下图所示:
      在这里插入图片描述

    图56.2.1.1 DSP库
    DSP中就提供了大量用于数学运算的函数,例如:正弦、余弦的计算等。使用DSP库能加快各种算法的实现,并且DSP中的函数是专门为DSP指令集做了相应的优化的,因此能以极高的效率在开启FPU且具有DSP指令集的MCU执行。
    DSP库的使用方法也很简单,仅需将需要使用的DSP库源文件添加到工程中,就能调用DSP库中的函数了,具体请见本章实验的配套实验例程。
    56.2.2 实验应用代码
    本章实验的应用代码,如下所示:

    int main(void)
    {
        /* 必要初始化,代码省略 */
        
        while (1)
        {
        		/* 不使用DSP库 */
        		TMR_ConfigCounter(BTMR_TMRX_INT, 0);
        		g_timeout = 0;
        		res = sin_cos_test(PI / 6, 200000, 0);
        		time = TMR_ReadCounter(BTMR_TMRX_INT) + g_timeout * 0x10000;
        		/* 显示计算耗时,代码省略 */
        		
        		/* 使用DSP库 */
        		TMR_ConfigCounter(BTMR_TMRX_INT, 0);
        		g_timeout = 0;
        		res = sin_cos_test(PI / 6, 200000, 1);
        		time = TMR_ReadCounter(BTMR_TMRX_INT) + g_timeout * 0x10000;
        		/* 显示计算耗时,代码省略 */
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    从上面的代码中可以看出,分别调用了两次函数sin_cos_test()在使用DSP库和不使用DSP的情况下分别进行200000次进行正弦和余弦的计算测试,并使用定时器统计两者的计算耗时,最终在LCD上显示两个的计算耗时情况。
    函数sin_cos_test()如下所示:

    #define DELTA	0.0001f	/* 误差值 */
    
    /**
     * @brief	正弦余弦测试
     * @param	angle: 起始角度
     * @param	times: 运算次数
     * @param	mode : 是否使用DSP库
     * @arg0: 	不使用
     * @arg1: 	使用
     * @retval	无
     */
    uint8_t sin_cos_test(float angle, uint32_t times, uint8_t mode)
    {
        float sinx;
        float cosx;
        float result;
        uint32_t i;
        
        if (mode == 0)									/* 不使用DSP库 */
        {
        		for (i=0; i<times; i++)
        		{
        			cosx = cosf(angle);						/* 不使用DSP库的sin、cos函数 */
        			sinx = sinf(angle);
        			result = sinx * sinx + cosx * cosx;	/* sin^2 + con^2 = 1 */
        			result = fabsf(result - 1.0f);			/* 对比与1的差值 */
        			if (result > DELTA)						/* 结果有误 */
        			{
        				return 0xFF;
        			}
        			angle += 0.001f;						/* 角度自增 */
        		}
        }
        else												/* 使用DSP库 */
        {
        		for (i=0; i<times; i++)
        		{
        			cosx = arm_cos_f32(angle);				/* 使用DSP库的sin、cos函数 */
        			sinx = arm_sin_f32(angle);
        			result = sinx * sinx + cosx * cosx;	/* sin^2 + con^2 = 1 */
        			result = fabsf(result - 1.0f);			/* 对比与1的差值 */
        			if (result > DELTA)						/* 结果有误 */
        			{
        				return 0xFF;
        			}
        			angle += 0.001f;						/* 角度自增 */
        		}
        }
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    从上面的代码中可以看出,使用DSP库计算正弦、余弦时,使用了DPS库中的函数arm_cos_f32()和函数arm_sin_f32(),不使用DSP库正弦、余弦时,使用了C标准库中的函数consf()和函数sinf()。
    56.3 下载验证
    在完成编译和烧录操作后,可以看到LCD上分别显示了不使用DSP库和使用DSP库的运算耗时时间,从两者的耗时时间中,能看出使用DSP库进行数学运算有明显的速度优势。

  • 相关阅读:
    【GEE笔记6】数据连接Join
    根据散度定义推导其在柱坐标和球坐标下的表达式
    MySQL 是否大小写敏感
    使用 Java 操作 Redis
    Delphi11.3FMX微信支付到个人账户源代码(手机POS机安卓源代码、手机APP收款机苹果源代码、PC源代码)
    【linux c/c++开发】零声教育新班开播(原理讲解+源码分析+案例分析+上线项目))
    可靠性工程师的发展之路
    数据结构和算法是人工智能的基石
    Stream流、函数式接口(Lambda)、链式编程
    windows 平台下编译openssl 最新版本-3.0.5
  • 原文地址:https://blog.csdn.net/weixin_55796564/article/details/134556382