您的位置:首页 > 其它

CORDIC原理与FPGA实现(2)

2013-10-25 11:38 513 查看

CORDIC算法实现极坐标(polar)到直角坐标系(Cartesian)的变换。

function[horizonal,vertical]=polar2car(mag,pha);

[code]x=mag;
y=0;

z=pha;

d=0;

i=0;

k=0.6073;%K增益

x=k*x;

whilei<50

ifz<0d=-1;

elsed=1;

end

xNew=x-y*d*(2^(-i));

y=y+x*d*(2^(-i));

z=z-d*atan(1/2^(i));

i=i+1;



x=xNew;

end

horizonal=x;

vertical=y;

[/code]

CORDIC算法实现直角坐标到极坐标系的变换。


[code]function[mag,pha]=car2polar(x,y);

%y=0;

%将直角坐标系中的点(x,y)旋转到x轴,旋转的角度即为其极坐标的相位,在x轴的长度等于极坐标的幅度

d=0;%可用于求相位,幅度

i=0;

z=0;

k=0.6073;%K增益


whilei<50

ify<0d=1;

elsed=-1;

end

xNew=x-y*d*(2^(-i));

y=y+x*d*(2^(-i));

z=z-d*atan(1/2^(i));

i=i+1;



x=xNew;

end

x=x*k;

mag=x;

pha=z;

[/code]

验证:

[a,b]=polar2car(1,pi/3)

a=

0.5000

b=

0.8661

[a,b]=car2polar(0.5000,0.8661)

a=

1.0001

b=

1.0472



计算正切值atan只需将直角坐标变换为极坐标的程序中取出最后的角度值,即可得到反正切值。

function[pha]=cordic_arcsin(c);

[code]
%y=0;

%将点(1,0)旋转至其纵坐标=c,旋转的角度为角度求反余弦也是同样道理

d=0;

i=0;

z=0;

x=1;

y=0;

k=0.6073;%K增益

xNew=x*k;

whilei<100

ify<=cd=1;

elsed=-1;

end

x=xNew-y*d*(2^(-i));

y=y+xNew*d*(2^(-i));

z=z+d*atan(1/2^(i));

i=i+1;



xNew=x;

end


%mag=x;

pha=z;

[/code]


function[pha]=cordic_arccos(c);

[code]
%y=0;

d=0;

i=0;

z=0;

x=1;

y=0;

k=0.6073;%K增益

xNew=x*k;

whilei<100

ifx>=cd=1;

elsed=-1;

end

x=xNew-y*d*(2^(-i));

y=y+xNew*d*(2^(-i));

z=z+d*atan(1/2^(i));

i=i+1;



xNew=x;

end


%mag=x;

pha=z;

[/code]


function[pha]=cordic_arctan(x,y);

[code]
%y=0;

%将点(x,y)旋转到x轴所需要的角度

d=0;

i=0;

z=0;

k=0.6073;%K增益

x=x*k;

whilei<50

ify<0d=1;

elsed=-1;

end

xNew=x-y*d*(2^(-i));

y=y+x*d*(2^(-i));

z=z-d*atan(1/2^(i));

i=i+1;



x=xNew;

end


%mag=x;

pha=z;

[/code]


function[sine,cosine]=cordic_sine(angle);

[code]%Initialitation
%%angle=30;

x=1;

y=0;

z=angle;

d=1;


i=0;%Iterativefactor

k=0.6073;%KFactor

xNew=k*x;

whilei<50

ifz<=0d=-1;

elsed=1;

end

x=xNew-d*y*2^(-i);

y=y+d*xNew*2^(-i);

z=z-d*atan(2^(-i));

i=i+1;

xNew=x;

end

cosine=x

sine=y

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: