Math 我们为什么使用CORDIC增益?

Math 我们为什么使用CORDIC增益?,math,fpga,cordic,Math,Fpga,Cordic,我在研究cordic。而且我发现了可心的收获。K=0.607XXX 从CORDIC,K_i=cos(tan^-1(2^i)) 正如我所知,当我要无穷大时,K接近0.607xxx 这个值是由K乘以得到的 我理解每个k存在的原因。但我很好奇它用在哪里?为什么我们使用该值K=0.607xx?可以根据第一原理轻松确定CORDIC圆形变量旋转模式的比例因子。CORDIC背后的思想是在单位圆上取一个点,通过我们想要确定的正弦和余弦的角度u逐步旋转它 为此,我们定义了一组增量角a0,…,an-1,使得ak=a

我在研究cordic。而且我发现了可心的收获。K=0.607XXX

从CORDIC,K_i=cos(tan^-1(2^i))

正如我所知,当我要无穷大时,K接近0.607xxx

这个值是由K乘以得到的


我理解每个k存在的原因。但我很好奇它用在哪里?为什么我们使用该值K=0.607xx?

可以根据第一原理轻松确定CORDIC圆形变量旋转模式的比例因子。CORDIC背后的思想是在单位圆上取一个点,通过我们想要确定的正弦和余弦的角度u逐步旋转它

为此,我们定义了一组增量角a0,…,an-1,使得ak=atan(0.5k)。我们将这些增量角适当地相加为角sk的部分和,而不是sn~=u。设yk=cos(sk)和xk=sin(sk)。如果在给定的步骤k中,我们通过ak旋转,我们有

yk+1=cos(sk+1)=cos(sk+ak)
xk+1=sin(sk+1)=sin(sk+ak)

我们可以根据xk和yk计算xk+1和yk+1,如下所示:

yk+1=yk*cos(ak)-xk*sin(ak)
xk+1=xk*cos(ak)+yk*sin(ak)

考虑到我们可以加和减ak,并且tan(ak)=sin(ak)/cos(ak),我们得到:

yk+1=cos(ak)*(yk∓ xk*tan(ak))=cos(sk+1)
xk+1=cos(ak)*(xk±yk*tan(ak))=sin(sk+1)

为了简化此计算,我们可以在每一步中省去与cos(ak)的乘法,这为我们提供了CORDIC迭代方案:

yk+1=y∓ xk*tan(ak)
xk+1=x±yk*tan(ak)

由于我们选择了ak,如果我们使用定点算法计算,则与tan(ak)的乘法将变成简单的右移。因为我们省略了cos(ak)因子,我们最终得到

yn~=cos(u)*(1/(cos(a0)*cos(a1)*…*cos(an))
xn~=sin(u)*(1/(cos(a0)*cos(a1)*…*cos(an))

如前所述,系数f=cos(a0)*cos(a1)*…*cos(an)为0.607…。我们通过设置起始值将其纳入计算

y0=f*cos(0)=f
x0=f*sin(0)=0

这是一个C代码,它使用16位定点算法显示了整个计算过程。输入角度被缩放为360度对应216度,而正弦和余弦输出被缩放为1对应215度

#包括
#包括
#包括
/*圆形(0.5*i)*65536/360*/
静态常数短a[15]=
{
0x2000、0x12e4、0x09fb、0x0511、,
0x028b、0x0146、0x00a3、0x0051、,
0x0029、0x0014、0x000a、0x0005、,
0x0003、0x0001、0x0001
};
#定义交换(a,b){a=a^b;b=b^a;a=a^b;}
void cordic(无符号短u、短s、短c)
{
短x,y,oldx,oldy,q;
int i;
x=0;
y=0x4dba;/*0.60725*/
oldx=x;
oldy=y;
q=u>>14;/*象限*/
u=u&0x3fff;/*缩小角度*/
u=-(短)u;
i=0;
做{
如果((短)u<0){
x=x+oldy;
y=y-oldx;
u=u+a[i];
}否则{
x=x-古老;
y=y+oldx;
u=u-a[i];
}
oldx=x;
oldy=y;
i++;
/*C中定义的有符号负数实现的右移*/
oldx=(oldx<0)?((-oldx>>i)):(oldx>>i);
oldy=(oldy<0)?((-oldy>>i)):(oldy>>i);
}而(i<15);
对于(i=0;i
从第一原理可以很容易地确定CORDIC圆形变体旋转模式的比例因子。CORDIC背后的思想是在单位圆上取一点,并通过我们想要确定的正弦和余弦的角度u逐步旋转它

为此,我们定义了一组增量角a0,…,an-1,使得ak=atan(0.5k)。我们将这些增量角适当地相加成角sk的部分和,而不是sn~=u。让yk=cos(sk)和xk=sin(sk)。如果在给定的步骤k中,我们通过ak旋转,我们得到

yk+1=cos(sk+1)=cos(sk+ak)
xk+1=sin(sk+1)=sin(sk+ak)

我们可以根据xk和yk计算xk+1和yk+1,如下所示:

yk+1=yk*cos(ak)-xk*sin(ak)
xk+1=xk*cos(ak)+yk*sin(ak)

考虑到我们可以加和减ak,并且tan(ak)=sin(ak)/cos(ak),我们得到:

yk+1=cos(ak)*(yk∓ xk*tan(ak))=cos(sk+1)
xk+1=cos(ak)*(xk±yk*tan(ak))=sin(sk+1)

为了简化此计算,我们可以在每一步中省去与cos(ak)的乘法,这为我们提供了CORDIC迭代方案:

yk+1=y∓ xk*tan(ak)
xk+1=x±yk*tan(ak)

由于我们选择了ak,如果我们用定点算法计算,与tan(ak)的乘法会变成简单的右移。因为我们省略了因子cos(ak),我们得到

yn~=cos(u)*(1/(cos(a0)*cos(a1)*…*cos(an))
xn~=sin(u)*(1/(cos(a0)*cos(a1)*…*cos(an))

如前所述,系数f=cos(a0)*cos(a1)*…*cos(an)为0.607…。我们通过设置起始值将其纳入计算

y0=f*cos(0)=f
x0=f*sin(0)=0

这是一个C代码,它使用16位定点算法显示了整个计算过程。输入角度被缩放为360度对应216度,而正弦和余弦输出被缩放为1对应215度

#包括
#包括
#包括
/*圆形(阿坦)