
Bode (magnitude and phase response of a linear transfer function)

bech
Because Igor is sorely lacking in support for linear systems, the format of the transfer function is a bit free-form. One day, it would be nice for Igor to have a linear system structure that would automatically handle features such as continuous or discrete dynamics, different representations (Laplace domain, pole-zero, state space, etc.), and the like. For now, this will do.
Example:
•Make /o/d/n=1 pw={0.1} // create a parameter wave; set the damping to zeta=0.1 •Bode(SecondOrder,pw,0.01,100,1000,"order2") •Display order2_mag vs order2_omega // these are the minimal graphics commands •ModifyGraph log=1 // the attached layout has been "prettied up" in inessential ways •Display order2_ph vs order2_omega •ModifyGraph log(bottom)=1
Here are the Igor functions:
//_______________________________________________________________________ Function Bode(tf,pars,w0,w1,N,base) // make waves for Bode plots (mag & phase) for transfer function FUNCREF myprotofunc tf // pass function as argument; tf = "transfer function" Wave pars // parameter wave to pass to function Variable w0,w1,N // w0 = lower, w1 = upper frequencies; N = num points String base // base name for output waves String OmegaString=base+"_omega", BodeMagString=base+"_mag", BodePhString=base+"_ph" Make /o/d/n=(N)$OmegaString,$BodeMagString,$BodePhString Wave OmegaWave=$OmegaString, BodeMagWave=$BodeMagString, BodePhWave=$BodePhString OmegaWave = w0*(w1/w0)^(p/(N-1)) // even spacing on log Variable /c i=cmplx(0,1) // define i=sqrt(-1) Make /free/c/d/n=(N) ss = i*OmegaWave // temporary wave for s = iw BodeMagWave = cabs(tf(pw,ss)) // magnitude of frequency response BodePhWave = atan2(imag(tf(pw,ss)),real(tf(pw,ss)))*180/pi // output phase in degrees Unwrap 360, BodePhWave // prevent any 360 degree phase jumps End Function/c myprotofunc(pars,s) // format of prototype function (transfer function) Wave pars; Variable /c s // pars = parameters; s = Laplace domain End //_______________________________________________________________________ Function/c SecondOrder(pars,s) // substitute your own transfer function here Wave pars; Variable/c s Variable zeta=pars[0] // zeta = dimensionless damping coefficient Return 1/(1+2*zeta*s+s^2) // standard scaled 2nd-order response function End //_________________________________________________


Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More