一起游 手游攻略 手游评测 CW32L012实现CORDIC模块微秒级快速运算SIN、COS等三角函数

CW32L012实现CORDIC模块微秒级快速运算SIN、COS等三角函数

时间: 来源:互联网 浏览:0

CW32L012具有CORDIC协处理器,可以实现微秒级的三角函数快速计算。

一、CW32L012的CORDIC运算原理CORDIC 是一种坐标旋转数字计算机算法。 CW32L012 的CORDIC 提供某些数学函数的硬件加速,特别是三角函数,常用于电机控制、计量、信号处理和许多其他应用。与软件实现相比,它加快了这些函数的计算速度,从而允许较低的工作频率或释放处理器周期来执行其他任务。

CW32L012的CORDIC支持余弦cos、正弦sin、相位角atan2、模hypot、反正切atan、双曲余弦cosh、双曲正弦sinh、双曲反正切atanh函数运算。迭代次数是可配置的(范围6~66)。

具体操作定义如下:

图片

wKgZO2lU852AIdU6AAA1AKOGvSI167.jpg

关于 q1.15q1.31• 使用sint16/sint32 表示[-1,1) 之间的实数

• sint16 对应于q1.15=sint16/pow(2,15)

• sint32 对应于q1.31=sint32/pow(2,31)

关于迭代次数:• q1.15 建议16-20 次迭代,q1.31 建议24-32 次迭代。

关于启动:• 当只有一个数据输入(x 或y 或z)时,写入该数据开始操作。

• 当需要两个数据输入(x 和y)时,写入y 开始操作。

CORDIC有2个状态标志来指示CORDIC当前的工作状态,包括工作状态标志BUSY和操作完成标志忙标志(CORDIC_CSR.BUSY)

CORDIC_CSR.BUSY标志指示当前CORDIC是处于操作完成状态还是空闲状态。

当CORDIC CSR.BUSY为0时,表示CORDIC处于操作结束或空闲状态,可以读取结果或开始新的操作;当CSR.BUSY为1时,表示CORDIC处于忙碌状态,当前数据操作正在进行中,无法提供操作结果或启动新的操作。

操作完成标志位CORDIC_CSR.EOC 指示CORDIC 操作已完成。设置EOC标志并不影响新一轮操作的继续,无论新一轮操作的类型如何。当新一轮运算开始时,标志位自动清零,并根据新一轮运算的情况重新指令指令。

二、编程实现初始化定义:cordic_init_t init={ .func=CORDIC_FUNC_COS, //选择余弦函数.scale=0, //不使用扩展范围.format=CORDIC_FORMAT_Q1_31, //使用q1.31 格式.iter=CORDIC_ITER_20, //迭代次数.comp=1, //硬件补偿比例因子.ie=0, //禁用中断.dmaeoc=0, //禁用DMA .dmaidle=0 //禁用DMA 空闲}; CORDIC_Init(初始化); //正余弦运算初始化

角度定义int32_t 角度;角度=float_to_q1_31(0.167);

如果计算45度的正弦和余弦,则令angle=0.25(即1/4)。此操作的参数是PI/4(45 度)。在写入角度参数之前,需要将数据转换为Q1.31 格式或Q1.15 格式。

如果计算30度的正弦和余弦,则令angle=0.167(即1/6)。此操作的参数是PI/6(30 度)。在写入角度参数之前,需要将数据转换为Q1.31 格式或Q1.15 格式。

要将浮点数转换为Q1.31 格式,函数定义如下:

int32_t float_to_q1_31(浮点值) { return (int32_t)round(值* 2147483648.0); //2^31}

运算while (CORDIC_GetStatus().busy); //操作前判断BUSY状态CW_CORDIC-Z=angle; //写入Z寄存器开始操作while (!CORDIC_GetStatus().eoc); //等待操作完成。当运算完成时,标志硬件置1,当读取运算结果时,硬件清0

读取结果int32_t y1,y2;浮点y11,y22; y1=CW_CORDIC-Y;//正弦结果在Y寄存器中,Q1.31格式y2=CW_CORDIC-X;//余弦结果在X寄存器中Q1.31格式y11=q1_31_to_float(y1); //将正弦结果转换为浮点数,可以根据需要使用。 y22=q1_31_to_float(y2); //余弦结果转为浮点数,可以根据需要使用。

将Q1.31格式的定点数转换为浮点数的函数定义如下:

float q1_31_to_float(int32_t value) { return (float)value/2147483648.0; //2^31}

将Q1.15格式的定点数转换为浮点数的函数定义如下:

浮点q1_15_to_float(int32_t值){返回(浮点)值/32768.0f;}

参考例程CW32L012的标准库文件夹中有参考例程,可以直接运行。标准库文件可以直接从武汉芯源半导体有限公司官网下载(资料下载固件库)。

例程路径如下:

CW32L012_StandardPeripheralLib_V1.0.3示例CORDICcordic_cosMDK

MDK项目开启图如下:

图片

该例程可以在CW32L012的最小系统架构中运行。

标题:CW32L012实现CORDIC模块微秒级快速运算SIN、COS等三角函数
链接:https://yqqlyw.com/news/sypc/67730.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
绯红之境兑换码最新2021 礼包兑换码大全

绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

2026-01-05
三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

2026-01-05
妄想山海怎么加好友 加好友方法大全

妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

2026-01-05
江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

2026-01-05