📄 testcordic.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"><html xmlns:mwsh="http://www.mathworks.com/namespace/mcode/v1/syntaxhighlight.dtd"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!--This HTML is auto-generated from an M-file.To make changes, update the M-file and republish this document. --> <title>testCORDIC</title> <meta name="generator" content="MATLAB 7.4"> <meta name="date" content="2009-02-23"> <meta name="m-file" content="testCORDIC"><style>body { background-color: white; margin:10px;}h1 { color: #990000; font-size: x-large;}h2 { color: #990000; font-size: medium;}/* Make the text shrink to fit narrow windows, but not stretch too far in wide windows. */ p,h1,h2,div.content div { max-width: 600px; /* Hack for IE6 */ width: auto !important; width: 600px;}pre.codeinput { background: #EEEEEE; padding: 10px;}@media print { pre.codeinput {word-wrap:break-word; width:100%;}} span.keyword {color: #0000FF}span.comment {color: #228B22}span.string {color: #A020F0}span.untermstring {color: #B20000}span.syscmd {color: #B28C00}pre.codeoutput { color: #666666; padding: 10px;}pre.error { color: red;}p.footer { text-align: right; font-size: xx-small; font-weight: lighter; font-style: italic; color: gray;} </style></head> <body> <div class="content"> <h2>Contents</h2> <div> <ul> <li><a href="#1">Test</a></li> <li><a href="#2">main function-Cordic</a></li> <li><a href="#3">code</a></li> <li><a href="#4">subfunction1-direction</a></li> <li><a href="#5">code</a></li> <li><a href="#6">subfunction2-Angle2rotate</a></li> <li><a href="#7">code</a></li> <li><a href="#8">subfunction3-terminator</a></li> <li><a href="#9">code</a></li> <li><a href="#10">subfunction4-gainAn</a></li> <li><a href="#11">code</a></li> <li><a href="#12">subfunction5-gainKi</a></li> <li><a href="#13">code</a></li> </ul> </div> <h2>Test<a name="1"></a></h2><pre> test cordic</pre><pre class="codeinput">clctheta=linspace(0,pi/2,100)';<span class="comment">% function [xn,gain,Fs,Ds,yn,zn]=cordic(x0,y0,z0,mode,...</span><span class="comment">% dv_n,ROM,wordwidth)</span>wordwidth=64;Fs=zeros(wordwidth,length(theta));Ds=Fs;<span class="keyword">for</span> i=1:length(theta) [xn(i),An(i),F,D,zn(i),yn(i)]<span class="keyword">...</span> =cordic(1,0,theta(i),1,<span class="string">'z'</span>); Fs(1:length(F),i)=F; Ds(1:length(D),i)=D; <span class="comment">%sprintf('theta=%f',theta(i))</span><span class="keyword">end</span>cosine=xn./An;sine=yn./An;true_cosine=cos(theta);<span class="comment">% true values</span>true_sine=sin(theta);<span class="comment">%theta=theta/pi*180;</span>hold <span class="string">on</span>plot(theta,cosine,<span class="string">'LineWidth'</span>,1.5)plot(theta,sine,<span class="string">'LineWidth'</span>,1.5)plot(theta,true_cosine,<span class="string">'g'</span>)plot(theta,true_sine,<span class="string">'g'</span>)plot(theta,true_cosine-cosine',<span class="string">'r'</span>)plot(theta,true_sine-sine',<span class="string">'m'</span>)legend(<span class="string">'Cordic cosine'</span>,<span class="string">'Cordic sine'</span>,<span class="keyword">...</span> <span class="string">'true cosine'</span>,<span class="string">'true sine'</span>,<span class="keyword">...</span> <span class="string">'error cosine'</span>,<span class="string">'error sine'</span>)xlabel(<span class="string">'\theta'</span>),ylabel(<span class="string">'value'</span>)hold <span class="string">off</span><span class="comment">% some statistics</span>save <span class="string">F.dat</span> <span class="string">Fs</span> <span class="string">-ascii</span>save <span class="string">D.dat</span> <span class="string">Ds</span> <span class="string">-ascii</span><span class="comment">%%==========================================================</span></pre><img vspace="5" hspace="5" src="testCORDIC_01.png"> <h2>main function-Cordic<a name="2"></a></h2><pre> this routine is employed to compute functions such as x0z0,y0/x0,sinz0,cosz0,atany0,sinhz0, coshz0, and atanhy0 and so on some other functions such as tanz0,tanhz0,expz0,lnw,w^.5 can also be derived from the above results</pre><h2>code<a name="3"></a></h2><pre class="codeinput"><span class="keyword">function</span> [xn,gain,Fs,Ds,zn,yn]=cordic(x0,y0,z0,mode,<span class="keyword">...</span> dv_n,ROM,wordwidth,acc)<span class="comment">% initial state: x0,y0,z0</span><span class="comment">% initial state distincts various operatoins</span><span class="comment">% and some of the initial values effects the</span><span class="comment">% final results</span><span class="comment">% mode hints: mode</span><span class="comment">% there are three modes - circular,linear,</span><span class="comment">% hyperbolic, generally, we use 1,0,-1 to</span><span class="comment">% denotes them respectively and theoretically.</span><span class="comment">% m chooses one of them</span><span class="comment">% decision variable name: dv_n</span><span class="comment">% decision variable decides which direction</span><span class="comment">% to rotate,generally, dv is chosen between</span><span class="comment">% 'y' and 'z'</span><span class="comment">% datas stored: ROM</span><span class="comment">% wordwidth of system: wordwidth</span><span class="comment">% accuracy requirement: 2^(-acc)</span><span class="comment">% check inputs===============================================</span><span class="keyword">if</span>(nargin<3) disp(<span class="string">'too few inputs\n'</span>) z0=0;<span class="keyword">end</span><span class="keyword">if</span>(nargin<4) m=1; <span class="comment">% circular mode</span><span class="keyword">end</span><span class="keyword">if</span>(nargin<5) dv_n=<span class="string">'z'</span>; <span class="comment">% z is chosen to be decision variable</span><span class="keyword">end</span><span class="keyword">if</span>(nargin<6) ROM=<span class="string">'d'</span>;<span class="comment">% default</span><span class="keyword">end</span><span class="keyword">if</span>(nargin<7)<span class="comment">% DATAs are not provided</span> wordwidth=64; <span class="comment">% default word width - 64bit</span><span class="keyword">end</span><span class="keyword">if</span>(nargin<8)<span class="comment">% acc</span> acc=wordwidth;<span class="comment">% about 10^(-6)</span><span class="keyword">end</span><span class="comment">% preprocess=================================================</span><span class="comment">% main section===============================================</span><span class="comment">% initial state----------------------------------------------</span>xi=x0;yi=y0;zi=z0;m=mode;F=zeros(1,1);D=zeros(1,1);An=1;<span class="keyword">for</span> iteration=0:wordwidth+1 <span class="comment">% parameter initialization-------------------------------</span> <span class="keyword">if</span>(dv_n==<span class="string">'x'</span>)dv=xi;<span class="keyword">elseif</span>(dv_n==<span class="string">'y'</span>)dv=yi; <span class="keyword">else</span> dv=zi;<span class="comment">% default decision variable</span> <span class="keyword">end</span> <span class="comment">% termination test---------------------------------------</span> disable=terminator(dv,acc); <span class="keyword">if</span>(disable)<span class="keyword">break</span>; <span class="keyword">end</span><span class="comment">%if</span> <span class="comment">% iteration begins---------------------------------------</span> <span class="comment">% --------------------------di---------------------------</span> di=direction(dv,dv_n); D(iteration+1)=di; <span class="comment">% -------------------------Fi/e--------------------------</span> <span class="keyword">if</span>(ROM==<span class="string">'d'</span>) NumOfData=wordwidth+1; [Fi ei]=Angle2rotate(dv,m,di,NumOfData,wordwidth); <span class="keyword">else</span> [Fi ei]=Angle2rotate(dv,m,di,length(ROM),<span class="keyword">...</span> wordwidth,ROM); <span class="keyword">end</span> F(iteration+1)=Fi;<span class="comment">% record Fi</span> <span class="comment">% --------------------------An---------------------------</span> An=An*gainKi(Fi,m);<span class="comment">% calculate An</span> <span class="comment">% ----------------------xi/yi/zi-------------------------</span> xi=xi-m*yi*di*2^(-Fi); yi=yi+xi*di*2^(-Fi); zi=zi-di*ei;<span class="keyword">end</span><span class="comment">% iteration</span><span class="comment">% postprocess================================================</span><span class="comment">%check outputs===============================================</span><span class="keyword">if</span>(nargout<0 || nargout>6) xn=0;yn=0; disp(<span class="string">'too few or too many outputs.\n'</span>)<span class="keyword">end</span><span class="keyword">if</span>(nargout>0) xn=xi;<span class="keyword">end</span><span class="keyword">if</span>(nargout>1) gain=An;<span class="keyword">end</span><span class="keyword">if</span>(nargout>2) [row,column]=size(F); <span class="keyword">if</span>(row<column)Fs=reshape(F,column,row); <span class="keyword">else</span> Fs=F;<span class="keyword">end</span><span class="keyword">end</span><span class="keyword">if</span>(nargout>3) Ds=D';<span class="keyword">end</span><span class="keyword">if</span>(nargout>4) zn=zi;<span class="keyword">end</span><span class="keyword">if</span>(nargout>5) yn=yi;<span class="keyword">end</span><span class="comment">%ends function</span><span class="keyword">end</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -