Math 如何从CORDIC中去除比例因子

Math 如何从CORDIC中去除比例因子,math,vhdl,fpga,register-transfer-level,cordic,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))?我引用的是我的 我正在尝试实现双曲tanh函数。到目前为止,我理解了(6)式。我不知道如何制作K和如何使用它 更新: 我想知道总缩放概念在哪里应用,以获得正弦、余弦角。 这里有一个例子,我设置指定的角度为20。 我想知道正弦角,cos角。程序如下所示 n d x y角K弧tan值 01 0.7071 0

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

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

我正在尝试实现双曲tanh函数。到目前为止,我理解了(6)式。我不知道如何制作K和如何使用它

更新: 我想知道总缩放概念在哪里应用,以获得正弦、余弦角。 这里有一个例子,我设置指定的角度为20。 我想知道正弦角,cos角。程序如下所示

n d x y角K弧tan值

01 0.7071 0.7071 0.7854 0.7071 0.785398

10-10.9395 0.3426 0.3497 1 0.000976

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

完成了


但我仍然很好奇,总缩放
概念(0.607)
在哪里适用?其中,总标度
概念(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的优点是每次迭代都是一个shift+附加的
X
Y
。在您的示例中,合并了比例因子,它给出了正确的答案,但不是必需的,并且不允许简单的shift+add操作。因此,我们将缩放保留为后期操作(或初始化),或者如果后续模块可以处理缩放后的答案,则完全不进行缩放

得到20的sin/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.9339
sin(20)=Y6*0.607=0.3562
。忽略比例因子的优势应该是显而易见的,每个迭代都是
Xi=Xi-1+-Yi-1*2^-i
,这是一个移位和加法。您也不需要将比例因子存储在ROM或其他地方;您需要的唯一内存是arctan(2^-i)


请注意,使用CORDIC时,可以从
X=0.607
开始,而不是从
X=1
开始,获得无标度结果。使用CORDIC计算tan和tanh时,可以采用sin与cos或sinh与cosh的比率。因为这两个术语都应用了比例因子,所以K的值可以抵消,你不需要做任何修正。您确实需要注意溢出的潜在问题,并确保X和Y寄存器中存在足够的位来保存缩放值。另一个选项是预先设定X和Y输入值(乘以0.607),以便在运行算法后增益为1。

谢谢,请告诉我这是什么意思?“因为这两个术语都应用了比例因子,所以K的值被抵消了,你不必做任何修正。”我不明白it@user5014962. 双曲CORDIC(a)产生Kcosh(a)和Ksinh(a)作为X和Y寄存器中的结果<代码>(K*sinh(a))/(K*cosh(a))=tanh(a)
。K在除法中取消,无需修正增益。注意,双曲CORDIC的比例因子是:
K[i]=sqrt(1-2^(-2i))
,它在大约10次迭代后收敛到1,而不是循环实现.Oops的1.647。双曲线比例因子在没有任何重复迭代的情况下收敛到0.82978,在添加重复迭代(4,13,40,…)以强制算法收敛的情况下收敛到0.82816。如果我有10次迭代,那么比例可以从0.607252935变为1吗?根据Kevin Thibedeau,总比例因子是所有迭代的比例因子的乘积。第十次迭代的缩放比例大约为1,这很好,因为这意味着所有缩放比例的乘法将收敛。它收敛到0.607252935这是一个有点离题的话题。为什么我们需要总规模?我完全理解如果我有迭代,那么我可以得到0.607。。但是为什么我们会得到一个总的缩放值呢?为什么?我可能弄错了你的问题,我以为你想知道0.607因子的来源。这是来自CORDIC算法的累积缩放。您需要它来“纠正”CORDIC的结果。例如,如果使用CORDIC执行极坐标到直角坐标,则得到的向量长度比预期值大1.65倍。1.65等于1/0.607。当结果的解释需要“真实”结果时,您必须对此缩放进行补偿。正如我所知,在旋转模式中,K是从(1/sqrt(1+2^(-2*n))获得的.所以当n趋于无穷大时,K是这样的0.7071 0.8944 0.9701 0.9923 0.9981 0.995 0.9999 1.0000 1.0000…但我不理解总缩放的概念。在CORDIC极坐标模式下需要总缩放概念吗?如果可以,请告诉我示例?使用总缩放时