Rip Van Winkle 在这里——在仍然使用 CORDIC 的 FPGA 上计算 arctan 的最快且占用空间最小的方法是什么?
或者有没有办法利用块 RAM 和 DSP 块来加速和/或减小进程的大小?
Rip Van Winkle 在这里——在仍然使用 CORDIC 的 FPGA 上计算 arctan 的最快且占用空间最小的方法是什么?
或者有没有办法利用块 RAM 和 DSP 块来加速和/或减小进程的大小?
对于最近的一些工作,我需要快速和准确的三角近似,至少 C1 和理想的 C2 连续,因为一阶和二阶微分中的不连续性对于我们的应用来说是不可取的。我拟合了多项式来实现这一点,根据OlliW的一个基本想法。
对于 arctan,与@RichardLyons 的回答一样,我计算了八分圆 1 和 8(以避免必须拟合趋于无穷大的曲线)。然后,标准三角定理适用于在其他八分圆中使用它。我将计算的输出标准化为 +/-1 = +/-45deg,因此度数或弧度的缩放只需要额外的缩放。然后可用的配合是
对于,最坏情况误差(分别)为 3.45e-4、5.96e-5 或 1.10e-6。以度为单位(将乘以45 表示角度误差,或乘以表示弧度误差),对于 5 阶拟合,这是 0.016 度的最坏情况误差。
” DSP 片的 4、5 或 6 个周期,或使用 DSP。
请注意,方程作为奇函数的性质为我们免费提供了以下内容:-
对于任何想要自己推导的人来说,这来自解决联立方程,其中:-
对于 5 阶,值在 30 度和 45 度处是正确的,而一阶微分在 45 度处是正确的。这使得拟合 C1 在映射到其他八分圆时是连续的。
七阶补充说,一阶微分在零处是正确的。
9 阶增加了 2 阶微分在 45 度处是正确的。这使得拟合 C2 在映射到其他八分圆时是连续的。
要添加到理查德的好答案,请参阅其他帖子以获取其他估算器。
FPGA 中的 CORDIC 确实不需要太多资源:只需一个 I、Q 和相位累加器和一个非常小的查找表,尤其是没有乘法器。它是一种迭代算法,其近似精度为弧度为迭代,查找表大小需要只是ATAN2结果对应于每次迭代的角度()。如果有额外的迭代时间可用,那么如果资源和/或功率在专用硬件解决方案中非常重要(因此它在蓝牙接收器的当前使用中很普遍),特别是在没有可用的专用乘法器的情况下,这将是一个可行的实施候选者.
下面显示了该算法的高级摘要,对于 ATAN2 结果,我们将在“矢量模式”下操作 CORDIC,其中我们将使用 CORDIC 旋转未知矢量,直到旋转矢量的结果角度为 0 度,如下所示Q=0,这样既可以从相位累加器中获得角度,也可以从 I 中获得幅度。如下图所示的 CORDIC 的范围为 +/-90°。通过 +/-j 旋转将其扩展到 +/-180°(这意味着只需交换 I 和 Q 并更改符号)。
当连续迭代时间可用且没有乘数时,CORDIC 是首选算法。如果复数乘法器可用,则考虑简单地使用小型查找表来查找二进制加权迭代下降到任何所需的相位精度作为, 并在 CORDIC 迭代中使用“矢量模式”完成根据标志的方向前进的步骤在累积相位的同时将其驱动为零。由于真正的二进制加权旋转(与 CORDIC 不同),这将在更少的步骤中具有更高的精度,并且没有 1.647 CORDIC 增益(如果这甚至是一个问题)。
BKM 算法也可以作为 CORDIC 硬件实现的替代方案。