bpmdsp/apply_filter.c

00001 #include "bpm/bpm_dsp.h"
00002 
00003 
00004 void _shift_down( double *x, int n ) {
00005   int k=0;
00006   for( k=0; k<n-1; k++ ) x[k] = x[k+1];
00007   return;
00008 }
00009 
00010 // -------------------------------------------------------------------
00011 
00012 void _reset( double *x ) {
00013   int i = 0;
00014   for( i=0;i<=MAXPZ;i++) x[i] = 0.;
00015 }
00016 
00017 // -------------------------------------------------------------------
00018 
00019 int apply_filter( filter_t *f, double *wf ) {
00020 
00021   int i = 0, k = 0;
00022 
00023   if ( ! f || ! wf ) {
00024     bpm_error( "Invalid pointers in apply_filter()", __FILE__, __LINE__ );
00025     return BPM_FAILURE;
00026   }
00027 
00028   // reset the buffers
00029   _reset( f->xv );
00030   _reset( f->yv );
00031 
00032   if( f->IsFIR ) {
00033     // apply filter for Finite Impulse response
00034     
00035     for ( i=0; i<f->ns; i++ ) {
00036       _shift_down( f->xv, f->nxc );
00037       f->xv[f->nxc-1] = wf[i] / f->gain;
00038       f->wfbuffer[i] = 0.;
00039       for( k=0; k<f->nxc; k++ ) f->wfbuffer[i] += ( f->xc[k] * f->xv[k] ); 
00040     }
00041 
00042 
00043   } else {
00044     // apply filter for Infinite Impulse response
00045     
00046     for ( i=0; i<f->ns; i++ ) {
00047 
00048       _shift_down( f->xv, f->nxc );
00049       f->xv[f->nxc-1] = wf[i] / f->gain;
00050 
00051       _shift_down( f->yv, f->nyc );
00052       f->yv[f->nyc-1] = 0.;
00053       
00054       // the x contrib
00055       for ( k=0; k < f->nxc;   k++ ) f->yv[f->nyc-1] += ( f->xc[k] * f->xv[k] );
00056 
00057       // the y contrib
00058       for ( k=0; k < f->nyc-1; k++ ) f->yv[f->nyc-1] += ( f->yc[k] * f->yv[k] );
00059 
00060       f->wfbuffer[i] = f->yv[f->nyc-1];
00061     }
00062 
00063 
00064   }
00065 
00066   // copy buffer to input waveform
00067   for(i=0;i<f->ns;i++) wf[i] = f->wfbuffer[i];
00068 
00069   return BPM_SUCCESS;
00070 }

Generated on Fri Nov 9 21:17:10 2007 for libbpm by  doxygen 1.5.1