CORDIC-based approximation of polar-to-Cartesian conversion
[x,y] = cordicpol2cart(theta,r)
[x,y] = cordicpol2cart(theta,r,niters)
[x,y] = cordicpol2cart(theta,r,Name,Value)
[x,y] = cordicpol2cart(theta,r,niters,Name,Value)
returns
the Cartesian xy coordinates of [x,y]
= cordicpol2cart(theta
,r
)r
* e^(j*theta
)
using a CORDIC algorithm approximation.
performs [x,y]
= cordicpol2cart(theta
,r
,niters
)niters
iterations
of the algorithm.
scales
the output depending on the Boolean value of [x,y]
= cordicpol2cart(theta
,r
,Name,Value
)b
.
specifies
both the number of iterations and [x,y]
= cordicpol2cart(theta
,r
,niters
,Name,Value
)Name,Value
pair
for whether to scale the output.
|
|
|
|
|
|
Optional comma-separated pairs of Name,Value
arguments,
where Name
is the argument name and Value
is
the corresponding value. Name
must appear inside
single quotes (''
).
|
Default: true |
|
When the input When the input |
Run the following code, and evaluate the accuracy of the CORDIC-based Polar-to-Cartesian conversion.
wrdLn = 16; theta = fi(pi/3, 1, wrdLn); u = fi( 2.0, 1, wrdLn); fprintf('\n\nNITERS\tX\t\t ERROR\t LSBs\t\tY\t\t ERROR\t LSBs\n'); fprintf('------\t-------\t ------\t ----\t\t-------\t ------\t ----\n'); for niters = 1:(wrdLn - 1) [x_ref, y_ref] = pol2cart(double(theta),double(u)); [x_fi, y_fi] = cordicpol2cart(theta, u, niters); x_dbl = double(x_fi); y_dbl = double(y_fi); x_err = abs(x_dbl - x_ref); y_err = abs(y_dbl - y_ref); fprintf('%d\t%1.4f\t %1.4f\t %1.1f\t\t%1.4f\t %1.4f\t %1.1f\n',... niters,x_dbl,x_err,(x_err * pow2(x_fi.FractionLength)),... y_dbl,y_err,(y_err * pow2(y_fi.FractionLength))); end fprintf('\n'); NITERS X ERROR LSBs Y ERROR LSBs ------ ------- ------ ---- ------- ------ ---- 1 1.4142 0.4142 3392.8 1.4142 0.3178 2603.8 2 0.6324 0.3676 3011.2 1.8973 0.1653 1354.2 3 1.0737 0.0737 603.8 1.6873 0.0448 366.8 4 0.8561 0.1440 1179.2 1.8074 0.0753 617.2 5 0.9672 0.0329 269.2 1.7505 0.0185 151.2 6 1.0214 0.0213 174.8 1.7195 0.0126 102.8 7 0.9944 0.0056 46.2 1.7351 0.0031 25.2 8 1.0079 0.0079 64.8 1.7274 0.0046 37.8 9 1.0011 0.0011 8.8 1.7313 0.0007 5.8 10 0.9978 0.0022 18.2 1.7333 0.0012 10.2 11 0.9994 0.0006 5.2 1.7323 0.0003 2.2 12 1.0002 0.0002 1.8 1.7318 0.0002 1.8 13 0.9999 0.0002 1.2 1.7321 0.0000 0.2 14 0.9996 0.0004 3.2 1.7321 0.0000 0.2 15 0.9998 0.0003 2.2 1.7321 0.0000 0.2 |
[1] Volder, JE. “The CORDIC Trigonometric Computing Technique.” IRE Transactions on Electronic Computers. Vol. EC-8, September 1959, pp. 330–334.
[2] Andraka, R. “A survey of CORDIC algorithm for FPGA based computers.” Proceedings of the 1998 ACM/SIGDA sixth international symposium on Field programmable gate arrays. Feb. 22–24, 1998, pp. 191–200.
[3] Walther, J.S. “A Unified Algorithm for Elementary Functions.” Hewlett-Packard Company, Palo Alto. Spring Joint Computer Conference, 1971, pp. 379–386. (from the collection of the Computer History Museum). www.computer.org/csdl/proceedings/afips/1971/5077/00/50770379.pdf
[4] Schelin, Charles W. “Calculator Function Approximation.” The American Mathematical Monthly. Vol. 90, No. 5, May 1983, pp. 317–325.