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
00029 _reset( f->xv );
00030 _reset( f->yv );
00031
00032 if( f->IsFIR ) {
00033
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
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
00055 for ( k=0; k < f->nxc; k++ ) f->yv[f->nyc-1] += ( f->xc[k] * f->xv[k] );
00056
00057
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
00067 for(i=0;i<f->ns;i++) wf[i] = f->wfbuffer[i];
00068
00069 return BPM_SUCCESS;
00070 }