Home   Information   Classes   Download   Usage   Mail List   Requirements   Links   FAQ   Tutorial


Fir.h

00001 #ifndef STK_FIR_H
00002 #define STK_FIR_H
00003 
00004 #include "Filter.h"
00005 
00006 namespace stk {
00007 
00008 /***************************************************/
00028 /***************************************************/
00029 
00030 class Fir : public Filter
00031 {
00032 public:
00034   Fir( void );
00035 
00037 
00041   Fir( std::vector<StkFloat> &coefficients );
00042 
00044   ~Fir( void );
00045 
00047 
00052   void setCoefficients( std::vector<StkFloat> &coefficients, bool clearState = false );
00053 
00055   StkFloat lastOut( void ) const { return lastFrame_[0]; };
00056 
00058   StkFloat tick( StkFloat input );
00059 
00061 
00069   StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
00070 
00072 
00080   StkFrames& tick( StkFrames& iFrames, StkFrames &oFrames, unsigned int iChannel = 0, unsigned int oChannel = 0 );
00081 
00082 protected:
00083 
00084 };
00085 
00086 inline StkFloat Fir :: tick( StkFloat input )
00087 {
00088   lastFrame_[0] = 0.0;
00089   inputs_[0] = gain_ * input;
00090 
00091   for ( unsigned int i=b_.size()-1; i>0; i-- ) {
00092     lastFrame_[0] += b_[i] * inputs_[i];
00093     inputs_[i] = inputs_[i-1];
00094   }
00095   lastFrame_[0] += b_[0] * inputs_[0];
00096 
00097   return lastFrame_[0];
00098 }
00099 
00100 inline StkFrames& Fir :: tick( StkFrames& frames, unsigned int channel )
00101 {
00102 #if defined(_STK_DEBUG_)
00103   if ( channel >= frames.channels() ) {
00104     errorString_ << "Fir::tick(): channel and StkFrames arguments are incompatible!";
00105     handleError( StkError::FUNCTION_ARGUMENT );
00106   }
00107 #endif
00108 
00109   StkFloat *samples = &frames[channel];
00110   unsigned int i, hop = frames.channels();
00111   for ( unsigned int j=0; j<frames.frames(); j++, samples += hop ) {
00112     inputs_[0] = gain_ * *samples;
00113     *samples = 0.0;
00114 
00115     for ( i=b_.size()-1; i>0; i-- ) {
00116       *samples += b_[i] * inputs_[i];
00117       inputs_[i] = inputs_[i-1];
00118     }
00119     *samples += b_[0] * inputs_[0];
00120   }
00121 
00122   lastFrame_[0] = *(samples-hop);
00123   return frames;
00124 }
00125 
00126 inline StkFrames& Fir :: tick( StkFrames& iFrames, StkFrames& oFrames, unsigned int iChannel, unsigned int oChannel )
00127 {
00128 #if defined(_STK_DEBUG_)
00129   if ( iChannel >= iFrames.channels() || oChannel >= oFrames.channels() ) {
00130     errorString_ << "Fir::tick(): channel and StkFrames arguments are incompatible!";
00131     handleError( StkError::FUNCTION_ARGUMENT );
00132   }
00133 #endif
00134 
00135   StkFloat *iSamples = &iFrames[iChannel];
00136   StkFloat *oSamples = &oFrames[oChannel];
00137   unsigned int i, iHop = iFrames.channels(), oHop = oFrames.channels();
00138   for ( unsigned int j=0; j<iFrames.frames(); j++, iSamples += iHop, oSamples += oHop ) {
00139     inputs_[0] = gain_ * *iSamples;
00140     *oSamples = 0.0;
00141 
00142     for ( i=b_.size()-1; i>0; i-- ) {
00143       *oSamples += b_[i] * inputs_[i];
00144       inputs_[i] = inputs_[i-1];
00145     }
00146     *oSamples += b_[0] * inputs_[0];
00147   }
00148 
00149   lastFrame_[0] = *(oSamples-oHop);
00150   return iFrames;
00151 }
00152 
00153 } // stk namespace
00154 
00155 #endif

The Synthesis ToolKit in C++ (STK)
©1995-2010 Perry R. Cook and Gary P. Scavone. All Rights Reserved.