ARM_DSP库——基础函数

相反数、偏移、移位、减法、比例因子

一、相反数(Vector Negate)

这部分函数主要用于求相反数,公式描述如下:

pDst[n] = -pSrc[n],   0 <= n < blockSize;

特别注意,这部分函数支持目标指针和源指针指向相同的缓冲区。

函数arm_negate_f32

用于求32位浮点数的相反数。

函数arm_negate_q31

用于求32位定点数的相反数。

函数arm_negate_q15

用于求16位定点数的相反数。

函数arm_negate_q7

用于求8位定点数的相反数。

  • 函数参数:

    • 第 1 个参数是源数据地址。
    • 第 2 个参数是求相反数后目的数据地址。
    • 第 3 个参数转换的数据个数,这里是指的浮点数或定点数个数。

使用举例

#define log_i printf
void DSP_Negate(void)
{float32_t pSrc = 0.0f;float32_t pDst;q31_t pSrc1 = 0;q31_t pDst1;q15_t pSrc2 = 0;q15_t pDst2;q7_t pSrc3 = 0;q7_t pDst3;/* 求相反数 */pSrc -= 1.23f;arm_negate_f32(&pSrc, &pDst, 1);log_i("arm_negate_f32 = %f\r\n", pDst);pSrc1 -= 1;arm_negate_q31(&pSrc1, &pDst1, 1);log_i("arm_negate_q31 = %d\r\n", pDst1);pSrc2 -= 1;arm_negate_q15(&pSrc2, &pDst2, 1);log_i("arm_negate_q15 = %d\r\n", pDst2);pSrc3 += 1;arm_negate_q7(&pSrc3, &pDst3, 1);log_i("arm_negate_q7 = %d\r\n", pDst3);log_i("*****************\r\n");
}

二、偏移(Vector Offset)

这部分函数主要用于求偏移,公式描述如下:

pDst[n] = pSrc[n] + offset,   0 <= n < blockSize;

这部分函数支持目标指针和源指针指向相同的缓冲区。

函数arm_offset_f32

用于求两个 32 位浮点数的偏移。

函数 arm_offset_q31

用于求两个32位定点数的偏移。

函数 arm_offset_q15

用于求两个 16 位定点数的偏移。

函数 arm_offset_q7

用于求两个 8 位定点数的偏移。

  • 函数参数:

    • 第 1 个参数是源数据地址。
    • 第 2 个参数是偏移量。
    • 第 3 个参数是转换后的目的地址。
    • 第 4 个参数是浮点数或定点数个数,其实就是执行偏移的次数。

使用举例

#define log_i printf
void DSP_Offset(void)
{float32_t pSrcA = 0.0f;float32_t Offset = 0.0f;float32_t pDst;q31_t pSrcA1 = 0;q31_t Offset1 = 0;q31_t pDst1;q15_t pSrcA2 = 0;q15_t Offset2 = 0;q15_t pDst2;q7_t pSrcA3 = 0;q7_t Offset3 = 0;q7_t pDst3;/* 求偏移 */Offset--;arm_offset_f32(&pSrcA, Offset, &pDst, 1);log_i("arm_offset_f32 = %f\r\n", pDst);Offset1--;arm_offset_q31(&pSrcA1, Offset1, &pDst1, 1);log_i("arm_offset_q31 = %d\r\n", pDst1);Offset2--;arm_offset_q15(&pSrcA2, Offset2, &pDst2, 1);log_i("arm_offset_q15 = %d\r\n", pDst2);Offset3--;arm_offset_q7(&pSrcA3, Offset3, &pDst3, 1);log_i("arm_offset_q7 = %d\r\n", pDst3);log_i("*******************\r\n");
}

三、移位(Vector Shift)

这部分函数主要用于实现移位,公式描述如下:

pDst[n] = pSrc[n] << shift,   0 <= n < blockSize;

这部分函数支持目标指针和源指针指向相同的缓冲区。

函数 arm_shift_q31

用于求32位定点数的左移或者右移。

函数 arm_shift_q15

用于求16位定点数的左移或者右移。

函数 arm_shift_q7

用于求8位定点数的左移或者右移。

  • 函数参数:

    • 第 1 个参数是源数据地址。
    • 第 2 个参数是左移或者右移位数,正数是左移,负数是右移。
    • 第 3 个参数是移位后数据地址。
    • 第 4 个参数是定点数个数,其实就是执行左移或者右移的次数。

