DSP(Digital Signal Processing,数字信号处理)中会使用大量的数学运算。Cortex-M4中,配置了一些强大的部件,以提高DSP能力。同时CMSIS提供了一个DSP库,提供了许多数学函数的高效实现。
这次就先做一个简单的尝试,求两个向量的数量积。
一、 硬件
MAC单元
MAC(Multiply-ACcumulate,乘积累加),是DSP中常用的一种运算。Cortex-M4配置了一个32位的MAC单元,它能在1个周期里实现最高难度为32位乘32位再加64位的运算,或是两个16位乘16位的运算。Cortex-M4支持的MAC指令如下,这些指令都能在1个周期内完成:
SIMD
SIMD(Single Instruction Multiple Data,单指令多数据),可以提高DSP时的计算效率。这在Cortex-M3中不可用的。使用Cortex-M4的SIMD指令,可以在一个周期内并行地完成4个8位数的加减,或是2个16位数的加减。
FPU
FPU是Cortex-M4增加的可选的部件(SAM4E配备了FPU)。其实现了单精度的浮点数运算,包括一些MAC运算:
二、 使用CMSIS的DSP库
CMSIS中,提供了一个DSP库。这里对DSP中常用的数学运算做了很高效的实现。而对于Cortex-M4,其实现也针对SIMD进行了优化。
在CMSIS\Include文件夹中,头文件arm_math.h 声明了这些函数。而在CMSIS\Lib\GCC 中,有针对各平台编译好了的静态库文件。在CMSIS\DSP_Lib\Source 中,有DSP的实现源码。
而在使用arm_math.h 文件的过程中,需要根据目标平台预定义宏ARM_MATH_CM4,ARM_MATH_CM3 或ARM_MATH_CM0 。而若需要使用FPU,则需要在设备头文件(如sam4e16e.h)中将宏__FPU_PRESENT 的值定义为1。
在AS6中,默认已经添加了DSP的支持。
进入工程属性的toolchain选项卡,可以在ARM/GNU C Complier的Directories中选择编译时搜索头文件的路径。AS6在建立工程时,就会一些需要的头文件拷贝到工程目录下,同时做好了路径设置。比如AS6已经把arm_math.h 拷贝到下图中方框指出的路径了:
在ARM/GNU Linker的Libraries选项中,可以选择链接时使用的库以及库的路径。同样,AS6已经把静态库文件拷贝到了工程目录下,且设置好了文件:
在ARM/GNU C Complier的Symbols选项中,可以设置预定义的宏。可以在这里声明说明DSP的目标平台的宏ARM_MATH_CM4:
在设备头文件件中声明__FPU_PRESENT 的值。如果有FPU,则将该宏定义为1,否则定义为0。CMSIS已经做好了定义:
1 2 3 4 | //File: …src\ASF\sam\utils\cmsis\sam4e\include\sam4e16e.h //Line: 266 /**< SAM4E16E does provide a FPU */ #define __FPU_PRESENT 1 |
另外,如果不使用AS6提供的startup文件,或者需要在自己的代码中使用FPU的话,还需要做额外的设置。相关内容在FPU的示例中做了说明。
三、 简单示例
DSP库里有计算向量数量积的函数。DSP库的函数支持多种类型的定点数,且对于配备了FPU的部件,也支持浮点数。所以只需要简单地调用下所需函数即可:
1 2 3 4 5 6 7 8 9 10 | // 向量为(0.0, 1.1, 2.2, ..., 16.5) const int VEC_SIZE = 16; float32_t vec[VEC_SIZE]; for (int i = 0; i < VEC_SIZE; ++i) vec[i] = 1.1f * i; // 计算向量与自身的数量积 float32_t result = 0; arm_dot_prod_f32(vec, vec, VEC_SIZE, &result); // result == 1500.4 |
查看arm_dot_prod_f32() 的实现,发现其已经为了效率进行了循环展开。而查看另外一些有关定点数的运算,可以发现其实现已经使用了SIMD等特殊指令;有些甚至针对内存访问的延迟进行了优化。不难看出,这个库的实现进行了细致优化的。
另外,除了基本的数学函数,DSP库也实现了快速数学函数(三角函数、开平方等)、实数相关、矩阵运算、统计、滤波、变换(FFT等)、马达控制等功能。arm_math.h 中,已经对各个函数的功能、参数意义等做了详细的说明。
关键字:SAM4E 单片机 DSP库 向量数量积
引用地址:
SAM4E单片机之旅——24、使用DSP库求向量数量积
推荐阅读最新更新时间:2024-03-16 15:29
51单片机学习笔记———1.自定义延时函数点亮并控制LED的闪烁秒数以及用Proteus仿真
#include reg52.h #define LED P0 void delay();//延时一秒 void main() //按位操作点亮小灯 { unsigned int i; while(1) { for(i = 0;i 8;i++) { LED = ~(0X01 i);//之所以要取反,因为这样的十六进是制数比较小,比较直观 delay(); } } } void delay() //延时一秒 { unsigned int i,j; for(i = 0;i 83;i++) { for(j = 0;j 1000;j++) { ;
[单片机]
一种基于单片机的转速测量仪研究及设计
1 引言 测量转子速度的方法很多,但多数比较复杂。目前,测量转速的方法主要有四种:机械式、电磁式、光电式和激光式。机械式主要利用离心力原理,通过一个随轴转动的固定质量重锤带动自由轴套上下运动,根据不同转速对应不同轴套位置获得测量结果原理简单直接,不需额外电器设备,适用于精度要求不高、接触式的转速测量场合。电磁式系统由电磁传感器和安装在轴上的齿盘组成,主轴转动带动齿盘旋转,齿牙通过传感器时引起电路磁阻变化,经过放大整形后形成脉冲,通过脉冲得到转速值。由于受齿盘加工精度、齿牙最小分辨间隔、电路最大计数频率等限制,测量精度不能保证。光电式结构类似于电磁式结构,把旋转齿盘换作光电编码盘或黑白相间的反射条纹,把电磁传感器换作光电接收器,
[单片机]
基于单片机的低功耗甲烷检测系统设计方案
1引言 气体检测系统表是工矿企业、社会公用事业、环境保护等领域必备的安全装备。经过几十年的发展,在可测气体种类、测量范围、精度、稳定性、寿命等主要技术指标方面均有明显提高,随着大规模集成电路技术的发展,仪表向微型化、多参数组合与智能化方向发展。新型甲烷气体检测系统应具有智能化的特点,能在一定其他气体干扰的情况下工作,可以采用电子鼻。系统的结构,通过模式识别方法辨识甲烷气体。以小型化的电子鼻系统为基础的甲烷气体检测系统,在设计上应考虑减小系统的体积、简化气体的进样装置和改进电路以满足低功耗要求等问题;另外便携式检测系统的操作者通常情况下是现场人员,属于非专业人员,系统的操作不能复杂,因此对于系统的人机交互功能在设计上也
[测试测量]
用87C196NT单片机实现CAN总线通信
摘要: 主要介绍CAN总线的原理及如何用87C196NT单片机实现基于CAN总线的网络通信;对其硬件和软件设计作详细的分析,最后给出下位机程序。
关键词: 单片机 CAN总线 87C196NT PCA82C200
1 CAN总线简介
CAN(Controller Area Network)即控制器局域网,主要用于各种设备监测及控制的一种现场总线。CAN总线最初是由德国Bosch公司为汽车的监测、控制系统而设计的。CAN总线具有独特的设计思想,良好的功能特性和极高的可靠性,现场抗干扰能力强。具体来讲,CAN总线具有如下特点:
*结构简单,只有2根线与外部相连,且内部含有错误探测和管理模块
[应用]
学习单片机需要做什么?
单片机是大专学校电类专业的一门普通课,有些学校甚至把它列为选修课,在众多课程中,没有显出它有多么重要。为什么要学习它呢?电类专业有很多专业课,这些专业课非常重要,是各个专业存在的必需课程,学完这些课程可以使学习者成为大学者的继承人,市场对学者继承人的需求太少,大量需要的是产品的研发者,研发产品是需要干实际事情的,需要研发工具,而单片机课程就是学习研发工具使用的课程。学习单片机课程与理论课程不一样,不能只做作业,而是要实际使用单片机,下面就如何准备学习单片机的条件和学习步骤简述一些不成熟的想法。 1. 硬件 (1)编程硬件 所谓编程就是把单片机运行的程序烧写到单片机的存储器中,目前大部分单片机都是使用FLASH存储器,这些存储器的
[单片机]
初步认识51单片机-2.2单片机控制LCD1602液晶显示模块
上面学的两招,控制IO和延时,在这里要举的第一个例子就是LCD1602。LCD1602什么意思,表示一行可以显示16个字符,一共有两行。先来个LCD1602的简单介绍,1602LCD主要技术参数: 显示容量:16 2个字符 芯片工作电压:4.5 5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95 4.35(W H)mm 引脚功能说明 1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示: 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产
[单片机]
51实验12:数码管显示12345678
/************************************************************************************** 实验现象:下载程序后 动态数码管模块 从左至右显示1-8 ***************************************************************************************/ #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned
[单片机]
单片机复位标志位的设置与应用研究
引言 设置复位标志位便于区分不同原因引发的复位,作为一种新技术被越来越多的新型单片机所采纳。例如Philips公司的P87LPC700和 P89LPC900系列、Freescale公司(原Motorola半导体部)的MC68HC05系列和MC68HC08系列、Sunplus公司的 SPMC65系列、Microchip公司的PIC系列等,内部都设计了专门用于记录各种复位标志的状态寄存器。 MC68HC08系列有一个复位状态寄存器,负责记录6种复位标志位:上电复位、引脚复位、看门狗复位、非法指令复位、非法地址复位和欠压复位。SPMC65系列有一个系统控制寄存器,负责记录5种复位标志位:上电复位、外部复位、看门狗复位、非法地址复位和
[应用]