[SciPy-dev] reimplementation of lfilter

Ralf Gommers ralf.gommers at googlemail.com
Tue Sep 22 21:40:48 EDT 2009


On Tue, Sep 22, 2009 at 9:01 PM, Sturla Molden <sturla at molden.no> wrote:

> Ralf Gommers skrev:
> > Sure, I know. The docs I linked have improvements over svn. If you
> > merge your changes, there'll be a conflict and those docs will not get
> > merged soon - I was hoping to avoid that.
>
> Oh, the docs, not the code... Would something like this be better?
>
>
See attached for a new version which incorporates your changes, the latest
wiki version, as well as some more edits. It fixes indentation, type
descriptions and rest markup.

 I have one (very minor) comment on the options you added, "direction" and
"inplace". I think these should both be bools, because they select between
two options.

The C++ code looks clean, I do not know enough about that language to say
much more about it.

Cheers,
Ralf




> The Cython module doesn't need to have docs in it.
>
>
>
> from linear_filter import lfilter as _lfilter
>
> def lfilter(b, a, x, axis=-1, zi=None, direction=1, inplace=-1):
>     """Filter data along one-dimension with an IIR or FIR filter.
>
>  Description
>
>    Filter a data sequence, x, using a digital filter.  This works for many
>    fundamental data types (including Object type).  The filter is a direct
>    form II transposed implementation of the standard difference equation
>    (see "Algorithm").
>
>  Inputs:
>
>     b -- The numerator coefficient vector in a 1-D sequence.
>    a -- The denominator coefficient vector in a 1-D sequence. If a[0]
>          is not 1, then both a and b are normalized by a[0].
>     x -- An N-dimensional input array.
>    axis -- The axis of the input data array along which to apply the
>             linear filter. The filter is applied to each subarray along
>             this axis. If axis is -1, the filter is applied to x
>            flattened. (*Default* = -1)
>    zi -- Initial conditions for the filter delays.  It is a vector
>           (or array of vectors for an N-dimensional input) of length
>          max(len(a),len(b)). If zi=None or is not given then initial
>          rest is assumed. If axis is None, zi should be a vector
>          of length K = max(M,N), where M=len(b)-1 and N=len(a)-1. If
>          an axis is not None, zi should either be a vector of length
>          K, or an array with same shape as x, except for zi.shape[axis]
>          which should be K. If zi is a vector, the same initial
>          conditions are applied to each vector along the specified
>          axis. Default: zi=None (initial rest).
>     direction -- Filtered in the reverse direction if -1. (*Default* = 1)
>    inplace -- If possible, modification to x is done implace.
> (*Default* = -1)
>
>  Outputs: (y, {zf})
>
>    y -- The output of the digital filter.
>    zf -- If zi is None, this is not returned, otherwise, zf holds the
>           final filter delay values.
>
>  Algorithm:
>
>    The filter function is implemented as a direct II transposed structure.
>    This means that the filter implements
>
>    a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[nb]*x[n-nb]
>                          - a[1]*y[n-1] - ... - a[na]*y[n-na]
>
>    using the following difference equations:
>
>    y[m] = b[0]*x[m] + z[0,m-1]
>    z[0,m] = b[1]*x[m] + z[1,m-1] - a[1]*y[m]
>    ...
>    z[n-3,m] = b[n-2]*x[m] + z[n-2,m-1] - a[n-2]*y[m]
>    z[n-2,m] = b[n-1]*x[m] - a[n-1]*y[m]
>
>    where m is the output sample number and n=max(len(a),len(b)) is the
>    model order.
>
>    The rational transfer function describing this filter in the
>    z-transform domain is
>                                -1               -nb
>                    b[0] + b[1]z  + ... + b[nb] z
>            Y(z) = ---------------------------------- X(z)
>                                -1               -na
>                    a[0] + a[1]z  + ... + a[na] z
>
>    """
>     if isscalar(a):
>        a = [a]
>
>    if axis < 0: axis = None
>    if inplace < 0: inplace = None
>
>    return _lfilter(b, a, x, axis=axis, zi=zi,
>             inplace=inplace, direction=direction)
>
>
>
> Regards,
> S.M.
>
>
>
>
> _______________________________________________
> Scipy-dev mailing list
> Scipy-dev at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20090922/04b6e1f5/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: lfilterdoc_new.py
Type: application/octet-stream
Size: 2670 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20090922/04b6e1f5/attachment.obj>


More information about the SciPy-Dev mailing list