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_CM4ARM_MATH_CM3 ARM_MATH_CM0 。而若需要使用FPU,则需要在设备头文件(如sam4e16e.h)中将宏__FPU_PRESENT 的值定义为1。

在AS6中,默认已经添加了DSP的支持。

  1. 进入工程属性的toolchain选项卡,可以在ARM/GNU C Complier的Directories中选择编译时搜索头文件的路径。AS6在建立工程时,就会一些需要的头文件拷贝到工程目录下,同时做好了路径设置。比如AS6已经把arm_math.h 拷贝到下图中方框指出的路径了:

  2. 在ARM/GNU Linker的Libraries选项中,可以选择链接时使用的库以及库的路径。同样,AS6已经把静态库文件拷贝到了工程目录下,且设置好了文件:

  3. 在ARM/GNU C Complier的Symbols选项中,可以设置预定义的宏。可以在这里声明说明DSP的目标平台的宏ARM_MATH_CM4

  4. 在设备头文件件中声明__FPU_PRESENT 的值。如果有FPU,则将该宏定义为1,否则定义为0。CMSIS已经做好了定义:

    //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的部件,也支持浮点数。所以只需要简单地调用下所需函数即可:

// 向量为(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单片机之旅——24、使用DSP库求向量数量积的更多相关文章

  1. SAM4E单片机之旅——23、在AS6(GCC)中使用FPU

    浮点单元(Floating Point Unit,FPU),是用于处理浮点数运算的单元. 为使用FPU,除了需要启用FPU外,还需要对编译器进行设置,以使其针对浮点运算生成特殊的指令.虽然在Atmel ...

  2. SAM4E单片机之旅——13、LCD之ASF初步

    在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字“Hel ...

  3. SAM4E单片机之旅——3、LED闪烁之定时器中断

    让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...

  4. SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压

    很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...

  5. SAM4E单片机之旅——17、通过UART进行标准IO

    交互还是很有必要的,而且使用键盘和显示器的交互效率还是很高的.当然,可以直接使用UART进行字符的输入和输出.但是又何必浪费了C的标准输入输出的格式控制之类的功能呢? 这次内容就是使用scanf() ...

  6. SAM4E单片机之旅——2、LED闪烁之轮询定时器

    之前我们使用空循环,达到了延迟的目的,但是这样子的延迟比较不精确.现在就使用实时定时器(RTT)来进行更为精确的计时.RTT虽然不是特别通用,在某些单片机上可能没有,但它较为简单. RTT内部有一个计 ...

  7. SAM4E单片机之旅——1、LED闪烁之空循环

    最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书.现在也让我写写几个小的程序,做做示例.既然写了文档之类的,就发到博客上来吧. 目前关于这芯片能参考的书籍大概就只 ...

  8. SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化

    网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法. 由于较为复杂,所以使用了ASF框架.但是也会对用到的库函数的实现做一个介绍 ...

  9. SAM4E单片机之旅——21、DMAC之USART回显

    DMAC也可以和外设进行数据交互.之前我们曾使用PDC进行USART的数据回显,这次就使用DMAC完成相同的工作.而且由于DMAC有内部的缓冲区,实现起来更为简单. 一. USART设置 因为之前已经 ...

随机推荐

  1. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  2. asp.net开发与web标准的冲突问题

    Visual Studio .net从2003到现在的2008,一路走来慢慢强大……从以前的vs2003能自动改乱你的html代码到现在在vs2008中都能直接对html代码进行w3c标准验证并提示了 ...

  3. Jquery验证插件 JqueryValidation 动态验证用户名等

    可以参考:http://www.w3cschool.cc/jquery/jquery-plugin-validate.html //form1 验证用户名 $("#form1"). ...

  4. autofac 使用

    var builder = new ContainerBuilder();var container = builder.Build(); var assemblies = new Directory ...

  5. jquery练习(一次性赋予多个属性值)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. jquery层级原则器(匹配前一个元素后的下一个元素,必须是挨着的)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Firemonkey TComboBox 下拉菜单字型修改方法 (D10)

    在 FMX 下的 TComboBox 下拉菜单字型修改有二种方法: uses FMX.Pickers; 使用 Style,需先设定好 Style 后,再指定预设项的 Style,方法如下: proce ...

  8. python补充最常见的内置函数

    最常见的内置函数是: print("Hello World!") 数学运算 abs(-5)                         # 取绝对值,也就是5 round(2. ...

  9. node.js图片上传

    1.node-formidable 对文件上传提供帮助的组件 2.app.js var formidable = require('formidable'); var http = require( ...

  10. Send push notification on Apple (APNS) on c#.net

    原文: http://apns-c-sharp-net-vikram-jain.blogspot.com ======================= Please, Install your ce ...