如何摆脱CORDIC

时间:2015-06-18 09:59:41

标签: math vhdl fpga register-transfer-level 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以及如何使用它?

更新:

我想知道总缩放概念在哪里适用于获得正弦,cos角度。 这里有一些例子,我设定指定的角度是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角度?

2 个答案:

答案 0 :(得分:2)

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。在您的示例中,您合并了比例因子,它给出了正确的答案,但不是必需的,并且不允许简单的shift + add操作。因此,如果后续模块可以处理缩放的答案,我们将缩放作为后操作(或初始化),或完全取出。

获得20的罪/ cos的方法是,从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,这是一个移位和添加。您也不需要将缩放因子存储在ROM或其他地方;你需要的唯一记忆是arctan(2 ^ -i)。

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

答案 1 :(得分:1)

当使用CORDIC时,你可以通过将sin与cos或sinh的比率与cosh进行比较来计算tan和tanh。由于两个术语都有适用于它们的比例因子,因此K可以取消,并且您不必进行任何更正。您需要了解溢出的潜在问题,并确保X和Y寄存器中存在足够的位以保存缩放值。另一种选择是对X和Y输入值进行预分频(乘以0.607),以便在运行算法后增益为1。