反函数atan2的速度优化 您所在的位置:网站首页 asinacosb 反函数atan2的速度优化

反函数atan2的速度优化

2024-07-05 22:41| 来源: 网络整理| 查看: 265

前言

在计算雷达方位角和俯仰角时有时候需要使用atan(),asin(),acos()这些反三角函数,但是使用这些反三角函数,C语言的math.h和arm_math.h的头文件中都有对应的库函数可以提供用户使用。尽管使用系统自带的库函数简单并且误差很小,但是自带的三角函数的计算时间在某些重视速度并不需要特别高精确性的系统中是不能接受的,甚至可能导致算法的时间超过约束的时间,所以在这个情况下必须使用一些方法来提高计算的速度,但是这种提高往往是以牺牲计算的精度或者空间来换取运行的时间。

atan和atan2之间的关系

在实际中计算雷达的角度时,我使用了一个atan2()函数,来计算FFT结果的相位角度。有些同学可能没有用过atan2()这个函数,其实这个函数和atan()是差不多,只不过atan2()函数可以根据输入参数来确定角度的象限。两者具体的关系如下:

\[atan2(y,x) = \left\{ \begin{aligned} actan(\frac{y}{x}) \quad\quad\quad\quad\quad &x>0 \\ actan(\frac{y}{x})+\pi\quad\quad\quad &y\geq0,x ax) { result = (PI / 2) - result; } if (dx < 0.0f) { result = PI - result; } if (dy < 0.0f) { result = (-result); } return result; } int main(void) { /* 测试代码,测试代码和原本的库函数进行对比 */ float angle = -PI; /* 单位圆的角度 */ float x_value = 0.0f; float y_value = 0.0f; bool is_success = true; float max_esp = 0.0f; float esp = 0.0f; for (angle; angle < PI- STEP; angle+=STEP) { y_value = sin(angle); x_value = cos(angle); esp = fabs(atan2(y_value, x_value) - easy_actan2(y_value, x_value)); if ((esp - max_esp) > 1e-8) { max_esp = esp; } if(esp > ESP) { is_success = false; } } if (is_success == false) { printf("超过误差范围\n"); } else { printf("测试没有超过范围"); } printf("最大误差%f", esp); return 0; }

对比误差还是比较小的,具体的误差大约在0.000191869665左右,这个精度还是可以的

参考: Streamlining Digital Signal Processing: A Tricks of the Trade Guidebook- FAST APPROXIMATE ARCTAN/ATAN FUNCTION https://www.cnblogs.com/shine-lee/p/13330676.html https://math.stackexchange.com/questions/1098487/atan2-faster-approximation


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有