使用举例

void DSP_Shift(void)
{q31_t pSrcA1 = 0x88886666;q31_t pDst1;q15_t pSrcA2 = 0x8866;q15_t pDst2;q7_t pSrcA3 = 0x86;q7_t pDst3;/* 求移位 */arm_shift_q31(&pSrcA1, 3, &pDst1, 1);log_i("arm_shift_q31 = %8x\r\n", pDst1);arm_shift_q15(&pSrcA2, -3, &pDst2, 1);log_i("arm_shift_q15 = %4x\r\n", pDst2);arm_shift_q7(&pSrcA3, 3, &pDst3, 1);log_i("arm_shift_q7 = %2x\r\n", pDst3);log_i("******************\r\n");
}

四、减法(Vector Sub)

这部分函数主要用于实现减法,公式描述如下:

pDst[n] = pSrcA[n] - pSrcB[n],   0 <= n < blockSize;

函数 arm_sub_f32

用于求32位浮点数的减法。

函数 arm_sub_q31

用于求32位定点数的减法。

函数 arm_sub_q15

用于求16位定点数的减法。

函数 arm_sub_q7

用于求8位定点数的减法。

  • 函数参数:

    • 第 1 个参数是减数地址。
    • 第 2 个参数是被减数地址。
    • 第 3 个参数是结果地址。
    • 第 4 个参数是数据块大小,其实就是执行减法的次数。

使用举例

void DSP_Sub(void)
{float32_t   pSrcA[5] = {1.0f,1.0f,1.0f,1.0f,1.0f};float32_t   pSrcB[5] = {1.0f,1.0f,1.0f,1.0f,1.0f};float32_t   pDst[5];q31_t  pSrcA1[5] = {1,1,1,1,1};q31_t  pSrcB1[5] = {1,1,1,1,1};q31_t  pDst1[5];q15_t  pSrcA2[5] = {1,1,1,1,1};q15_t  pSrcB2[5] = {1,1,1,1,1};q15_t  pDst2[5];q7_t  pSrcA3[5] = {0x70,1,1,1,1};q7_t  pSrcB3[5] = {0x7f,1,1,1,1};q7_t  pDst3[5];/* 求减法 */pSrcA[0] += 1.1f;arm_sub_f32(pSrcA, pSrcB, pDst, 5);log_i("arm_sub_f32 = %f\r\n", pDst[0]);pSrcA1[0] += 1;arm_sub_q31(pSrcA1, pSrcB1, pDst1, 5);log_i("arm_sub_q31 = %d\r\n", pDst1[0]);pSrcA2[0] += 1;arm_sub_q15(pSrcA2, pSrcB2, pDst2, 5);log_i("arm_sub_q15 = %d\r\n", pDst2[0]);pSrcA3[0] += 1;arm_sub_q7(pSrcA3, pSrcB3, pDst3, 5);log_i("arm_sub_q7 = %d\r\n", pDst3[0]);log_i("*******************\r\n");
}

五、比例因子(Vector Scale)

这部分函数主要用于实现数据的比例放大和缩小,浮点数据公式描述如下:

pDst[n] = pSrc[n] * scale,   0 <= n < blockSize

如果是 Q31,Q15,Q7 格式的数据,公式描述如下:

pDst[n] = (pSrc[n] * scaleFract) << shift,   0 <= n < blockSize

这种情况下,比例因子就是:

scale = scaleFract * 2^shift

这部分函数支持目标指针和源指针指向相同的缓冲区

函数 arm_scale_f32

用于求32位浮点数的比例因子计算。

函数 arm_scale_q31

用于求32位定点数的比例因子计算。

函数 arm_scale_q15

用于求16位定点数的比例因子计算。

函数 arm_scale_q7

用于求8位定点数的比例因子计算。

  • 函数参数:

    • 第 1 个参数是数据源地址。
    • 第 2 个参数是比例因子
    • 第 3 个参数是结果地址。
    • 第 4 个参数是数据块大小,其实就是执行比例因子计算的次数。

使用举例

