mirror of
https://github.com/thestk/stk
synced 2026-04-23 23:58:38 +00:00
Version 4.4.3
This commit is contained in:
committed by
Stephen Sinclair
parent
baca57040b
commit
0aec39260a
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "Stk.h"
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
|
||||
namespace stk {
|
||||
|
||||
@@ -14,7 +15,7 @@ namespace stk {
|
||||
filter subclasses. It is general enough to support both
|
||||
monophonic and polyphonic input/output classes.
|
||||
|
||||
by Perry R. Cook and Gary P. Scavone, 1995 - 2010.
|
||||
by Perry R. Cook and Gary P. Scavone, 1995-2011.
|
||||
*/
|
||||
/***************************************************/
|
||||
|
||||
@@ -43,6 +44,14 @@ public:
|
||||
//! Return the current filter gain.
|
||||
StkFloat getGain( void ) const { return gain_; };
|
||||
|
||||
//! Return the filter phase delay at the specified frequency.
|
||||
/*!
|
||||
Note that the phase delay calculation accounts for the filter
|
||||
gain. The frequency value should be greater than 0.0 and less
|
||||
than or equal to one-half the sample rate.
|
||||
*/
|
||||
StkFloat phaseDelay( StkFloat frequency );
|
||||
|
||||
//! Return an StkFrames reference to the last output sample frame.
|
||||
const StkFrames& lastFrame( void ) const { return lastFrame_; };
|
||||
|
||||
@@ -59,10 +68,10 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
StkFloat gain_;
|
||||
unsigned int channelsIn_;
|
||||
StkFrames lastFrame_;
|
||||
|
||||
StkFloat gain_;
|
||||
std::vector<StkFloat> b_;
|
||||
std::vector<StkFloat> a_;
|
||||
StkFrames outputs_;
|
||||
@@ -81,6 +90,35 @@ inline void Filter :: clear( void )
|
||||
lastFrame_[i] = 0.0;
|
||||
}
|
||||
|
||||
inline StkFloat Filter :: phaseDelay( StkFloat frequency )
|
||||
{
|
||||
if ( frequency <= 0.0 || frequency > 0.5 * Stk::sampleRate() ) {
|
||||
oStream_ << "Filter::phaseDelay: argument (" << frequency << ") is out of range!";
|
||||
handleError( StkError::WARNING ); return 0.0;
|
||||
}
|
||||
|
||||
StkFloat omegaT = 2 * M_PI * frequency / Stk::sampleRate();
|
||||
StkFloat real = 0.0, imag = 0.0;
|
||||
for ( unsigned int i=0; i<b_.size(); i++ ) {
|
||||
real += b_[i] * std::cos( i * omegaT );
|
||||
imag -= b_[i] * std::sin( i * omegaT );
|
||||
}
|
||||
real *= gain_;
|
||||
imag *= gain_;
|
||||
|
||||
StkFloat phase = atan2( imag, real );
|
||||
|
||||
real = 0.0, imag = 0.0;
|
||||
for ( unsigned int i=0; i<a_.size(); i++ ) {
|
||||
real += a_[i] * std::cos( i * omegaT );
|
||||
imag -= a_[i] * std::sin( i * omegaT );
|
||||
}
|
||||
|
||||
phase -= std::atan2( imag, real );
|
||||
phase = std::fmod( -phase, 2 * M_PI );
|
||||
return phase / omegaT;
|
||||
}
|
||||
|
||||
} // stk namespace
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user