【正点原子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;/* 显示计算耗时,代码省略 */}
}

从上面的代码中可以看出,分别调用了两次函数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;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/206359.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各大电商平台双十一“狂飙”,如何选择商城系统?

今年是“双十一”的第十五年。作为各大平台和品牌的全年最重要的营销节点&#xff0c;品牌们可谓是来势汹汹&#xff0c;各种促销活动和优惠力度让人眼花缭乱。 淘天数据显示&#xff0c;天猫促销活动开售当晚&#xff0c;155个品牌开卖成交额突破1亿元&#xff1b;首小时内7.1…

C语言—指针入门

内存存放数据 如果发送指令&#xff0c;读取f变量的内容&#xff0c;则先找f - >10005这个字节&#xff0c;然后再找到123。 指针和指针变量 通常说的指针就是地址的意思&#xff0c;C中有专门的指针变量存放指针。一个指针占4个字节。 定义指针变量 类型名 *指针变量名…

基于Haclon的Blob分析

任务要求&#xff1a; 请用BLOB分析的方法计算图中所有灰度值在120和255之间的像素构成的8连通区域的面积与中心点坐标。 Blob基础&#xff1a; 分析过程&#xff1a;首先获取图像&#xff0c;然后根据特征对原始图像进行阈值分割&#xff08;区分背景像素和前景像素&#xf…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

亚马逊买家号用邮箱怎么注册

想要用邮箱注册亚马逊买家号&#xff0c;那么准备好能接受验证码的邮箱后打开相应的亚马逊官网即可。打开官网后点击注册——输入昵称——输入邮箱——输入密码——接受邮箱验证码并输入&#xff0c;如果遇到需要手机号验证就输入手机号&#xff0c;如果不需要验证&#xff0c;…

【追求卓越13】算法--深度和广度优先算法

引导 前面的几个章节&#xff0c;我们介绍了树这种数据结构&#xff0c;二叉搜索树在进行查找方面比较高效&#xff1b;有二叉树演变来的堆数据结构在处理优先级队列&#xff0c;top K&#xff0c;中位数等问题比较优秀&#xff1b;今天我们继续介绍新的数据结构——图。它在解…

主机dbeaver访问gitlab容器中的pg

映射5432端口- 5431:5432或者从docker客户端查看 version: 3.6 services:web:image: gitlab/gitlab-ce:latestrestart: alwayshostname: localhostenvironment:GITLAB_OMNIBUS_CONFIG: |external_url http://localhost:8929gitlab_rails[gitlab_shell_ssh_port] 2224ports:- …

Leetcode:622. 设计循环队列 题解【具详细】

目录 一、题目&#xff1a; 二、思路详解&#xff1a; 1.循环队列的存储定义 2.循环队列的创建 3.循环队列的判空与判断情况 (1) 循环队列的判空: (2) 循环队列的判满 4.循环队列元素的插入 5.循环队列元素的删除 6.获取队头元素 7.获取队尾元素 8.循环队列释放 三…

【Java】用Java库中自带的阻塞队列以及用阻塞队列实现生产者-消费者模型

1、阻塞队列(BlockingDeque) 首先我们来认识一下什么是堵塞队列 阻塞队列即实现了线程安全和阻塞的队列。在队列为空时&#xff0c;获取元素的线程会等待队列存放元素变为非空&#xff1b;在队列满时&#xff0c;存放元素的线程会等待队列取出元素变为不满。 阻塞队列常应用于生…

Elasticsearch:FMA 风格的向量相似度计算

作者&#xff1a;Chris Hegarty 在 Lucene 9.7.0 中&#xff0c;我们添加了利用 SIMD 指令执行向量相似性计算的数据并行化的支持。 现在&#xff0c;我们通过使用融合乘加 (Fused Mulitply-Add - FMA) 进一步推动这一点。 什么是 FMA 乘法和加法是一种常见的运算&#xff0c;…

ansible的基本安装

目录 一、简介 1.ansible自动化运维人工运维时代 2.自动化运维时代 3.ansible介绍 4.ansible特点 二、ansible实践 1.环境 2.ansible管理安装 3.ansible被管理安装 4.管理方式 5.添加被管理机器的ip 6.ssh密码认证方式管理 三、配置免密登录 1.ansible自带的密码…

网站被攻击了怎么办,有什么办法防御攻击?

近年来&#xff0c;随着互联网发展&#xff0c;出现了各种各样的网站&#xff0c;web应用&#xff0c;网络极大方便了人们的生活&#xff0c;改变了人们生活方式。而随着网络的发展普及&#xff0c;网络安全问题也困扰着用户。 许多人都曾有过这样经历&#xff0c;网站上线后&…