Revision: 4674
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4674&view=rev
Author:   jdh2358
Date:     2007-12-08 08:23:40 -0800 (Sat, 08 Dec 2007)

Log Message:
-----------
added butter and filtfilt

Modified Paths:
--------------
    trunk/py4science/examples/pyrex/movavg/movavg_ringbuf.py
    trunk/py4science/examples/pyrex/sums/numpyx.pyx

Added Paths:
-----------
    trunk/py4science/examples/butter_filter.py
    trunk/py4science/examples/filtilt_demo.py

Added: trunk/py4science/examples/butter_filter.py
===================================================================
--- trunk/py4science/examples/butter_filter.py                          (rev 0)
+++ trunk/py4science/examples/butter_filter.py  2007-12-08 16:23:40 UTC (rev 
4674)
@@ -0,0 +1,41 @@
+import numpy as n
+import scipy.signal as signal
+from pylab import figure, show
+
+dt = 0.01
+t = n.arange(0, 2, dt)
+s = n.sin(2*n.pi*t)
+
+# sine corrupted wih gaussian white noise
+sn = s + 0.1*n.random.randn(len(s))  # noisy sine
+
+# the nyquist frequency 1/(2dt)
+Nyq = 0.5/dt
+
+cornerfreq = 2.  # the corner frequency
+stopfreq = 5.    # the stop frequency
+
+# the corner and stop freqs as fractions of the nyquist
+ws = cornerfreq/Nyq
+wp = stopfreq/Nyq
+
+
+# the order and butterworth natural frequency for use with butter
+N, wn = signal.buttord(wp, ws, 3, 16)
+
+# return the butterworth filter coeffs for the given order and frequency
+b, a = signal.butter(N, wn)
+
+# filter the data
+sf = signal.lfilter(b, a, sn)
+
+fig = figure()
+ax = fig.add_subplot(111)
+ax.plot(t, s, label='original signal')
+ax.plot(t, sn, label='noisy signal')
+ax.plot(t, sf, label='filtered signal')
+ax.legend()
+ax.set_title('low pass butterworth filter of sine')
+ax.set_xlabel('time (s)')
+ax.grid()
+show()

