python/bode.py
changeset 0 0efde00f9229
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python/bode.py	Fri May 27 14:24:59 2011 +0530
@@ -0,0 +1,41 @@
+import pylab as pl
+
+def freqresp(H, omega, sys_type='c'):
+    if (omega == None):
+        omega = pl.logspace(-2, 2);
+
+    num = pl.poly1d(H.num)
+    den = pl.poly1d(H.den)
+    if sys_type == 'd':
+        fresp = map(lambda w: num(w) / den(w), pl.exp(2*pl.pi*omega*1j))
+    else:
+        fresp = map(lambda w: num(w) / den(w), 2*pl.pi*omega*1j)
+    fresp = pl.array(fresp)
+    return omega, fresp
+
+def phasemag(fresp):
+    mag = abs(fresp)
+    mag = 20*pl.log10(mag)
+
+    phase = pl.angle(fresp)*180/pl.pi
+
+    return mag, phase
+    
+def bode(sys, omega=None):
+    omega, fresp  = freqresp(sys, omega, 'd')
+    mag, phase = phasemag(fresp)
+
+    pl.subplot(211)
+    pl.grid(linestyle='--')
+    pl.semilogx(omega, mag)
+    xmin, xmax = pl.xlim()
+    pl.xlim(1e-3, xmax)
+
+    pl.subplot(212)
+    pl.grid(linestyle='--')
+    pl.semilogx(omega, phase)
+    xmin, xmax = pl.xlim()
+    pl.xlim(1e-3, xmax)
+
+    return (211, 212)
+