mirror of
https://github.com/thestk/stk
synced 2026-04-23 23:58:38 +00:00
Version 4.4.0
This commit is contained in:
committed by
Stephen Sinclair
parent
d199342e86
commit
eccd8c9981
138
include/Filter.h
138
include/Filter.h
@@ -1,122 +1,86 @@
|
||||
/***************************************************/
|
||||
/*! \class Filter
|
||||
\brief STK filter class.
|
||||
|
||||
This class implements a generic structure that
|
||||
can be used to create a wide range of filters.
|
||||
It can function independently or be subclassed
|
||||
to provide more specific controls based on a
|
||||
particular filter type.
|
||||
|
||||
In particular, this class implements the standard
|
||||
difference equation:
|
||||
|
||||
a[0]*y[n] = b[0]*x[n] + ... + b[nb]*x[n-nb] -
|
||||
a[1]*y[n-1] - ... - a[na]*y[n-na]
|
||||
|
||||
If a[0] is not equal to 1, the filter coeffcients
|
||||
are normalized by a[0].
|
||||
|
||||
The \e gain parameter is applied at the filter
|
||||
input and does not affect the coefficient values.
|
||||
The default gain value is 1.0. This structure
|
||||
results in one extra multiply per computed sample,
|
||||
but allows easy control of the overall filter gain.
|
||||
|
||||
by Perry R. Cook and Gary P. Scavone, 1995 - 2007.
|
||||
*/
|
||||
/***************************************************/
|
||||
|
||||
#ifndef STK_FILTER_H
|
||||
#define STK_FILTER_H
|
||||
|
||||
#include "Stk.h"
|
||||
#include <vector>
|
||||
|
||||
namespace stk {
|
||||
|
||||
/***************************************************/
|
||||
/*! \class Filter
|
||||
\brief STK abstract filter class.
|
||||
|
||||
This class provides limited common functionality for STK digital
|
||||
filter subclasses. It is general enough to support both
|
||||
monophonic and polyphonic input/output classes.
|
||||
|
||||
by Perry R. Cook and Gary P. Scavone, 1995 - 2009.
|
||||
*/
|
||||
/***************************************************/
|
||||
|
||||
class Filter : public Stk
|
||||
{
|
||||
public:
|
||||
//! Default constructor creates a zero-order pass-through "filter".
|
||||
Filter(void);
|
||||
//! Class constructor.
|
||||
Filter( void ) { gain_ = 1.0; channelsIn_ = 1; lastFrame_.resize( 1, 1, 0.0 ); };
|
||||
|
||||
//! Overloaded constructor which takes filter coefficients.
|
||||
/*!
|
||||
An StkError can be thrown if either of the coefficient vector
|
||||
sizes is zero, or if the a[0] coefficient is equal to zero.
|
||||
*/
|
||||
Filter( std::vector<StkFloat> &bCoefficients, std::vector<StkFloat> &aCoefficients );
|
||||
//! Return the number of input channels for the class.
|
||||
unsigned int channelsIn( void ) const { return channelsIn_; };
|
||||
|
||||
//! Class destructor.
|
||||
virtual ~Filter(void);
|
||||
//! Return the number of output channels for the class.
|
||||
unsigned int channelsOut( void ) const { return lastFrame_.channels(); };
|
||||
|
||||
//! Sets all internal states of the filter to zero.
|
||||
void clear(void);
|
||||
|
||||
//! Set filter coefficients.
|
||||
/*!
|
||||
An StkError can be thrown if either of the coefficient vector
|
||||
sizes is zero, or if the a[0] coefficient is equal to zero. If
|
||||
a[0] is not equal to 1, the filter coeffcients are normalized by
|
||||
a[0]. The internal state of the filter is not cleared unless the
|
||||
\e clearState flag is \c true.
|
||||
*/
|
||||
void setCoefficients( std::vector<StkFloat> &bCoefficients, std::vector<StkFloat> &aCoefficients, bool clearState = false );
|
||||
|
||||
//! Set numerator coefficients.
|
||||
/*!
|
||||
An StkError can be thrown if coefficient vector is empty. Any
|
||||
previously set denominator coefficients are left unaffected. Note
|
||||
that the default constructor sets the single denominator
|
||||
coefficient a[0] to 1.0. The internal state of the filter is not
|
||||
cleared unless the \e clearState flag is \c true.
|
||||
*/
|
||||
void setNumerator( std::vector<StkFloat> &bCoefficients, bool clearState = false );
|
||||
|
||||
//! Set denominator coefficients.
|
||||
/*!
|
||||
An StkError can be thrown if the coefficient vector is empty or
|
||||
if the a[0] coefficient is equal to zero. Previously set
|
||||
numerator coefficients are unaffected unless a[0] is not equal to
|
||||
1, in which case all coeffcients are normalized by a[0]. Note
|
||||
that the default constructor sets the single numerator coefficient
|
||||
b[0] to 1.0. The internal state of the filter is not cleared
|
||||
unless the \e clearState flag is \c true.
|
||||
*/
|
||||
void setDenominator( std::vector<StkFloat> &aCoefficients, bool clearState = false );
|
||||
//! Clears all internal states of the filter.
|
||||
virtual void clear( void );
|
||||
|
||||
//! Set the filter gain.
|
||||
/*!
|
||||
The gain is applied at the filter input and does not affect the
|
||||
coefficient values. The default gain value is 1.0.
|
||||
*/
|
||||
virtual void setGain(StkFloat gain);
|
||||
void setGain( StkFloat gain ) { gain_ = gain; };
|
||||
|
||||
//! Return the current filter gain.
|
||||
virtual StkFloat getGain(void) const;
|
||||
StkFloat getGain( void ) const { return gain_; };
|
||||
|
||||
//! Return the last computed output value.
|
||||
virtual StkFloat lastOut(void) const;
|
||||
|
||||
//! Input one sample to the filter and return one output.
|
||||
virtual StkFloat tick( StkFloat input );
|
||||
//! Return an StkFrames reference to the last output sample frame.
|
||||
const StkFrames& lastFrame( void ) const { return lastFrame_; };
|
||||
|
||||
//! Take a channel of the StkFrames object as inputs to the filter and replace with corresponding outputs.
|
||||
/*!
|
||||
The \c channel argument should be zero or greater (the first
|
||||
channel is specified by 0). An StkError will be thrown if the \c
|
||||
channel argument is equal to or greater than the number of
|
||||
channels in the StkFrames object.
|
||||
The StkFrames argument reference is returned. The \c channel
|
||||
argument must be less than the number of channels in the
|
||||
StkFrames argument (the first channel is specified by 0).
|
||||
However, range checking is only performed if _STK_DEBUG_ is
|
||||
defined during compilation, in which case an out-of-range value
|
||||
will trigger an StkError exception.
|
||||
*/
|
||||
virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 );
|
||||
virtual StkFrames& tick( StkFrames& frames, unsigned int channel = 0 ) = 0;
|
||||
|
||||
protected:
|
||||
|
||||
unsigned int channelsIn_;
|
||||
StkFrames lastFrame_;
|
||||
|
||||
StkFloat gain_;
|
||||
std::vector<StkFloat> b_;
|
||||
std::vector<StkFloat> a_;
|
||||
std::vector<StkFloat> outputs_;
|
||||
std::vector<StkFloat> inputs_;
|
||||
StkFrames outputs_;
|
||||
StkFrames inputs_;
|
||||
|
||||
};
|
||||
|
||||
inline void Filter :: clear( void )
|
||||
{
|
||||
unsigned int i;
|
||||
for ( i=0; i<inputs_.size(); i++ )
|
||||
inputs_[i] = 0.0;
|
||||
for ( i=0; i<outputs_.size(); i++ )
|
||||
outputs_[i] = 0.0;
|
||||
for ( i=0; i<lastFrame_.size(); i++ )
|
||||
lastFrame_[i] = 0.0;
|
||||
}
|
||||
|
||||
} // stk namespace
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user