%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Creative Commons % Attribution-Noncommercial 2.5 India % You are free: % to Share — to copy, distribute and transmit the work % to Remix — to adapt the work % Under the following conditions: % Attribution. You must attribute the work in the manner % specified by the author or licensor (but not in any way % that suggests that they endorse you or your use of the work). % Noncommercial. You may not use this work for commercial purposes. % For any reuse or distribution, you must make clear to others the % license terms of this work. The best way to do this is with a % link to this web page. % Any of the above conditions can be waived if you get permission % from the copyright holder. % Nothing in this license impairs or restricts the author's moral rights. % http://creativecommons.org/licenses/by-nc/2.5/in/ % Checked for proper operation with Octave Version 3.0.0 % Author : Krishna % Email : krishna@dsplog.com % Version : 1.0 % Date : 9 December 2007 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Using CORDIC for phase and magnitude computation clear % creating the reference angles Y_k = ones(32,1) + j*2.^(-1*[0:1:31])'; % values of Y alpha_k = angle(Y_k)*180/pi; % reference angles, used for finding the cumulative phase X = 7+3*j; % complex number for which magnitude is to be computed K = 16; % number of iterations Z = X; % assigning the output as the input % first rotation - for shifting to first/fourth quadrant if imag(Z) <=0 % rotate by 90 degrees Z = -1*imag(Z) + j*real(Z); % same as Z = Z*exp(j*pi/2); thetaHat = 90; else % rotate by -90 degrees Z = imag(Z) - j*real(Z); % same as Z = Z*exp(-j*pi/2); thetaHat = -90; end % running for different values of k for k = 0: K-1 s = -1*sign(imag(Z)); % difference if s == 0 % to handle when sign(imag(Z)) = 0 s = 1; end Z = Z*[1 + s*j*2^(-1*k)]; thetaHat = thetaHat + s*alpha_k(k+1); % dumping the variables sign_v(k+1) = s; thetaHat_v(k+1) = thetaHat; real_Z(k+1) = real(Z); end % comparing the absolute value obtained via cordic Z_abs_ideal = abs(X); Z_abs_cordic = Z/1.64676025786545; err_abs = Z_abs_ideal - real(Z_abs_cordic) Z_angle_ideal = angle(X)*180/pi; Z_angle_cordic = -1*thetaHat; err_angle = Z_angle_ideal - Z_angle_cordic