[软件] 数学_&_运算库CMSIS DSP Lib简介与实验之一(矩阵相乘)

[复制链接]
2610|0
 楼主| zhanzr21 发表于 2017-2-6 19:12 | 显示全部楼层 |阅读模式
本帖最后由 zhanzr21 于 2017-2-6 19:13 编辑

现在正在做一个算法相关的产品, 所以对嵌入式算法库阿,优化这里做了一点小研究, 主要是ARM内核的CMSIS DSP库.
CMSIS DSP这个库很多人的电脑上都有很多份的Copy, 因为什么工具阿, 软件包都会包含这个在内, 比如安装了Keil MDK, IAR, Tasking, XMC Lib, USB Lib之类都会附带一个. 版本有很多种, 因为一直在更新. 估计不使用这个的人都没有留意.
这里以Keil附带的CMSIS DSP库为例子, 位置在这里:
cmsis_dsp_path.png
当然你使用器件DFP自带的版本也可以, ST测试过可能兼容性更好.
这个DSP Lib包含如下几类内容:
  • 基本数学函数(绝对值,多精度乘除)
  • 常用表格(比如FFT中要用的蝶形因子表格,正弦表格,很多时候查表比计算快很多)
  • 复数运算函数
  • PID相关函数
  • 滤波器函数(卷积,FIR,LMS等等)
  • 矩阵算术函数
  • 统计学函数(RMS,VAR,STD,平均值,最大最小)
  • 变换函数(FFT,反向FFT, 离散余弦变换等等)
需要指出的是, 这里面许多算法跟C Lib, C++ Lib中的很多功能有重叠之处, 比如开方, 幂函数, 三角函数, 但是这个库里面的函数都是为ARM内核深度优化的, 如果需要性能, 就应该尽量使用这个库里面的函数.

下面以一个矩阵相乘的例子简单看看如何使用这个库:
设定好路径后, 包含这个文件就可以了:
#include "arm_math.h"
对, 只用包含这个文件,

再添加这个lib:
cmsis_dsp_lib.png
选l还是lf版本的看你的CPU是否带有FPU.

开始使用:
定义两个矩阵的数据,当然也可以自动生成这里求简便:
  1. /* ----------------------------------------------------------------------
  2. ** First Matrix (DATA_LINE_N * DATA_COL_N)
  3. ** ------------------------------------------------------------------- */
  4. const float32_t firstMat_f32[DATA_LINE_N * DATA_COL_N] =
  5. {
  6.   42,  37,  81,  28,
  7.   83,  72,  36,  38,
  8.   32,  51,  63,  64,
  9.   97,  82,  95,  90,
  10.   66,  51,  54,  42,
  11.   67,  56,  45,  57,
  12.   67,  69,  35,  52,
  13.   29,  81,  58,  47,
  14.   38,  76, 100,  29,
  15.   33,  47,  29,  50,
  16.   34,  41,  61,  46,
  17.   52,  50,  48,  36,
  18.   47,  55,  44,  40,
  19. 100,  94,  84,  37,
  20.   32,  71,  47,  77,
  21.   31,  50,  49,  35,
  22.   63,  67,  40,  31,
  23.   29,  68,  61,  38,
  24.   31,  28,  28,  76,
  25.   55,  33,  29,  39
  26. };


  27. /* ----------------------------------------------------------------------
  28. * Second Matrix (DATA_COL_N * 1)
  29. * ------------------------------------------------------------------- */
  30. const float32_t secondMat_f32[DATA_COL_N] =
  31. {
  32.   1,
  33.     1,  
  34.     1,
  35.     1
  36. };
注意这个函数库中的数据类型:float32_t就相当于通常说的单精度浮点数
q31_t 相当於32位有符号整数
q15_t ..... 16....
q7_t ..... 8...
定义结果buffer:
  1. /* ----------------------------------------------------------------------
  2. ** f32 Output buffer
  3. ** ------------------------------------------------------------------- */
  4. static float32_t testOutput[DATA_LINE_N];

因为是20*4的矩阵乘以 4x1的矩阵,那么结果应该是20*1的矩阵

初始化矩阵:
  1.   arm_matrix_instance_f32 srcA = {DATA_LINE_N, DATA_COL_N, (float32_t *)firstMat_f32};
  2.   arm_matrix_instance_f32 srcB = {DATA_COL_N, 1, (float32_t *)secondMat_f32};
  3.   arm_matrix_instance_f32 dstC = {DATA_LINE_N, 1, testOutput};

相乘:
  1.   auto a_Stat = arm_mat_mult_f32(&srcA, &srcB, &dstC);
就这么简单!
            查看计算前计算后的结果:
  1.         cout<<endl<<"Before Cacl:"<<endl;               
  2.         for(auto i=0; i<(srcA.numCols*srcA.numRows); ++i)
  3.         {
  4.                 cout<<srcA.pData[i]<<' ';                        
  5.         }        
  6.         
  7.         tmpTick = g_Ticks;        
  8.   auto a_Stat = arm_mat_mult_f32(&srcA, &srcB, &dstC);
  9.         cout<<endl<<g_Ticks-tmpTick<<" Cacl Res:"<<a_Stat<<endl;               
  10.         for(auto i=0; i<(dstC.numCols*dstC.numRows); ++i)
  11.         {
  12.                 cout<<dstC.pData[i]<<' ';                        
  13.         }


评分

参与人数 1威望 +1 收起 理由
jlhgold + 1 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:每天都進步

91

主题

1017

帖子

34

粉丝
快速回复 在线客服 返回列表 返回顶部