完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转dsp系列教程
本期教程开始,我们将不再专门的分析DSP函数的源码,主要是有些DSP函数的公式分析较麻烦,有兴趣的同学可以自行研究,本期教程开始主要讲解函数如何使用。 10.1 三角函数Cosine 10.2 三角函数Sine 10.3 平方根Sqrt 10.4 实例讲解(matlab验证) 10.5 总结 10.1 三角函数Cosine 三角函数cosine的计算是通过查表并配合三次插补实现的。具体的实现方法大家可以查阅相关资料进行了解。 10.1.1 ARM_cos_f32 此函数的使用比较简单,函数定义如下: float32_t arm_cos_f32(float32_t x) 注意输入参数x是弧度制即可,也就是说cos函数的一个周期对应于弧度[ 0 2*PI)。下面我们先通过Matlab绘制一个周期的cos曲线。新建一个.m格式的脚本文件,并写入如下函数: x = 0:0.01:2*pi; plot(x, cos(x)) 运行后显示效果如下: 点击上面截图中的Tools->Data statistics,获取数据的分析结果,我们主要看Y轴。 最大值和最小值分别对应1和-1,这个与我们所学的理论知识是相符的。 |
|
相关推荐
|
|
10.1.2 arm_cos_q31
函数定义如下: q31_t arm_cos_q31(q31_t x) 使用中只需注意参数x的数值范围[0 2^31)相当于弧度[0 2*PI)即可。 10.1.3 arm_cos_q15 函数定义如下: q31_t arm_cos_q15(q15_t x) 使用中只需注意参数x的数值范围[0 2^15)相当于弧度[0 2*PI)即可。 10.2 三角函数Sine 三角函数sine的计算是通过查表并配合三次插补实现的。具体的实现方法大家可以查阅相关资料进行了解。 10.2.1 arm_sine_f32 此函数的使用比较简单,函数定义如下: float32_t arm_sin_f32(float32_t x) 注意输入参数x是弧度制即可,也就是说sine函数的一个周期对应于弧度[ 0 2*PI)。下面我们先通过Matlab绘制一个周期的sine曲线。新建一个.m格式的脚本文件,并写入如下函数: x = 0:0.01:2*pi; plot(x, sine(x)) 运行后显示效果如下: 点击上面截图中的Tools->Data statistics,获取数据的分析结果,我们主要看Y轴。 最大值和最小值分别对应1和-1,这个与我们所学的理论知识是相符的。 |
|
|
|
|
|
10.2.2 arm_sin_q31
函数定义如下: q31_t arm_sin_q31(q31_t x) 使用中只需注意参数x的数值范围[0 2^31)相当于弧度[0 2*PI)即可。 10.2.3 arm_sin_q15 函数定义如下: q31_t arm_sin_q15(q15_t x) 使用中只需注意参数x的数值范围[0 2^15)相当于弧度[0 2*PI)即可。 |
|
|
|
|
|
10.3 平方根sqrt
浮点数的平方根计算只需调用一条浮点指令即可,而定点数的计算要稍显麻烦。 10.3.1 arm_sqrt_f32 对于CM4带FPU的处理器来说,浮点数的平方根求解很简单,只需调用指令__sqrtf,仅需要14个时钟周期就可以完成。函数定义如下(在arm_math.h里面): static __INLINE arm_status arm_sqrt_f32(float32_t in, float32_t * pOut) 10.3.2 arm_sqrt_q31 函数的定义如下: arm_status arm_sqrt_q31(q31_t in, q31_t * pOut) 这里in的输入范围是0x00000000 到 0x7FFFFFFF,转化成浮点数范围就是[0 +1)。在使用这个函数的时候有一点要特别的注意,比如我们要求1000的平方根,而获得结果是1465429,这是为什么呢,分析如下: 定点数1000 = 浮点数 1000 /(2^31) = 4.6566e-07 (用Q31表示)。 对4.6566e-07求平方根可得 6.8239e-04。 定点数1465429 = 浮点数 1465429/(2^31) = 6.8239e-04。 简单的总结下上面的意思就是说,求定点数1000的平方根,实际是求浮点数4.6566e-07 (用Q31表示)的平方根。 10.3.3 arm_sqrt_q15 函数的定义如下: arm_status arm_sqrt_q15(q15_t in, q15_t * pOut) 这里in的输入范围是0x0000 到 0x7FFF,转化成浮点数范围就是[0 +1) |
|
|
|
|
|
10.4 实例讲解(Matlab验证)
实验目的: 1. 学习FastMathFunctions中的Sine,Cosine和Sqrt,并配合Matlab进行验证结果 实验内容: 1. 按下按键K1, 串口打印函数DSP_Cosine的输出结果 2. 按下按键K2, 串口打印函数DSP_Sine的输出结果 3. 按下按键K3, 串口打印函数DSP_Sqrt的输出结果 实验现象: 通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下(以按下K1为例): |
|
|
|
|
|
程序设计:
复制代码 /* ********************************************************************************************************* * 函 数 名: DSP_Cosine * 功能说明: 求cos函数 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void DSP_Cosine(void) { q31_t pOut; float32_t pOut1; uint16_t i; /***************************cos函数*****************************************/ for(i = 0; i < 256; i++) (1) { /* 参数的输入范围是[0 2*pi) */ printf("%frn", arm_cos_f32(i * PI / 128)); } printf("***************************************************************rn"); for(i = 0; i < 256; i++) { /* 这里是0 到 32767 对于[0 2*pi) */ printf("%drn", arm_cos_q15(i*128)); } printf("***************************************************************rn"); for(i = 0; i < 256; i++) { /* 这里是0 到 2^31 - 1对应于[0 2*pi) */ printf("%drn", arm_cos_q31(i*8388608)); } printf("***************************************************************rn"); } /* ********************************************************************************************************* * 函 数 名: DSP_Sine * 功能说明: 求sine函数 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void DSP_Sine(void) { q31_t pOut; float32_t pOut1; uint16_t i; /***************************sin函数*****************************************/ for(i = 0; i < 256; i++) (2) { /* 参数的输入范围是[0 2*pi) */ printf("%frn", arm_sin_f32(i * PI / 128)); } printf("***************************************************************rn"); for(i = 0; i < 256; i++) { /* 这里是0 - 32767 对于[0 2*pi) */ printf("%drn", arm_sin_q15(i*128)); } printf("***************************************************************rn"); for(i = 0; i < 256; i++) { /* 这里是0 - (pow(2, 31) - 1)对应于[0 2*pi) */ printf("%drn", arm_sin_q31(i*8388608)); } printf("***************************************************************rn"); } /* ********************************************************************************************************* * 函 数 名: DSP_Sqrt * 功能说明: 求平方根 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void DSP_Sqrt(void) { q31_t pOut; float32_t pOut1; /* 求平方根 */ arm_sqrt_q31(1000, &pOut); (3) printf("Value = %drn", pOut); arm_sqrt_f32(1000, &pOut1); printf("Value = %frn", pOut1); } |
|
|
|
|
|
1. 这里我们采样了cos曲线一个周期中的256个点。为了验证结果是否正确,我们可以将这些数据保存到txt文档中,复制这256个数据即可,然后保存并关闭文档。通过matlab加载这个txt文档,加载方法如下:
|
|
|
|
|
|
从波形上看基本是一个周期的cos函数曲线。下面我们在把cos_q31和cos_q15函数分别绘制一下。
(这里要特别的注意Y轴,这个数值要除以2^31才是实际的cos数值) (这里要特别的注意Y轴,这个数值要除以2^15才是实际的cos数值) 2. sin和cos基本是一样的,这里就不再赘述了。 3. 平方根的含义在10.3.1已经详细讲解了。 |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2099 浏览 1 评论
3665 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2353 浏览 2 评论
2779 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4065 浏览 5 评论
1010浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6395浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 11:03 , Processed in 0.956618 second(s), Total 99, Slave 82 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号