硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2868|回复: 0
收起左侧

[DSP] DSP库的几个宏定义ARM_MATH_ROUNDING,ARM_MATH_LOOPUNROLL等代表的含义

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-8-27 10:40:19 | 显示全部楼层 |阅读模式
老版本DSP库没有这些宏定义的,这个是新版本增加的。

ARM_MATH_BIG_ENDIAN:
大端格式。

ARM_MATH_MATRIX_CHECK:
检测矩阵的输入输出大小

ARM_MATH_NEON:
ARM_MATH_NEON_EXPERIMENTAL:

这两个暂时用不到,因为M0,M3,M4和M7内核不支持NEON指令,需要等待升级到ARMv8.1-M架构

ARM_MATH_ROUNDING:
主要用在浮点数转Q32,Q15和Q7时,类似四舍五入的处理上,其它函数没用到。

ARM_MATH_LOOPUNROLL:
用于4个为一组的的小批量处理上,加快执行速度。

通过下面的求绝对值函数,可以方便的看出区别:
  1. void arm_abs_f32(
  2.   const float32_t * pSrc,
  3.         float32_t * pDst,
  4.         uint32_t blockSize)
  5. {
  6.         uint32_t blkCnt;                               /* Loop counter */

  7. #if defined(ARM_MATH_NEON)
  8.     float32x4_t vec1;
  9.     float32x4_t res;

  10.     /* Compute 4 outputs at a time */
  11.     blkCnt = blockSize >> 2U;

  12.     while (blkCnt > 0U)
  13.     {
  14.         /* C = |A| */

  15.             /* Calculate absolute values and then store the results in the destination buffer. */
  16.         vec1 = vld1q_f32(pSrc);
  17.         res = vabsq_f32(vec1);
  18.         vst1q_f32(pDst, res);

  19.         /* Increment pointers */
  20.         pSrc += 4;
  21.         pDst += 4;
  22.         
  23.         /* Decrement the loop counter */
  24.         blkCnt--;
  25.     }

  26.     /* Tail */
  27.     blkCnt = blockSize & 0x3;

  28. #else
  29. #if defined (ARM_MATH_LOOPUNROLL)

  30.   /* Loop unrolling: Compute 4 outputs at a time */
  31.   blkCnt = blockSize >> 2U;

  32.   while (blkCnt > 0U)
  33.   {
  34.     /* C = |A| */

  35.     /* Calculate absolute and store result in destination buffer. */
  36.     *pDst++ = fabsf(*pSrc++);

  37.     *pDst++ = fabsf(*pSrc++);

  38.     *pDst++ = fabsf(*pSrc++);

  39.     *pDst++ = fabsf(*pSrc++);

  40.     /* Decrement loop counter */
  41.     blkCnt--;
  42.   }

  43.   /* Loop unrolling: Compute remaining outputs */
  44.   blkCnt = blockSize % 0x4U;

  45. #else

  46.   /* Initialize blkCnt with number of samples */
  47.   blkCnt = blockSize;

  48. #endif /* #if defined (ARM_MATH_LOOPUNROLL) */
  49. #endif /* #if defined(ARM_MATH_NEON) */

  50.   while (blkCnt > 0U)
  51.   {
  52.     /* C = |A| */

  53.     /* Calculate absolute and store result in destination buffer. */
  54.     *pDst++ = fabsf(*pSrc++);

  55.     /* Decrement loop counter */
  56.     blkCnt--;
  57.   }

  58. }
复制代码






回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 18:49 , Processed in 0.138166 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表