Home Information Classes Download Usage Mail List Requirements Links FAQ Tutorial
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. |