| |
CORDIC算法实现极坐标(polar)到直角坐标系(Cartesian)的变换。
1: function [horizonal,vertical]=polar2car(mag, pha); 2: x =mag; 3: y =0; 4: z=pha; 5: d=0; 6: i=0; 7: k = 0.6073; %K 增益 8: x = k*x;9: while i<50
10: if z<0 d =-1;
11: else d = 1;
12: end 13: xNew=x-y*d*(2^(-i)); 14: y=y+x*d*(2^(-i)); 15: z=z-d*atan(1/2^(i)); 16: i=i+1; 17: 18: 19: x=xNew; 20: end 21: horizonal = x; 22: vertical = y; CORDIC算法实现直角坐标到极坐标系的变换。
1: function [mag, pha]= car2polar(x,y); 2: 3: %y =0; 4: %将直角坐标系中的点(x,y)旋转到x轴,旋转的角度即为其极坐标的相位,在x轴的长度等于极坐标的幅度 5: d=0; %可用于求相位,幅度 6: i=0; 7: z=0; 8: k = 0.6073; %K 增益 9: 10: while i<50
11: if y<0 d = 1;
12: else d = -1;
13: end 14: xNew=x-y*d*(2^(-i)); 15: y=y+x*d*(2^(-i)); 16: z=z-d*atan(1/2^(i)); 17: i=i+1; 18: 19: 20: x=xNew; 21: end 22: x = x*k; 23: mag=x; 24: pha=z;验证:
[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
1: function [ pha]= cordic_arcsin(c); 2: 3: %y =0; 4: %将点(1,0)旋转至其纵坐标=c,旋转的角度为角度 求反余弦也是同样道理 5: d=0; 6: i=0; 7: z=0; 8: x=1; 9: y=0; 10: k = 0.6073; %K 增益 11: xNew = x* k;12: while i<100
13: if y<=c d = 1;
14: else d = -1;
15: end 16: x =xNew-y*d*(2^(-i)); 17: y=y+xNew*d*(2^(-i)); 18: z=z+d*atan(1/2^(i)); 19: i=i+1; 20: 21: 22: xNew=x; 23: end 24: 25: %mag=x; 26: pha=z;1: function [pha]= cordic_arccos(c);2:3: %y =0;4: d=0;5: i=0;6: z=0;7: x=1;8: y=0;9: k = 0.6073; %K 增益10: xNew = x* k;11: while i<10012: if x>=c d = 1;13: else d = -1;14: end15: x =xNew-y*d*(2^(-i));16: y=y+xNew*d*(2^(-i));17: z=z+d*atan(1/2^(i));18: i=i+1;19:20:21: xNew=x;22: end23:24: %mag=x;25: pha=z;1: function [ pha]= cordic_arctan(x,y);2:3: %y =0;4: %将点(x,y)旋转到x轴所需要的角度5: d=0;6: i=0;7: z=0;8: k = 0.6073; %K 增益9: x = x*k;10: while i<5011: if y<0 d = 1;12: else d = -1;13: end14: xNew=x-y*d*(2^(-i));15: y=y+x*d*(2^(-i));16: z=z-d*atan(1/2^(i));17: i=i+1;18:19:20: x=xNew;21: end22:23: %mag=x;24: pha=z;1: function [sine,cosine] = cordic_sine(angle);2: % Initialitation3: %%angle=30 ;4: x = 1;5: y = 0;6: z = angle;7: d = 1;8:9: i = 0; % Iterative factor10: k = 0.6073; %K Factor11: xNew = k*x;12: while i < 5013: if z <=0 d =-1;14: else d = 1;15: end16: x= xNew -d*y*2^(-i);17: y=y+d*xNew*2^(-i);18: z=z-d*atan(2^(-i));19: i=i+1;20: xNew=x;21: end22: cosine = x23: sine = y
/1