[SciPy-dev] scipy.signal documentation suggestions

Dan Lenski dlenski at gmail.com
Thu Oct 18 23:53:24 EDT 2007


Jarrod Millman <millman <at> berkeley.edu> writes:
> Thanks a lot for the expanded docstring.  We are very interested in
> improving the documentation and appreciate any help you can give us.
> I will take a look at the new docstring you submitted.

Sounds good.  Thanks for making all this stuff work :-)

> In the meantime, please read over our current coding/documentation guidelines:
> http://projects.scipy.org/scipy/numpy/wiki/CodingStyleGuidelines

Didn't realize that docstrings were supposed to be in reST format, oops.  Here's
an attempt at getting it right, includes an example in doctest format  I hope
this version is more useful.

Dan

---

bilinear.__doc__ = ''''''Return a digital filter from an analog filter
using the bilinear transform.

  The bilinear transform converts a filter in the continuous-time
  domain (an analog filter) to a filter in the discrete-time
  domain (a digital filter).

  *Parameters*:

    b : {array-like}
         The numerator coefficient vector of the analog transform.
    a : {array-like}
         The denominator coefficient vector of the analog transform.
         If ``a[0]`` is not 1, then both ``a`` and ``b`` are
         normalized by ``a[0]``.
    fs : {float}
         The desired sampling frequency of the digital transform.
         (*Default* = 1.0)

  *Returns*:

    bd : {array}
         The numerator coefficient vector of the digital transform.
    ad : {array}
         The denominator coefficient vector of the digital transform.
         Both ``a`` and ``b`` are normalized such that ``a[0]=1``. 

  *Algorithm*:

    Given an analog filter, with rational transfer function in the
    s-domain::

                                -1               -nb
                    b[0] + b[1]s  + ... + b[nb] s
            H(z) = ----------------------------------
                                -1               -na
                    a[0] + a[1]s  + ... + a[na] s

    The bilinear transform maps from the s-plane to the z-plane by
    substituting ``s = (2*fs)(z-1)/(z+1)``, where ``fs`` is the
    sampling frequency of the digital filter.  This gives the rational
    transfer function in the z-domain::

                                  -1                -nbd
                    bd[0] + bd[1]z  + ... + b[nbd] z
            Y(z) = -------------------------------------- X(z)
                                  -1                -nad
                    ad[0] + ad[1]z  + ... + a[nad] z

  *Example*:

    Consider a simple first-order low-pass analog filter, with
    corner frequency ``w``.  Its transfer function is::

                                       -1
                       1        0 + w s          b[0] = 0    b[1] = w
            H(z) = --------- = -------------  =>
                    1 + s/w            -1        a[0] = 1    a[1] = w
                                1 + w s

    A bilinear transform on this filter will produce a
    digital filter which can be used as input to `lfilter`.  For example:

    >>> from scipy.signal import *
    >>> from numpy import *
    >>> from pylab import *
    >>>
    >>> w = 10.0                     # corner frequency
    >>> fs = 1000.0                  # sampling rate
    >>>
    >>> t = arange(0, 2*pi, 1/fs)
    >>> x = sin(1*t) + sin(100*t)    # test signal
    >>>
    >>> b, a = bilinear([0,w], [1,w], fs)
    >>> y = lfilter(b, a, x)
    >>>
    >>> plot(t, x, label="unfiltered") #doctest: +ELLIPSIS
    [<matplotlib.lines.Line2D instance at ...>]
    >>> plot(t, y, label="low-pass filtered") #doctest: +ELLIPSIS
    [<matplotlib.lines.Line2D instance at ...>]
    >>> legend() #doctest: +ELLIPSIS
    <matplotlib.legend.Legend instance at ...>
    >>> show()
    >>>

'''




More information about the SciPy-Dev mailing list