打印
[牛人杂谈]

新唐的Cortex-M4 DSP内核运算有多强

[复制链接]
4067|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳稳の幸福|  楼主 | 2017-5-21 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家都知道C语言本身的基本库函数就有不少,比如数学库函数math.h
其实如果用了新唐带DSP内核的,还有个DSP专用的库,那么到底有多强呢。
看对比吧
三角函数运算
Cortex®-M4 DSP函数库,提供了计算Sine,Cosine的功能,以查表的方式减少计算时间
arm_cos_f32(float32_t x)

参数:
x
[in]欲计算的弧度  
回传值:
cos(x)
表 3‑14 使用弧度计算Cosine程序设定

arm_sin_f32(float32_t x)

参数:
x
[in]欲计算的弧度  
回传值:
sin(x)
表 3‑15 使用弧度计算Sine程序设定

  
arm_sin_cos_f32(float32_t theta, float32_t *pSinVal, float32_t  *pCosVal)
  
参数:
theta
[in] 欲计算的角度  
*pSinVal
[out] sine值输出  
*pCosVal
[out] cosine值输出  
回传值:
表 3‑16 使用角度计算Sine与Cosine程序设定


在范例程序中,比较了使用DSP函数库与使用C函数库运算时间,计算样本数为32,下表3-17比较有无使用DSP函数库运行时间差异,可以看出使用DSP函数库可以大幅缩减计算时间。
沙发
稳稳の幸福|  楼主 | 2017-5-21 09:09 | 只看该作者
/*计算sin, cos (32个样本数)*/ for(i=0; i< blockSize; i++)  
    {  
      /* 输入为弧度 */
                  cosOutput = arm_cos_f32(testInput_f32);                               sinOutput = arm_sin_f32(testInput_f32);
                           
         /* 输入为角度 */
         arm_sin_cos_f32(testInput_f32, &sinOutput1, &cosOutput1); }
  
Function(with 32 sample)
  
DSP(Time unit)
CPU(Time unit)
CPU/DSP
Sine  
551  
23251  
42.2  
Cosine  
551  
23720  
43.05  
Sine  and Cosine
413  
46561  
112.74  



使用特权

评论回复
板凳
稳稳の幸福|  楼主 | 2017-5-21 09:11 | 只看该作者
通过上表可以看出来对比了吧,一个三角函数都可以差别这么大。
双输出时候相差速度一百多倍。。可见新唐的DSP内核的单片机还是非常非常强悍的。

使用特权

评论回复
地板
稳稳の幸福|  楼主 | 2017-5-21 09:12 | 只看该作者
说起来线性插值运算,是很简单的,那么DSP还能提速吗?当然还能。。
使用Cortex®-M4 DSP函数库线性插值功能首先定义x0的样本数、起始值x0和x值与值间隔,再来输入y值数据,程序设定如表3-18与表3-19,完成浮点数插值结构设定之后,再输入x值执行程序,即可得到线性插值所得y值。

  
arm_linear_interp_instance_f32 S = {uint32_t nValues, float32_t x0,  
  
float32_t xSpacing, float32_t *pYData}
  
参数:
nValues
x值的样本数  
x0
x起始值  
xSpacing
x值与值之间隔  
*pYData
y值数据  
回传值:
表 3‑18 线性插值结构设定

  
arm_linear_interp_f32(arm_linear_interp_instance_f32 *S, float32_t  x)
  
参数:
*S
[in, out]浮点数插值结构  
x
[in] 输入x值
回传值:
线性插值y结果
表 3‑19 线性插值程序设定

使用特权

评论回复
5
稳稳の幸福|  楼主 | 2017-5-21 09:13 | 只看该作者
程序范例流程如下,且在下表3-20比较有无使用DSP运算时间差异:
/* 设定结构变量S,定义x样本个数为2,其起始为0数值间隔为10,即x0=0,x1=10,且定义y值为 arm_linear_interep_table */
arm_linear_interp_instance_f32 S = {2, 0, 10, (float32_t *)&arm_linear_interep_table[0]};

/* 循环放入10个样本进行线性插值运算,并且输出结果到testLinIntOutput[] */
for(i=0; i< TEST_LENGTH_SAMPLES; i++)
{  testLinIntOutput[i] = arm_linear_interp_f32(&S, testInputSin_f32[i]); }


使用特权

评论回复
6
稳稳の幸福|  楼主 | 2017-5-21 09:13 | 只看该作者
  
Function(with 10 sample)
  
DSP(Time unit)
CPU(Time unit)
CPU/DSP
Linear  Interpolation
138  
155  
1.12  
表 3‑20 线性插值有无使用DSP运算时间比较表

使用特权

评论回复
7
稳稳の幸福|  楼主 | 2017-5-21 09:14 | 只看该作者
可以看出来就算是再简单的运算在DSP里面都是有更快的解决方法的。

使用特权

评论回复
8
捉虫天师| | 2017-5-21 23:10 | 只看该作者
DSP就是专业计算的,肯定很厉害。

使用特权

评论回复
9
yiy| | 2017-5-22 17:27 | 只看该作者
DSP内核就是专业干这个的,肯定速度快于CPU。

使用特权

评论回复
10
wahahaheihei| | 2017-5-22 22:34 | 只看该作者
强大到你无法想象。

使用特权

评论回复
11
xixi2017| | 2017-5-23 09:31 | 只看该作者
确实不错,貌似找到最好的DSP内核的操作方式的教程就是新唐的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

3338

帖子

8

粉丝