Ignore:
Timestamp:
10/17/12 15:42:12 (12 years ago)
Author:
neise
Message:
new class FastSlidingAverage with Weave! 50Hz .. yeah
File:
1 edited

Legend:

Unmodified
Added
Removed
  • fact/tools/pyscripts/pyfact/fir_filter.py

    r13330 r14486  
    77from scipy import signal
    88
     9# For FastSlidingAverage
     10from scipy import weave
     11from scipy.weave import converters
    912
    1013class FirFilter(object):
     
    8790            a[0] = len(b)
    8891        FirFilter.__init__(self, b, a, 'sliding average')
    89            
     92
     93
     94
     95
     96class FastSlidingAverage( object ):
     97        def __init__(self, shape, length=8):
     98            """ initialize the object
     99                length:  lenght of the averaging window
     100            """
     101            self.length = length
     102            # allocate memory for the filtered data once
     103            self.filtered = np.zeros( shape, np.float64 )
     104            self.shape = shape
     105
     106        def __call__(self, data):
     107            if self.shape != data.shape:
     108                raise TypeException('data has wrong shape')
     109
     110            length = self.length
     111            numpix = data.shape[0]
     112            numslices = data.shape[1]
     113
     114            filtered = self.filtered
     115            cppcode = """
     116                double sum = 0;
     117                for (int pix=0; pix<numpix; pix++)
     118                {
     119                    for ( int sl=0; sl<numslices-length; ++sl)
     120                    {
     121                        for ( int i=0; i<length; ++i)
     122                        {
     123                            sum += data(pix,sl+i);
     124                        }
     125                        filtered(pix,sl) = sum/length;
     126                    }
     127                }
     128            """
     129
     130            ## this seems to run a little bit faster.
     131
     132            cppcode2 = """
     133                double sum = 0;
     134                for (int pix=0; pix<numpix; pix++)
     135                {
     136                    sum = 0;
     137                    for ( int i=0; i<length-1; ++i)
     138                    {
     139                        sum += data(pix,i);
     140                    }
     141                    for ( int sl=length-1; sl<numslices-length; ++sl)
     142                    {
     143                        sum += data(pix,sl);
     144                        filtered(pix,sl) = sum/length;
     145                        sum -= data(pix,sl-(length-1) );
     146                    }
     147                }
     148            """
     149
     150            weave.inline( cppcode2,
     151                    [ 'length' , 'numpix', 'numslices', 'data', 'filtered'],
     152                    type_converters=converters.blitz)
     153
     154            return filtered
    90155
    91156class CFD(FirFilter):
Note: See TracChangeset for help on using the changeset viewer.