void DSP_Scale(void)
{float32_t   pSrcA[5] = {1.0f,1.0f,1.0f,1.0f,1.0f};float32_t   scale = 0.0f;float32_t   pDst[5];q31_t  pSrcA1[5] = {0x6fffffff,1,1,1,1};q31_t  scale1 = 0x6fffffff;q31_t  pDst1[5];q15_t  pSrcA2[5] = {0x6fff,1,1,1,1};q15_t  scale2 = 0x6fff;q15_t  pDst2[5];q7_t  pSrcA3[5] = {0x70,1,1,1,1};q7_t  scale3 = 0x6f;q7_t pDst3[5];/* 求比例因子计算 */scale += 0.1f;arm_scale_f32(pSrcA, scale, pDst, 5);printf("arm_scale_f32 = %f\r\n", pDst[0]);scale1 += 1;arm_scale_q31(pSrcA1, scale1, 0, pDst1, 5);printf("arm_scale_q31 = %x\r\n", pDst1[0]);scale2 += 1;arm_scale_q15(pSrcA2, scale2, 0, pDst2, 5);printf("arm_scale_q15 = %x\r\n", pDst2[0]);scale3 += 1;arm_scale_q7(pSrcA3, scale3, 0, pDst3, 5);printf("arm_scale_q7 = %x\r\n", pDst3[0]);printf("*******************\r\n");
}

[学习笔记]ARM_DSP库——基础函数(相反数、偏移、移位、减法、比例因子)相关推荐

  1. 【STM32F429的DSP教程】第12章 DSP基础函数-相反数,偏移,移位,减法和比例因子

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第12章       DSP基础函数-相反数,偏移,移位,减 ...

  2. C语言学习笔记---C库排序函数qsort()

      在处理数据的时候,由于排序方法会经常用到,所以C语言的库函数里面自带了快速排序的函数qsort(),对大型数据而言,"快速排序"方法是最有效的排序方法之一.它是把数组不断的分成 ...

  3. 菜鸟学习笔记:Java基础篇5(抽象类与接口、回调函数、内部类)

    菜鸟学习笔记:Java面向对象篇下 抽象类 接口 回调函数 内部类 成员内部类 匿名内部类 抽象类 通过前面知识的学习,抽象类这个概念应该不难理解,但比较容易和后面要说的接口混淆,而且在面试中也比较爱 ...

  4. 没有varselect这个函数_JavaScript学习笔记(四)-- 函数基础

    函数基础 我们代码里面所说的函数和我们上学的时候学习的什么三角函数.二次函数之类的不是一个东西 函数的概念 对于 js 来说,函数就是把任意一段代码放在一个 盒子 里面 在我想要让这段代码执行的时候, ...

  5. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

  6. Vue学习笔记进阶篇——Render函数

    本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...

  7. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  8. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  9. 菜鸟学习笔记:Java基础篇6(数组、字符串)

    菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...

最新文章

  1. python爬虫经典教程-python爬虫经典例子有哪些
  2. 031 广播变量与累加器
  3. 6.Verilog的always语句使用
  4. 【转】unity3d优化总结篇
  5. [POJ2420]A Star not a Tree?(模拟退火)
  6. Eclipse Debug maven test
  7. Maven的maven-clean-plugin插件详解
  8. android gradle 1.5.0,Cordova build – 无法解析com.android.tools.build:gradle:1.5.0
  9. Tpos时间定位表达式
  10. 19.高性能MySQL --- 锁的调试
  11. 读取usb接口数据_笔记本接口不够?无须担心!小米分线器开箱初体验
  12. 四、 vSphere 6.7 U1(四):部署VCSA
  13. java整数最大_Java 整数最大值
  14. OCR文字识别算法总结
  15. 优秀IT顾问的七大能力之一--专业技术能力
  16. Travis CI mysql_连续集成 – 使用Travis CI配置Mysql 5.7
  17. “凸现”三围的健身运动法(图)
  18. SuperMap 查询
  19. 洛谷P3373 线段树2(乘法加法lazytag)
  20. html 标签相互转意功能,让表现显示在界面,不被解析成标签

热门文章

  1. 前端面试技巧和注意事项_前端HR的面试套路,你懂几个?
  2. 再说《提督的决断4》
  3. 凭借近2亿的年销量,小米三年超越苹果的可能性有多大?
  4. Github标星超7k!从零开始,最简明扼要的数据科学学习路径
  5. 科目二经验之谈 10小时必过秘笈
  6. Android学习笔记(二)
  7. 计算机杀毒有什么好处,电脑杀毒哪个最好?电脑杀毒的选择和使用
  8. Android wifi 常见断开问题总结
  9. php找爸爸,暖哭!萌娃外滩找爸爸:“他两天没回家”
  10. 逆向webpack打包,还原出原始文件。