31#ifndef LMMS_BASIC_FILTERS_H
32#define LMMS_BASIC_FILTERS_H
46template<ch_cnt_t CHANNELS=DEFAULT_CHANNELS>
class BasicFilters;
48template<ch_cnt_t CHANNELS>
61 for(
int i = 0;
i < CHANNELS; ++
i )
74 using namespace std::numbers;
76 const double wc = 2 *
pi *
freq;
77 const double wc2 = wc * wc;
78 const double wc3 = wc2 * wc;
83 const double k2 =
k *
k;
84 const double k3 = k2 *
k;
88 const double sq_tmp1 = sqrt2 * wc3 *
k;
89 const double sq_tmp2 = sqrt2 * wc * k3;
91 m_a = 1.0 / ( 4.0 * wc2 * k2 + 2.0 * sq_tmp1 +
m_k4 + 2.0 * sq_tmp2 +
m_wc4 );
97 m_b4 = (
m_k4 - 2.0 * sq_tmp1 +
m_wc4 - 2.0 * sq_tmp2 + 4.0 * wc2 * k2 ) *
m_a;
137 using frame = std::array<double, CHANNELS>;
142template<ch_cnt_t CHANNELS>
157 inline void setCoeffs(
float a1,
float a2,
float b0,
float b1,
float b2 )
167 for(
int i = 0;
i < CHANNELS; ++
i )
189template<ch_cnt_t CHANNELS>
197 for(
int i = 0;
i < CHANNELS; ++
i )
222template<ch_cnt_t CHANNELS>
305 for(
ch_cnt_t _chnl = 0; _chnl < CHANNELS; ++_chnl )
319 for(
int i=0;
i<6;
i++)
369 m_y4[_chnl] * ( 1.0f / 6.0f );
378 for(
int i = 0;
i < 4; ++
i )
412 for(
int i = 0;
i < 2; ++
i )
432 for(
int i = 0;
i < 2; ++
i )
445 for(
int i = 0;
i < 2; ++
i )
469 for(
int n = 4;
n != 0; --
n )
472 in = std::clamp(
in, -1.0f, 1.0f);
475 lp = std::clamp(lp, -1.0f, 1.0f);
478 hp = std::clamp(hp, -1.0f, 1.0f);
481 bp = std::clamp(bp, -1.0f, 1.0f);
494 for(
int n = 4;
n != 0; --
n )
497 in = std::clamp(
in, -1.0f, 1.0f);
500 hp = std::clamp(hp, -1.0f, 1.0f);
503 bp = std::clamp(bp, -1.0f, 1.0f);
515 for(
int n = 4;
n != 0; --
n )
519 in = std::clamp(
in, -1.0f, 1.0f);
522 lp = std::clamp(lp, -1.0f, 1.0f);
525 hp = std::clamp(hp, -1.0f, 1.0f);
528 bp = std::clamp(bp, -1.0f, 1.0f);
537 in = std::clamp(
in, -1.0f, 1.0f );
540 lp = std::clamp(lp, -1.0f, 1.0f);
543 hp = std::clamp(hp, -1.0f, 1.0f);
546 bp = std::clamp(bp, -1.0f, 1.0f);
559 for(
int n = 4;
n != 0; --
n )
563 in = std::clamp(
in, -1.0f, 1.0f);
566 hp = std::clamp(hp, -1.0f, 1.0f);
569 bp = std::clamp(bp, -1.0f, 1.0f);
580 in = std::clamp(
in, -1.0f, 1.0f);
583 hp = std::clamp(hp, -1.0f, 1.0f);
586 bp = std::clamp(bp, -1.0f, 1.0f);
601 for(
int o = 0; o <
os; ++o )
605 in = std::clamp(
in, -1.0f, 1.0f);
608 hp = std::clamp(hp, -1.0f, 1.0f);
611 bp = std::clamp(bp, -1.0f, 1.0f);
618 in = std::clamp(
in, -1.0f, 1.0f);
621 hp = std::clamp(hp, -1.0f, 1.0f);
624 bp = std::clamp(bp, -1.0f, 1.0f);
631 in = std::clamp(
in, -1.0f, 1.0f);
634 hp = std::clamp(hp, -1.0f, 1.0f);
637 bp = std::clamp(bp, -1.0f, 1.0f);
647 in = std::clamp(
in, -1.0f, 1.0f);
650 hp = std::clamp(hp, -1.0f, 1.0f);
653 bp = std::clamp(bp, -1.0f, 1.0f);
660 in = std::clamp(
in, -1.0f, 1.0f);
663 hp = std::clamp(hp, -1.0f, 1.0f);
666 bp = std::clamp(bp, -1.0f, 1.0f);
673 in = std::clamp(
in, -1.0f, 1.0f);
676 hp = std::clamp(hp, -1.0f, 1.0f);
679 bp = std::clamp(bp, -1.0f, 1.0f);
707 using namespace std::numbers;
709 _q = std::max(_q,
minQ());
718 _freq = std::clamp(_freq, 50.0f, 20000.0f);
720 const float f = 1.0f / (_freq * 2 * pi_v<float>);
722 m_rca = 1.0f - sr / (
f + sr );
734 _freq = std::clamp(_freq,
minFreq(), 20000.0f);
737 static const float _f[6][2] = { { 1000, 1400 }, { 500, 2300 },
742 static const float freqRatio = 4.0f / 14000.0f;
748 const float vowelf = _freq * freqRatio;
749 const int vowel =
static_cast<int>( vowelf );
750 const float fract = vowelf - vowel;
753 const float f0 = 1.f / (std::lerp(_f[vowel+0][0], _f[vowel+1][0], fract) * 2 * pi_v<float>);
754 const float f1 = 1.f / (std::lerp(_f[vowel+0][1], _f[vowel+1][1], fract) * 2 * pi_v<float>);
759 m_vfa[0] = 1.0f - sr / ( f0 + sr );
761 m_vfc[0] = f0 / ( f0 + sr );
762 m_vfa[1] = 1.0f - sr / ( f1 + sr );
764 m_vfc[1] = f1 / ( f1 + sr );
774 m_p = ( 3.6f - 3.2f *
f ) *
f;
776 m_r = _q * std::exp((1 -
m_p) * 1.386249f);
789 const float f = std::clamp(_freq, 20.0f, 20000.0f) *
m_sampleRatio * 0.25f;
791 m_p = ( 3.6f - 3.2f *
f ) *
f;
793 m_r = _q * 0.1f * std::exp((1 -
m_p) * 1.386249f);
805 m_svf2 = std::min(
f * 2.0f, 0.825f);
806 m_svq = std::max(0.0001f, 2.0f - (_q * 0.1995f));
811 _freq = std::clamp(_freq,
minFreq(), 20000.0f);
813 const float tsin = std::sin(omega) * 0.5f;
814 const float tcos = std::cos(omega);
816 const float alpha = tsin / _q;
818 const float a0 = 1.0f / ( 1.0f + alpha );
820 const float a1 = -2.0f * tcos * a0;
821 const float a2 = ( 1.0f - alpha ) * a0;
827 const float b1 = ( 1.0f - tcos ) * a0;
828 const float b0 = b1 * 0.5f;
829 m_biQuad.setCoeffs( a1, a2, b0, b1, b0 );
834 const float b1 = ( -1.0f - tcos ) * a0;
835 const float b0 = b1 * -0.5f;
836 m_biQuad.setCoeffs( a1, a2, b0, b1, b0 );
841 const float b0 = tsin * a0;
842 m_biQuad.setCoeffs( a1, a2, b0, 0.0f, -b0 );
847 const float b0 = alpha * a0;
848 m_biQuad.setCoeffs( a1, a2, b0, 0.0f, -b0 );
853 m_biQuad.setCoeffs( a1, a2, a0, a1, a0 );
858 m_biQuad.setCoeffs( a1, a2, a2, a1, 1.0f );
888 using frame = std::array<sample_t, CHANNELS>;
#define nullptr
Definition DistrhoDefines.h:75
Definition BasicFilters.h:224
BasicFilters< CHANNELS > * m_subFilter
Definition BasicFilters.h:910
frame m_delay1
Definition BasicFilters.h:903
void calcFilterCoeffs(float _freq, float _q)
Definition BasicFilters.h:705
void setFilterType(const FilterType _idx)
Definition BasicFilters.h:262
float m_vfq
Definition BasicFilters.h:883
frame m_oldy1
Definition BasicFilters.h:891
~BasicFilters()
Definition BasicFilters.h:294
frame m_rcbp1
Definition BasicFilters.h:897
float m_svf2
Definition BasicFilters.h:886
frame m_vfhp[6]
Definition BasicFilters.h:900
void setSampleRate(const sample_rate_t sampleRate)
Definition BasicFilters.h:330
frame m_y2
Definition BasicFilters.h:891
frame m_last
Definition BasicFilters.h:893
float m_r
Definition BasicFilters.h:877
float m_sampleRate
Definition BasicFilters.h:908
void clearHistory()
Definition BasicFilters.h:299
frame m_rchp1
Definition BasicFilters.h:897
static float minQ()
Definition BasicFilters.h:257
frame m_rcbp0
Definition BasicFilters.h:896
frame m_oldy2
Definition BasicFilters.h:891
bool m_doubleFilter
Definition BasicFilters.h:906
frame m_rchp0
Definition BasicFilters.h:896
float m_rca
Definition BasicFilters.h:880
float m_sampleRatio
Definition BasicFilters.h:909
float m_rcc
Definition BasicFilters.h:880
frame m_delay3
Definition BasicFilters.h:903
float m_vfc[4]
Definition BasicFilters.h:883
float m_p
Definition BasicFilters.h:877
frame m_rclp0
Definition BasicFilters.h:896
frame m_oldy3
Definition BasicFilters.h:891
BasicFilters(const sample_rate_t _sample_rate)
Definition BasicFilters.h:285
frame m_vflast[6]
Definition BasicFilters.h:900
frame m_rclast0
Definition BasicFilters.h:896
float m_rcq
Definition BasicFilters.h:880
float m_k
Definition BasicFilters.h:877
float m_svq
Definition BasicFilters.h:886
float m_svf1
Definition BasicFilters.h:886
sample_t update(sample_t _in0, ch_cnt_t _chnl)
Definition BasicFilters.h:340
FilterType m_type
Definition BasicFilters.h:905
float m_vfb[4]
Definition BasicFilters.h:883
frame m_oldx
Definition BasicFilters.h:891
float m_rcb
Definition BasicFilters.h:880
frame m_y4
Definition BasicFilters.h:891
BiQuad< CHANNELS > m_biQuad
Definition BasicFilters.h:874
frame m_vfbp[6]
Definition BasicFilters.h:900
frame m_rclp1
Definition BasicFilters.h:897
frame m_delay2
Definition BasicFilters.h:903
frame m_y3
Definition BasicFilters.h:891
float m_vfa[4]
Definition BasicFilters.h:883
static float minFreq()
Definition BasicFilters.h:252
frame m_delay4
Definition BasicFilters.h:903
std::array< sample_t, CHANNELS > frame
Definition BasicFilters.h:888
frame m_rclast1
Definition BasicFilters.h:897
FilterType
Definition BasicFilters.h:227
@ Bandpass_SV
Definition BasicFilters.h:245
@ Lowpass_RC12
Definition BasicFilters.h:236
@ AllPass
Definition BasicFilters.h:233
@ DoubleMoog
Definition BasicFilters.h:243
@ BandPass_CSG
Definition BasicFilters.h:230
@ Formantfilter
Definition BasicFilters.h:242
@ BandPass_CZPG
Definition BasicFilters.h:231
@ Moog
Definition BasicFilters.h:234
@ Highpass_RC24
Definition BasicFilters.h:241
@ FastFormant
Definition BasicFilters.h:248
@ Bandpass_RC24
Definition BasicFilters.h:240
@ LowPass
Definition BasicFilters.h:228
@ HiPass
Definition BasicFilters.h:229
@ Tripole
Definition BasicFilters.h:249
@ Notch
Definition BasicFilters.h:232
@ Highpass_SV
Definition BasicFilters.h:246
@ Notch_SV
Definition BasicFilters.h:247
@ Lowpass_SV
Definition BasicFilters.h:244
@ Bandpass_RC12
Definition BasicFilters.h:237
@ Lowpass_RC24
Definition BasicFilters.h:239
@ DoubleLowPass
Definition BasicFilters.h:235
@ Highpass_RC12
Definition BasicFilters.h:238
frame m_y1
Definition BasicFilters.h:891
Definition BasicFilters.h:144
float update(float in, ch_cnt_t ch)
Definition BasicFilters.h:173
float m_z2[CHANNELS]
Definition BasicFilters.h:183
void clearHistory()
Definition BasicFilters.h:165
float m_b2
Definition BasicFilters.h:182
float m_a1
Definition BasicFilters.h:182
float m_b1
Definition BasicFilters.h:182
float m_a2
Definition BasicFilters.h:182
float m_b0
Definition BasicFilters.h:182
float m_z1[CHANNELS]
Definition BasicFilters.h:183
BiQuad()
Definition BasicFilters.h:146
void setCoeffs(float a1, float a2, float b0, float b1, float b2)
Definition BasicFilters.h:157
virtual ~BiQuad()=default
Definition BasicFilters.h:50
void setHighpass(float freq)
Definition BasicFilters.h:108
void setCoeffs(float freq)
Definition BasicFilters.h:72
void setSampleRate(float sampleRate)
Definition BasicFilters.h:67
double m_a
Definition BasicFilters.h:134
frame m_z1
Definition BasicFilters.h:138
double m_b3
Definition BasicFilters.h:135
double m_a2
Definition BasicFilters.h:134
frame m_z2
Definition BasicFilters.h:138
void setLowpass(float freq)
Definition BasicFilters.h:100
virtual ~LinkwitzRiley()=default
double m_wc4
Definition BasicFilters.h:132
frame m_z4
Definition BasicFilters.h:138
double m_b4
Definition BasicFilters.h:135
float update(float in, ch_cnt_t ch)
Definition BasicFilters.h:116
double m_b1
Definition BasicFilters.h:135
std::array< double, CHANNELS > frame
Definition BasicFilters.h:137
frame m_z3
Definition BasicFilters.h:138
LinkwitzRiley(float sampleRate)
Definition BasicFilters.h:52
double m_a0
Definition BasicFilters.h:134
void clearHistory()
Definition BasicFilters.h:59
float m_sampleRate
Definition BasicFilters.h:131
double m_k4
Definition BasicFilters.h:133
double m_b2
Definition BasicFilters.h:135
double m_a1
Definition BasicFilters.h:134
Definition BasicFilters.h:191
float update(float s, ch_cnt_t ch)
Definition BasicFilters.h:210
float m_z1[CHANNELS]
Definition BasicFilters.h:218
float m_a0
Definition BasicFilters.h:217
OnePole()
Definition BasicFilters.h:193
void setCoeffs(float a0, float b1)
Definition BasicFilters.h:204
virtual ~OnePole()=default
float m_b1
Definition BasicFilters.h:217
register unsigned k
Definition inflate.c:946
int y
Definition inflate.c:1588
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
unsigned f
Definition inflate.c:1572
const double pi
Definition exprtk_benchmark.cpp:186
JHUFF_TBL long freq[]
Definition jchuff.h:50
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
Definition AudioAlsa.cpp:35
std::uint16_t ch_cnt_t
Definition LmmsTypes.h:44
std::uint32_t sample_rate_t
Definition LmmsTypes.h:42
float sample_t
Definition LmmsTypes.h:39
OnePole< 2 > StereoOnePole
Definition BasicFilters.h:220
LinkwitzRiley< 2 > StereoLinkwitzRiley
Definition BasicFilters.h:140
constexpr float F_EPSILON
Definition lmms_constants.h:35
BiQuad< 2 > StereoBiQuad
Definition BasicFilters.h:187
#define false
Definition ordinals.h:83
int n
Definition crypt.c:458
static ZCONST char Far * os[NUM_HOSTS]
Definition zipinfo.c:1001