如何从 CORDIC 中去除比例因子

How to get rid of scale factor from CORDIC

来自 CORDIC,K_i = cos(tan^-1(2^i))。据我所知,接近 K 0.607xxx。我如何接近 0.607xxx

这是否意味着我可以使用 0.607xxx 而不是 cos(tan^-1(2^I))?我引用的是 this article.

我正在尝试实现双曲 tanh 函数。到目前为止,我理解(6)等式。我不确定如何制作 K 以及如何使用它?

更新:

我想知道总缩放概念在何处应用以获得正弦、余弦角。 这里有一些例子,我将指定的角度设置为 20。 我想知道正弦、余弦角。过程如下。

n d x y angle K arctan value

0 1 0.7071 0.7071 0.7854 0.7071 0.785398

....

10 -1 0.9395 0.3426 0.3497 1 0.000976

指定角度为20 degree(0.3491)即可得到 然后我们得到 sine (20) = 0.9395 Cos(20) = 0.3497

完成。

但我仍然很好奇总缩放 concept(0.607) 应用在哪里?其中总缩放比例 concept(0.607 ) 用于计算 sin、cos 角 ?

CORDIC 算法中的每一步都添加了 cos(arctan(2^-i))(或 1/sqrt(1+2^-2i))的缩放比例,因此对于 4 步 CORDIC,总缩放比例为:

cos(arctan(2^-0))*cos(arctan(2^-1))*cos(arctan(2^-2))*cos(arctan(2^-3)) = 0.60883

如果您添加更多迭代,它会达到 0.607252935 和一些。至于如何处理该因素,取决于您和您实现的功能。您可能想要删除它并给出未缩放的结果,或者您的消费者可能能够更轻松地处理它。

tanh 的情况下,我认为两个值的除法具有相同的缩放比例,因此在这种情况下会抵消。我真的不太确定那个,因为我没有在这种模式下使用 CORDIC,所以你必须自己弄清楚。

更新

CORDIC 的优点是每次迭代都是 XY 上的移位+加法。在您的示例中,您合并了比例因子,它给出了正确的答案,但不是必需的,并且不允许简单的 shift + add 操作。因此,我们将缩放保留为 post 操作(或初始化),或者如果后续模块可以处理缩放的答案,则完全不存在。

获得 sin/cos of 20 的方法是,从 X = 1; Y = 0; Z = 20:

开始
Z0 = 20 - 45.00 = -25.00; X0 = 1 - 0 = 1; Y0 = 0 + 2^-0 = 1
Z1 = Z0 + 26.57 =   1.57; X1 = X0 + Y0*2^-1 = 1.5000; Y1 = Y0 - X0*2^-1 = 0.5000
Z2 = Z1 - 14.04 = -12.47; X2 = X1 - Y1*2^-2 = 1.3750; Y2 = Y1 + X1*2^-2 = 0.8750
Z3 = Z2 +  7.13 = - 5.35; X3 = X2 + Y2*2^-3 = 1.4844; Y3 = Y2 - X2*2^-3 = 0.7031
Z4 = Z3 +  3.58 = - 1.77; X4 = X3 + Y3*2^-4 = 1.5283; Y4 = Y3 - X3*2^-4 = 0.6104
Z5 = Z4 +  1.79 =   0.02; X5 = X4 + Y4*2^-5 = 1.5474; Y5 = Y4 - X4*2^-5 = 0.5626
Z6 = Z5 -  0.90 = - 0.88; X6 = X5 - Y5*2^-6 = 1.5386; Y6 = Y5 + X5*2^-6 = 0.5868

最终答案按比例缩放:cos(20) = X6*0.607 = 0.9339sin(20) = Y6*0.607 = 0.3562。忽略缩放因子的好处应该很明显,每次迭代都是Xi = Xi-1 +- Yi-1 * 2^-i,也就是shift和add。您也不需要将比例因子存储在 ROM 或其他地方;您唯一需要的内存是 arctan(2^-i).

请注意,您可以通过从 X = 0.607 而不是 X = 1 开始获得未缩放的结果。

使用 CORDIC 时,您可以通过 sin 与 cos 或 sinh 与 cosh 的比值来计算 tan 和 tanh。由于这两项都应用了比例因子,因此 K 抵消了,您无需进行任何校正。您确实需要注意潜在的溢出问题,并确保 X 和 Y 寄存器中有足够的位来保存缩放后的值。另一种选择是预缩放 X 和 Y 输入值(乘以 0.607),以便在 运行 算法之后增益为 1。