Added: trunk/py4science/examples/filtilt_demo.py
===================================================================
--- trunk/py4science/examples/filtilt_demo.py                           (rev 0)
+++ trunk/py4science/examples/filtilt_demo.py   2007-12-08 16:23:40 UTC (rev 
4674)
@@ -0,0 +1,102 @@
+"""
+Cookbook / FiltFilt : http://www.scipy.org/Cookbook/FiltFilt
+
+This sample code implements a zero phase delay filter that processes
+the signal in the forward and backward direction removing the phase
+delay. The order of the filter is the double of the original filter
+order. The function also computes the initial filter parameters in
+order to provide a more stable response (via lfilter_zi). The
+following code has been tested with Python 2.4.4 and Scipy 0.5.1.
+
+"""
+from numpy import vstack, hstack, eye, ones, zeros, linalg, \
+newaxis, r_, flipud, convolve, matrix, array
+from scipy.signal import lfilter
+
+def lfilter_zi(b,a):
+
+    #compute the zi state from the filter parameters. see [Gust96].
+
+    #Based on: [Gust96] Fredrik Gustafsson, Determining the initial
+    # states in forward-backward filtering, IEEE Transactions on
+    # Signal Processing, pp. 988--992, April 1996, Volume 44, Issue 4
+
+    n=max(len(a),len(b))
+
+    zin = (  eye(n-1) - hstack( (-a[1:n,newaxis],
+                                 vstack((eye(n-2), zeros(n-2))))))
+
+    zid =  b[1:n] - a[1:n]*b[0]
+
+    zi_matrix=linalg.inv(zin)*(matrix(zid).transpose())
+    zi_return=[]
+
+    #convert the result into a regular array (not a matrix)
+    for i in range(len(zi_matrix)):
+      zi_return.append(float(zi_matrix[i][0]))
+
+    return array(zi_return)
+
+
+
+
+def filtfilt(b,a,x):
+    #For now only accepting 1d arrays
+    ntaps=max(len(a),len(b))
+    edge=ntaps*3
+
+    if x.ndim != 1:
+        raise ValueError, "Filiflit is only accepting 1 dimension arrays."
+
+    #x must be bigger than edge
+    if x.size < edge:
+        raise ValueError, "Input vector needs to be bigger than 3 * 
max(len(a),len(b)."
+
+    if len(a) < ntaps:
+        a=r_[a,zeros(len(b)-len(a))]
+
+    if len(b) < ntaps:
+        b=r_[b,zeros(len(a)-len(b))]
+
+    zi=lfilter_zi(b,a)
+
+    #Grow the signal to have edges for stabilizing
+    #the filter with inverted replicas of the signal
+    s=r_[2*x[0]-x[edge:1:-1],x,2*x[-1]-x[-1:-edge:-1]]
+    #in the case of one go we only need one of the extrems
+    # both are needed for filtfilt
+
+    (y,zf)=lfilter(b,a,s,-1,zi*s[0])
+
+    (y,zf)=lfilter(b,a,flipud(y),-1,zi*y[-1])
+
+    return flipud(y[edge-1:-edge+1])
+
+
+
+if __name__=='__main__':
+
+    import scipy.signal as signal
+    from scipy import sin, arange, pi, randn
+
+    from pylab import plot, legend, show, hold
+
+    t = arange(-1,1,.01)
+    x = sin(2*pi*t*.5+2)
+
+    # add some noise to the signa
+    xn = x+randn(len(t))*0.05
+
+    # parameters for a butterworth lowpass filter
+    [b,a] = signal.butter(3,0.05)
+
+    z = lfilter(b, a, xn)
+    y = filtfilt(b, a, xn)
+
+    plot(x, 'c', label='original')
+    plot(xn, 'k', label='noisy signal')
+    plot(z, 'r', label='lfilter - butter 3 order')
+    plot(y, 'g', label='filtfilt - butter 3 order')
+    legend(loc='best')
+    show()
+

Modified: trunk/py4science/examples/pyrex/movavg/movavg_ringbuf.py
===================================================================
--- trunk/py4science/examples/pyrex/movavg/movavg_ringbuf.py    2007-12-08 
14:00:28 UTC (rev 4673)
+++ trunk/py4science/examples/pyrex/movavg/movavg_ringbuf.py    2007-12-08 
16:23:40 UTC (rev 4674)
@@ -4,7 +4,7 @@
 import numpy
 import ringbuf
 
-r = ringbuf.Ringbuf(30)
+r = ringbuf.Ringbuf(31)
 x = numpy.random.rand(10000)
 
 data = []

Modified: trunk/py4science/examples/pyrex/sums/numpyx.pyx
===================================================================
--- trunk/py4science/examples/pyrex/sums/numpyx.pyx     2007-12-08 14:00:28 UTC 
(rev 4673)
+++ trunk/py4science/examples/pyrex/sums/numpyx.pyx     2007-12-08 16:23:40 UTC 
(rev 4674)
@@ -26,31 +26,6 @@
 
 
 
-def sum_elements(c_numpy.ndarray arr):
-    cdef int i
-    cdef double x, val
-
-    x = 0.
-    val = 0.
-    for i from 0<=i<arr.dimensions[0]:
-        val = (<double*>(arr.data + i*arr.strides[0]))[0]
-        x = x + val
-
-    return x
-
-
-def scale_elements(int N):
-    cdef int i
-    cdef double x, val
-
-    x = 0.
-    val = 0.
-    for i from 0<=i<N:
-        val = 2.5 * i
-        x = x + val
-    return x
-
-
 cdef print_elements(char *data,
                     c_python.Py_intptr_t* strides,
                     c_python.Py_intptr_t* dimensions,


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
SF.Net email is sponsored by: 
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to