// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab // Copyright (C) 2010 - INRIA - Serge Steer // This file must be used under the terms of the CeCILL. // This source file is licensed as described in the file COPYING, which // you should have received as part of this distribution. The terms // are also available at // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt function []=gainplot(varargin) rhs=size(varargin) if rhs == 0 then s=poly(0,"s"); h1=syslin("c",(s^2+2*0.9*10*s+100)/(s^2+2*0.3*10.1*s+102.01)); h2=syslin("c",(s^2+2*0.1*15.1*s+228.01)/(s^2+2*0.9*15*s+225)); gainplot([h1;h2],0.01,100,.. ["$\frac{s^2+18 s+100}{s^2+6.06 s+102.1}$"; "$\frac{s^2+3.02 s+228.01}{s^2+27 s+225}$"]); title("Gainplot"); return; end if type(varargin($))==10 then comments=varargin($); rhs=rhs-1; else comments=[]; end fname="gainplot";//for error messages fmax=[]; if or(typeof(varargin(1))==["state-space" "rational"]) then //sys,fmin,fmax [,pas] or sys,frq refdim=1 //for error message if rhs==1 then [frq,repf]=repfreq(varargin(1),1d-3,1d3); elseif rhs==2 then //sys,frq if size(varargin(2),2)<2 then error(msprintf(_("%s: Wrong size for input argument #%d: A row vector with length>%d expected.\n"),.. fname,2,1)); end [frq,repf]=repfreq(varargin(1:rhs)); elseif or(rhs==(3:4)) then //sys,fmin,fmax [,pas] [frq,repf]=repfreq(varargin(1:rhs)); else error(msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),fname,1,5)) end [phi,d]=phasemag(repf); elseif type(varargin(1))==1 then //frq,db,phi [,comments] or frq, repf [,comments] refdim=2 select rhs case 2 then //frq,repf frq=varargin(1); if size(frq,2)<2 then error(msprintf(_("%s: Wrong size for input argument #%d: A row vector with length>%d expected.\n"),.. fname,1,1)) end if size(frq,2)<>size(varargin(2),2) then error(msprintf(_("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),.. fname,1,2)) end [phi,d]=phasemag(varargin(2)) case 3 then //frq,db,phi [frq,d]=varargin(1:rhs-1) if size(frq,2)<>size(d,2) then error(msprintf(_("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),.. fname,1,2)) end else error(msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),fname,2,4)) end else error(msprintf(_("%s: Wrong type for input argument #%d: Linear dynamical system or row vector of floats expected.\n"),fname,1)) end; frq=frq'; d=d'; [n,mn]=size(d); if and(size(comments,"*")<>[0 mn]) then error(msprintf(_("%s: Incompatible input arguments #%d and #%d: Same number of elements expected.\n"),... fname,refdim,rhs+1)) end // fig=gcf(); immediate_drawing=fig.immediate_drawing; fig.immediate_drawing="off"; axes = gca() ; if size(axes.children,"*")==0 then axes.data_bounds=[min(frq),min(d);max(frq),max(d)] axes.x_label.text=_("Frequency (Hz)") axes.y_label.text=_("Magnitude (dB)") else axes.data_bounds=[min([min(frq),min(d)],axes.data_bounds(1,:)); max([max(frq),max(d)],axes.data_bounds(2,:))]; end axes.axes_visible="on"; axes.log_flags = "lnn" ; axes.grid=color("lightgrey")*ones(1,3); if size(d,2)>1&size(frq,2)==1 then xpolys(frq(:,ones(1,mn)),d,1:mn) e=gce(); else xpolys(frq,d,1:mn) e=gce(); end for i=1:size(e.children,"*") e.children(i).display_function = "formatGainplotTip"; end if comments<>[] then legend(comments) end fig.immediate_drawing=immediate_drawing; endfunction