functions moved from graphics to cacsd
[scilab.git] / scilab / modules / cacsd / macros / bode.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at    
7 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
8
9 function []=bode(varargin)
10   rhs=size(varargin)
11   if type(varargin($))==10 then
12     comments=varargin($),rhs=rhs-1;
13   else
14     comments=[];
15   end
16   fmax=[]
17   if or(typeof(varargin(1))==['state-space' 'rational']) then 
18     //sys,fmin,fmax [,pas] or sys,frq
19     if rhs==1 then
20       [frq,repf]=repfreq(varargin(1),1d-3,1d3)
21     elseif rhs==2 then //sys,frq
22       if size(varargin(2),2)<2 then
23         error(msprintf(_("%s : Invalid argument #%d. It must be a row vector with length > %d"),..
24                      "bode",1,1))
25       end
26       [frq,repf]=repfreq(varargin(1:rhs))
27     elseif or(rhs==(3:4)) then //sys,fmin,fmax [,pas]
28       [frq,repf]=repfreq(varargin(1:rhs))
29     else
30       error(msprintf(_("%s : Invalid call: sys,fmin,fmax [,pas] [,com]'),"bode"))
31     end
32     [phi,d]=phasemag(repf)
33     if rhs>=3 then fmax=varargin(3),end
34   elseif  type(varargin(1))==1 then 
35     //frq,db,phi [,comments] or frq, repf [,comments]
36     select rhs
37     case 2 then //frq,repf
38       frq=varargin(1);
39       if size(frq,2)<2 then
40         error(msprintf(_("%s : Invalid argument #%d. It must be a row vector with length > %d"),..
41                      "bode",1,1))
42       end
43       if size(frq,2)<>size(varargin(2),2) then
44         error(msprintf(_("%s : Incompatible dimensions of arguments #%d and #%d."),..
45                          "bode",1,2))
46       end
47       [phi,d]=phasemag(varargin(2))
48     case 3 then  //frq,db,phi
49       [frq,d,phi]=varargin(1:rhs)
50       if size(frq,2)<>size(d,2) then
51         error(msprintf(_("%s : Incompatible dimensions of arguments #%d and #%d."),..
52                          "bode",1,2))
53       end
54       if size(frq,2)<>size(phi,2) then
55         error(msprintf(_("%s : Incompatible dimensions of arguments #%d and #%d."),..
56                          "bode",1,3))
57       end
58     else 
59       error(msprintf(_("%s : Invalid call: frq, db,phi [,com] or frq,repf [,com]'),"bode"))
60     end
61   else
62     error(msprintf(_("%s : Invalid argument #%d. It must be a linear"+..
63                      " dynamical system (syslin) or a real array"),"bode",1))
64   end;
65    frq=frq';d=d',phi=phi'
66   [n,mn]=size(d)
67
68   if comments==[] then
69     hx=0.48
70   else
71     if size(comments,'*')<>mn then
72       error(msprintf(_("%s : Invalid dimension for argument #%d"),"bode",rhs+1))
73     end
74     hx=0.43
75   end;
76
77   drawlater()
78   sciCurAxes=gca();
79   axes=sciCurAxes;
80   wrect=axes.axes_bounds;
81
82
83   //magnitude
84   axes.axes_bounds=[wrect(1)+0,wrect(2)+0,wrect(3)*1.0,wrect(4)*hx*0.95]
85   axes.data_bounds = [min(frq),min(d);max(frq),max(d)];
86   axes.log_flags = "lnn" ;
87   axes.grid=color('lightgrey')*ones(1,3);
88   axes.axes_visible="on";
89   if size(d,2)>1&size(frq,2)==1 then
90     xpolys(frq(:,ones(1,mn)),d,1:mn)
91   else
92     xpolys(frq,d,1:mn)
93   end
94   if fmax<>[]&max(frq)<fmax then
95       xpoly(max(frq)*[1;1],axes.y_ticks.locations([1 $]));e=gce();
96       e.foreground=5;
97   end
98   xtitle('Magnitude ',' Hz','db');
99
100   //phase
101   axes=newaxes();
102   axes.axes_bounds=[wrect(1)+0,wrect(2)+wrect(4)*hx,wrect(3)*1.0,wrect(4)*hx*0.95];
103   axes.data_bounds = [mini(frq),mini(phi);maxi(frq),maxi(phi)];
104   axes.log_flags = "lnn" ;
105   axes.grid=color('lightgrey')*ones(1,3);
106   axes.axes_visible="on";
107   if size(phi,2)>1&size(frq,2)==1 then
108     xpolys(frq(:,ones(1,mn)),phi,1:mn)
109   else
110     xpolys(frq,phi,1:mn)
111   end
112   if fmax<>[]&max(frq)<fmax then
113       xpoly(max(frq)*[1;1],axes.y_ticks.locations([1 $]));e=gce();
114       e.foreground=5;
115   end
116   // create legend
117   if comments<>[] then
118     axes=newaxes()
119     axes.axes_bounds=[wrect(1)+0,wrect(2)+wrect(4)*2*hx,wrect(3)*1.0,wrect(4)*0.1];
120     axes.data_bounds=[0 0; 1 1];
121     y0=0.7;dy=-1/2
122     x0=0;dx=1/2
123     count=0
124     for k=1:mn
125       xsegs([x0;x0+0.08],[y0;y0],k),e1=gce()
126       rect=xstringl(x0+0.1,y0,comments(k))
127       xstring(x0+0.1,y0-rect(4)/3,comments(k)),e2=gce()
128       glue([e2 e1])
129       count=count+1
130       y0=y0+dy
131       if count==3 then x0=x0+dx;y0=0.7,end
132     end
133   end
134   drawnow()
135   // return to the previous scale
136   set( "current_axes", sciCurAxes ) ;
137
138 endfunction