IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> [学习笔记]ARM_DSP库——基础函数(绝对值、求和、乘法、点乘) -> 正文阅读

[嵌入式][学习笔记]ARM_DSP库——基础函数(绝对值、求和、乘法、点乘)

ARM_DSP库——基础函数

绝对值、求和、乘法、点乘

一、绝对值(Vector Absolute Value)

这部分函数主要用于求绝对值,公式描述如下:

pDst[n] = abs(pSrc[n]),   0 <= n < blockSize;

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

函数arm_abs_f32

用于求32位浮点数的绝对值。

函数arm_abs_q31

用于求32位定点数的绝对值。

函数arm_abs_q15

用于求16位定点数的绝对值。

函数arm_abs_q7

用于求8位定点数的绝对值。

  • 函数参数:
    • 第 1 个参数是原数据地址。
    • 第 2 个参数是求绝对值后目的数据地址。
    • 第 3 个参数转换的数据个数,这里是指的定点数个数。
    • 函数形参的源地址和目的地址可以使用同一个缓冲。

使用举例

#define log_i printf
void DSP_ABS(void)
{
	float32_t pSrc;
	float32_t pDst;

	q31_t pSrc1;
	q31_t pDst1;

	q15_t pSrc2;
	q15_t pDst2;

	q7_t pSrc3;
	q7_t pDst3;

	/* 求绝对值 */
	pSrc -= 1.23f;
	arm_abs_f32(&pSrc, &pDst, 1);
	log_i("arm_abs_f32 = %f\r\n", pDst);

	pSrc1 -= 1;
	arm_abs_q31(&pSrc1, &pDst1, 1);
	log_i("arm_abs_q31 = %d\r\n", pDst1);

	pSrc2 = -32768;
	arm_abs_q15(&pSrc2, &pDst2, 1);
	log_i("arm_abs_q15 = %d\r\n", pDst2);

	pSrc3 = 127;
	arm_abs_q7(&pSrc3, &pDst3, 1);
	log_i("arm_abs_q7 = %d\r\n", pDst3);
	log_i("**********************\r\n");
}

二、求和(Vector Addition)

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

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

函数arm_add_f32

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

函数 arm_add_q31

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

函数 arm_add_q15

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

函数 arm_add_q7

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

  • 函数参数:
    • 第 1 个参数是加数地址。
    • 第 2 个参数是被加数地址。
    • 第 3 个参数是和地址。
    • 第 4 个参数是定点数个数,其实就是执行加法的次数。

使用举例

#define log_i printf
void DSP_Add(void)
{
	float32_t pSrcA;
	float32_t pSrcB;
	float32_t pDst;

	q31_t pSrcA1;
	q31_t pSrcB1;
	q31_t pDst1;

	q15_t pSrcA2;
	q15_t pSrcB2;
	q15_t pDst2;

	q7_t pSrcA3;
	q7_t pSrcB3;
	q7_t pDst3;

	/* 求和 */
	pSrcA = 0.1f;
	pSrcB = 0.2f;
	arm_add_f32(&pSrcA, &pSrcB, &pDst, 1);
	log_i("arm_add_f32 = %f\r\n", pDst);

	pSrcA1 = 1;
	pSrcB1 = 1;
	arm_add_q31(&pSrcA1, &pSrcB1, &pDst1, 1);
	log_i("arm_add_q31 = %d\r\n", pDst1);

	pSrcA2 = 2;
	pSrcB2 = 2;
	arm_add_q15(&pSrcA2, &pSrcB2, &pDst2, 1);
	log_i("arm_add_q15 = %d\r\n", pDst2);

	pSrcA3 = 30;
	pSrcB3 = 120;
	arm_add_q7(&pSrcA3, &pSrcB3, &pDst3, 1);
	log_i("arm_add_q7 = %d\r\n", pDst3);
	log_i("**********************\r\n");
}

三、乘法(Vector Multiplication)

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

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

函数 arm_mult_f32

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

函数 arm_mult_q31

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

函数 arm_mult_q15

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

函数 arm_mult_q7

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

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

使用举例

 void DSP_Multiplication(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_mult_f32(pSrcA, pSrcB, pDst, 5);
 printf("arm_mult_f32 = %f\r\n", pDst[0]);

 pSrcA1[0] += 1;
 arm_mult_q31(pSrcA1, pSrcB1, pDst1, 5);
 printf("arm_mult_q31 = %d\r\n", pDst1[0]);

 pSrcA2[0] += 1;
 arm_mult_q15(pSrcA2, pSrcB2, pDst2, 5);
 printf("arm_mult_q15 = %d\r\n", pDst2[0]);

 pSrcA3[0] += 1;
 arm_mult_q7(pSrcA3, pSrcB3, pDst3, 5);
 printf("arm_mult_q7 = %d\r\n", pDst3[0]);
 printf("*********************\r\n");
}

四、点乘(Vector Dot Product)

这部分函数主要用于点乘,公式描述如下:

sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1];

函数 arm_dot_prod_f32

用于求32位浮点数的点乘。

函数 arm_dot_prod_q31

用于求32位定点数的点乘。

函数 arm_dot_prod_q15

用于求32位定点数的点乘。

函数 arm_dot_prod_q7

用于求8位定点数的点乘。

  • 函数参数:
    • 第 1 个参数是乘数地址。
    • 第 2 个参数是被乘数地址。
    • 第 3 个参数是定点数个数,其实就是执行点乘的次数。
    • 第 4 个参数是结果地址。

使用举例

void DSP_DotProduct(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 result;

	q31_t pSrcA1[5] = {0x7ffffff0,1,1,1,1};
	q31_t pSrcB1[5] = {1,1,1,1,1};
	q63_t result1;

	q15_t pSrcA2[5] = {1,1,1,1,1};
	q15_t pSrcB2[5] = {1,1,1,1,1};
	q63_t result2;

	q7_t  pSrcA3[5] = {1,1,1,1,1};
	q7_t  pSrcB3[5] = {1,1,1,1,1};
	q31_t result3;


	/* 求点乘 */
	arm_dot_prod_f32(pSrcA, pSrcB, 5, &result);
	log_i("arm_dot_prod_f32 = %f\r\n", result);

	arm_dot_prod_q31(pSrcA1, pSrcB1, 5, &result1);
	log_i("arm_dot_prod_q31 = %lld\r\n", result1);

	arm_dot_prod_q15(pSrcA2, pSrcB2, 5, &result2);
	log_i("arm_dot_prod_q15 = %lld\r\n", result2);

	arm_dot_prod_q7(pSrcA3, pSrcB3, 5, &result3);
	log_i("arm_dot_prod_q7 = %d\r\n", result3);
	log_i("*************************\r\n");
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:12:44  更:2021-08-19 12:12:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 5:44:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码