basic_filters: further optimization

Use qBound in formant, and return early from calcFilterCoeffs so we don't do needless calculations
This commit is contained in:
Vesa
2014-06-26 12:41:35 +03:00
parent d166212d49
commit d6809b45c1

View File

@@ -26,8 +26,8 @@
*/
#ifndef _BASIC_FILTERS_H
#define _BASIC_FILTERS_H
#ifndef BASIC_FILTERS_H
#define BASIC_FILTERS_H
#ifndef __USE_XOPEN
#define __USE_XOPEN
@@ -327,20 +327,16 @@ public:
{
// first formant
in = _in0 + m_vfbp[0][_chnl] * m_vfq;
in = (in > +1.f) ? +1.f : in;
in = (in < -1.f) ? -1.f : in;
in = qBound( -1.0f, in, 1.0f );
lp = in * m_vfb[0] + m_vflp[0][_chnl] * m_vfa[0];
lp = (lp > +1.f) ? +1.f : lp;
lp = (lp < -1.f) ? -1.f : lp;
lp = qBound( -1.0f, lp, 1.0f );
hp = m_vfc[0] * ( m_vfhp[0][_chnl] + in - m_vflast[0][_chnl] );
hp = (hp > +1.f) ? +1.f : hp;
hp = (hp < -1.f) ? -1.f : hp;
hp = qBound( -1.0f, hp, 1.0f );
bp = hp * m_vfb[0] + m_vfbp[0][_chnl] * m_vfa[0];
bp = (bp > +1.f) ? +1.f : bp;
bp = (bp < -1.f) ? -1.f : bp;
bp = qBound( -1.0f, bp, 1.0f );
m_vflast[0][_chnl] = in;
m_vflp[0][_chnl] = lp;
@@ -348,20 +344,16 @@ public:
m_vfbp[0][_chnl] = bp;
in = bp + m_vfbp[2][_chnl] * m_vfq;
in = (in > +1.f) ? +1.f : in;
in = (in < -1.f) ? -1.f : in;
in = qBound( -1.0f, in, 1.0f );
lp = in * m_vfb[0] + m_vflp[2][_chnl] * m_vfa[0];
lp = (lp > +1.f) ? +1.f : lp;
lp = (lp < -1.f) ? -1.f : lp;
lp = qBound( -1.0f, lp, 1.0f );
hp = m_vfc[0] * ( m_vfhp[2][_chnl] + in - m_vflast[2][_chnl] );
hp = (hp > +1.f) ? +1.f : hp;
hp = (hp < -1.f) ? -1.f : hp;
hp = qBound( -1.0f, hp, 1.0f );
bp = hp * m_vfb[0] + m_vfbp[2][_chnl] * m_vfa[0];
bp = (bp > +1.f) ? +1.f : bp;
bp = (bp < -1.f) ? -1.f : bp;
bp = qBound( -1.0f, bp, 1.0f );
m_vflast[2][_chnl] = in;
m_vflp[2][_chnl] = lp;
@@ -369,20 +361,16 @@ public:
m_vfbp[2][_chnl] = bp;
in = bp + m_vfbp[4][_chnl] * m_vfq;
in = (in > +1.f) ? +1.f : in;
in = (in < -1.f) ? -1.f : in;
in = qBound( -1.0f, in, 1.0f );
lp = in * m_vfb[0] + m_vflp[4][_chnl] * m_vfa[0];
lp = (lp > +1.f) ? +1.f : lp;
lp = (lp < -1.f) ? -1.f : lp;
lp = qBound( -1.0f, lp, 1.0f );
hp = m_vfc[0] * ( m_vfhp[4][_chnl] + in - m_vflast[4][_chnl] );
hp = (hp > +1.f) ? +1.f : hp;
hp = (hp < -1.f) ? -1.f : hp;
hp = qBound( -1.0f, hp, 1.0f );
bp = hp * m_vfb[0] + m_vfbp[4][_chnl] * m_vfa[0];
bp = (bp > +1.f) ? +1.f : bp;
bp = (bp < -1.f) ? -1.f : bp;
bp = qBound( -1.0f, bp, 1.0f );
m_vflast[4][_chnl] = in;
m_vflp[4][_chnl] = lp;
@@ -393,20 +381,16 @@ public:
// second formant
in = _in0 + m_vfbp[0][_chnl] * m_vfq;
in = (in > +1.f) ? +1.f : in;
in = (in < -1.f) ? -1.f : in;
in = qBound( -1.0f, in, 1.0f );
lp = in * m_vfb[1] + m_vflp[1][_chnl] * m_vfa[1];
lp = (lp > +1.f) ? +1.f : lp;
lp = (lp < -1.f) ? -1.f : lp;
lp = qBound( -1.0f, lp, 1.0f );
hp = m_vfc[1] * ( m_vfhp[1][_chnl] + in - m_vflast[1][_chnl] );
hp = (hp > +1.f) ? +1.f : hp;
hp = (hp < -1.f) ? -1.f : hp;
hp = qBound( -1.0f, hp, 1.0f );
bp = hp * m_vfb[1] + m_vfbp[1][_chnl] * m_vfa[1];
bp = (bp > +1.f) ? +1.f : bp;
bp = (bp < -1.f) ? -1.f : bp;
bp = qBound( -1.0f, bp, 1.0f );
m_vflast[1][_chnl] = in;
m_vflp[1][_chnl] = lp;
@@ -414,20 +398,16 @@ public:
m_vfbp[1][_chnl] = bp;
in = bp + m_vfbp[3][_chnl] * m_vfq;
in = (in > +1.f) ? +1.f : in;
in = (in < -1.f) ? -1.f : in;
in = qBound( -1.0f, in, 1.0f );
lp = in * m_vfb[1] + m_vflp[3][_chnl] * m_vfa[1];
lp = (lp > +1.f) ? +1.f : lp;
lp = (lp < -1.f) ? -1.f : lp;
lp = qBound( -1.0f, lp, 1.0f );
hp = m_vfc[1] * ( m_vfhp[3][_chnl] + in - m_vflast[3][_chnl] );
hp = (hp > +1.f) ? +1.f : hp;
hp = (hp < -1.f) ? -1.f : hp;
hp = qBound( -1.0f, hp, 1.0f );
bp = hp * m_vfb[1] + m_vfbp[3][_chnl] * m_vfa[1];
bp = (bp > +1.f) ? +1.f : bp;
bp = (bp < -1.f) ? -1.f : bp;
bp = qBound( -1.0f, bp, 1.0f );
m_vflast[3][_chnl] = in;
m_vflp[3][_chnl] = lp;
@@ -435,20 +415,16 @@ public:
m_vfbp[3][_chnl] = bp;
in = bp + m_vfbp[5][_chnl] * m_vfq;
in = (in > +1.f) ? +1.f : in;
in = (in < -1.f) ? -1.f : in;
in = qBound( -1.0f, in, 1.0f );
lp = in * m_vfb[1] + m_vflp[5][_chnl] * m_vfa[1];
lp = (lp > +1.f) ? +1.f : lp;
lp = (lp < -1.f) ? -1.f : lp;
lp = qBound( -1.0f, lp, 1.0f );
hp = m_vfc[1] * ( m_vfhp[5][_chnl] + in - m_vflast[5][_chnl] );
hp = (hp > +1.f) ? +1.f : hp;
hp = (hp < -1.f) ? -1.f : hp;
hp = qBound( -1.0f, hp, 1.0f );
bp = hp * m_vfb[1] + m_vfbp[5][_chnl] * m_vfa[1];
bp = (bp > +1.f) ? +1.f : bp;
bp = (bp < -1.f) ? -1.f : bp;
bp = qBound( -1.0f, bp, 1.0f );
m_vflast[5][_chnl] = in;
m_vflp[5][_chnl] = lp;
@@ -493,9 +469,6 @@ public:
/*, const bool _q_is_bandwidth = false*/ )
{
// temp coef vars
_freq = qBound(minFreq(), _freq, 20000.0f); // limit freq and q for not getting
// bad noise out of the filter...
_q = qMax( _q, minQ() );
if( m_type == Lowpass_RC12 ||
@@ -505,10 +478,7 @@ public:
m_type == Bandpass_RC24 ||
m_type == Highpass_RC24 )
{
if( _freq < 50.f )
{
_freq = 50.f;
}
_freq = qBound( 50.0f, _freq, 20000.0f );
m_rca = 1.0f - (1.0f/(m_sampleRate*4)) / ( (1.0f/(_freq*2.0f*M_PI)) + (1.0f/(m_sampleRate*4)) );
m_rcb = 1.0f - m_rca;
@@ -516,12 +486,15 @@ public:
// Stretch Q/resonance, as self-oscillation reliably starts at a q of ~2.5 - ~2.6
m_rcq = _q/4.f;
return;
}
if( m_type == Formantfilter )
{
_freq = qBound( minFreq(), _freq, 20000.0f ); // limit freq and q for not getting bad noise out of the filter...
// formats for a, e, i, o, u, a
const float _f[5][2] = { { 1000, 1400 }, { 500, 2300 },
static const float _f[5][2] = { { 1000, 1400 }, { 500, 2300 },
{ 320, 3200 },
{ 500, 1000 },
{ 320, 800 } };
@@ -556,10 +529,13 @@ public:
m_vfc[1] = (1.0f/(f1*2.0f*M_PI)) /
( (1.0f/(f1*2.0f*M_PI)) +
(1.0f/(m_sampleRate*4)) );
return;
}
if( m_type == Moog )
{
_freq = qBound( minFreq(), _freq, 20000.0f );
// [ 0 - 0.5 ]
const float f = _freq / m_sampleRate;
// (Empirical tunning)
@@ -577,6 +553,7 @@ public:
}
// other filters
_freq = qBound( minFreq(), _freq, 20000.0f );
const float omega = F_2PI * _freq / m_sampleRate;
const float tsin = sinf( omega );
const float tcos = cosf( omega );