在 FPGA 上计算 Arctan2 的最快方法

信息处理 阶段
2021-12-23 09:03:53

Rip Van Winkle 在这里——在仍然使用 CORDIC 的 FPGA 上计算 arctan 的最快且占用空间最小的方法是什么?

或者有没有办法利用块 RAM 和 DSP 块来加速和/或减小进程的大小?

3个回答

如果您愿意容忍 0.26 度的可能绝对误差,您可以使用以下方法(来自我的“理解数字信号处理”一书的第 13 章):

在此处输入图像描述

乘积 0.28125等于 (1/4+1/32),因此您可以通过将右移两位的与右移五位Q2Q2Q2Q2

这是误差曲线,在 -45 度到 +45 度的范围内

在此处输入图像描述

对于最近的一些工作,我需要快速和准确的三角近似,至少 C1 和理想的 C2 连续,因为一阶和二阶微分中的不连续性对于我们的应用来说是不可取的。我拟合了多项式来实现这一点,根据OlliW的一个基本想法。

对于 arctan,与@RichardLyons 的回答一样,我计算了八分圆 1 和 8(以避免必须拟合趋于无穷大的曲线)。然后,标准三角定理适用于在其他八分圆中使用它。我将计算的输出标准化为 +/-1 = +/-45deg,因此度数或弧度的缩放只需要额外的缩放。然后可用的配合是

  • y=0.157153894x0.041596524x3+0.00944263x5
  • y=0.159154943x0.051601768x3+0.023449972x50.006003146x7
  • y=0.159154943x0.052424634x3+0.027564301x50.011763207x7+0.002468598x9

对于,最坏情况误差(分别)为 3.45e-4、5.96e-5 或 1.10e-6。以度为单位(将乘以45 表示角度误差,或乘以表示弧度误差),对于 5 阶拟合,这是 0.016 度的最坏情况误差。yyπ/4

” DSP 片的 4、5 或 6 个周期,或使用 DSP。(AB)+C

请注意,方程作为奇函数的性质为我们免费提供了以下内容:-

  • atan(x)=atan(x)
  • atan(0)=0
  • d2ydx2(atan(0))=0

对于任何想要自己推导的人来说,这来自解决联立方程,其中:-

  • 对于 5 阶,值在 30 度和 45 度处是正确的,而一阶微分在 45 度处是正确的。这使得拟合 C1 在映射到其他八分圆时是连续的。atan

  • 七阶补充说,一阶微分在零处是正确的。

  • 9 阶增加了 2 阶微分在 45 度处是正确的。这使得拟合 C2 在映射到其他八分圆时是连续的。

要添加到理查德的好答案,请参阅其他帖子以获取其他估算器。

FPGA 中的 CORDIC 确实不需要太多资源:只需一个 I、Q 和相位累加器和一个非常小的查找表,尤其是没有乘法器。它是一种迭代算法,其近似精度为2N3弧度为N迭代,查找表大小需要只是ATAN2结果N对应于每次迭代的角度(π/4n,n=1N)。如果有额外的迭代时间可用,那么如果资源和/或功率在专用硬件解决方案中非常重要(因此它在蓝牙接收器的当前使用中很普遍),特别是在没有可用的专用乘法器的情况下,这将是一个可行的实施候选者.

下面显示了该算法的高级摘要,对于 ATAN2 结果,我们将在“矢量模式”下操作 CORDIC,其中我们将使用 CORDIC 旋转未知矢量,直到旋转矢量的结果角度为 0 度,如下所示Q=0,这样既可以从相位累加器中获得角度,也可以从 I 中获得幅度。如下图所示的 CORDIC 的范围为 +/-90°。通过 +/-j 旋转将其扩展到 +/-180°(这意味着只需交换 I 和 Q 并更改符号)。

当连续迭代时间可用且没有乘数时,CORDIC 是首选算法。如果复数乘法器可用,则考虑简单地使用小型查找表来查找N二进制加权迭代下降到任何所需的相位精度±π作为π/2N, 并在 CORDIC 迭代中使用“矢量模式”完成N根据标志的方向前进的步骤Q在累积相位的同时将其驱动为零。由于真正的二进制加权旋转(与 CORDIC 不同),这将在更少的步骤中具有更高的精度,并且没有 1.647 CORDIC 增益(如果这甚至是一个问题)。

科尔迪克

BKM 算法也可以作为 CORDIC 硬件实现的替代方案