cordic算法实现arctan和sqrt(x^2+y^2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CORDIC算法实现arctan和sqrt(x^2+y^2)
1.算法原理
cordic算法实现arctan和sqrt(x^2+y^2)计算,使用的是圆周系统、向量模式。
本文介绍传统的和扩展的CORDIC两种算法实现arctan计算,可以使用传统的Cordic计算出sqrt(x^2+y^2),其传统方式的基本公式如1-1所示。
x i+1=x i−y i∗d∗2−i
y i+1=y i+x i∗d∗2−i
z i+1=z i−d∗arctan (2−i)(1-1)其中,
i=0,1,2,3,...N
if x(i)*y(i)>=0
d=-1;
else
d=1;
end
输入的条件是:x0=1,z0=0,abs(atan(y0/x0))<=1.7433
输出的结果是:z=atan(y0/x0)z=acot(x0/y0)
当计算sqrt(x0^2+y0^2)时,只能使用传统的Cordic算法
x=w*sqrt(x0^2+y0^2)
输入需满足x>=0即可
w=1.646760258是该系统的增益系数,可以计算出来:
w=1;
for i=1:iter
w=w*sqrt(1+2^(-2*i));
end
扩展的Cordic算法是将i=0计算三次,可以增大输入的范围
输入的条件是:z0=[0,pi]
输出的结果是:y/2=sin(z0),x/2=cos(z0)
2.Matlab实现
传统的Cordic算法实现:
%Cordic arctan:Circular and Vectoring Mode
%z=atan(y0/x0);z=acot(x0/y0)
%Condition:x0=1,z0=0abs(atan(y0/x0))<=1.7433 %
%x=w*sqrt(x0^2+y0^2)
%Condition:x>=0
clc;
clear;
close all;
N=10;
x0=0.1;
y0=-0.99;
z0=0;
iter=N;
w=1;
for i=0:iter
w=w*sqrt(1+2^(-2*i));
end
%%Cordic Arctan and Sqrt(x0^2+y0^2)
if y0*x0>=0
d=-1;
else
d=1;
end
xt1=x0-y0*d*2^0;
yt1=y0+x0*d*2^0;
zt1=z0-d*atan(2^0);
x=zeros(1,iter);
y=zeros(1,iter);
z=zeros(1,iter);
x(1)=xt1;
y(1)=yt1;
z(1)=zt1;
for i=1:iter
if x(i)*y(i)>=0
d=-1;
else
d=1;
end
x(i+1)=x(i)-y(i)*d*2^(-i);
y(i+1)=y(i)+x(i)*d*2^(-i);
z(i+1)=z(i)-d*atan(2^(-i));
end
%%Compare the results
z(end)-atan(y0/x0)
z(end)-acot(x0/y0)
x(end)-w*sqrt(x0^2+y0^2)
扩展的Cordic算法实现:
%Cordic arctan:Circular and Vectoring Mode
%z=atan(y0/x0);z=acot(x0/y0)
%Condition:x(0)=1,z(0)=0abs(atan(y(0)/x(0)))<=3.3141 %
clc;
clear;
close all;
N=11;
x0=-0.1;
y0=0.99;
z0=0;
iter=N;
%w=1;
%for i=0:iter
%w=w*sqrt(1+2^(-2*i));
%end
%%Cordic Arctan
if y0*x0>=0
d=-1;
else
d=1;
end
xt1=x0-y0*d*2^0;
yt1=y0+x0*d*2^0;
zt1=z0-d*atan(2^0);
if xt1*yt1>=0
d=-1;
else
d=1;
end
xt2=xt1-yt1*d*2^0;
yt2=yt1+xt1*d*2^0;
zt2=zt1-d*atan(2^0);
if xt2*yt2>=0
d=-1;
else
d=1;
end
xt3=xt2-yt2*d*2^0;
yt3=yt2+xt2*d*2^0;
zt3=zt2-d*atan(2^0);
x=zeros(1,iter);
y=zeros(1,iter);
z=zeros(1,iter);
z(1)=zt3;
x(1)=xt3;
y(1)=yt3;
for i=1:iter
if x(i)*y(i)>=0
d=-1;
else
d=1;
end
x(i+1)=x(i)-y(i)*d*2^(-i);
y(i+1)=y(i)+x(i)*d*2^(-i);
z(i+1)=z(i)-d*atan(2^(-i)); end
%%Compare the results
z(end)-atan(y0/x0)
z(end)-acot(x0/y0)
3.sysgen实现。