68 static void shelve(
double cf,
double boost,
69 double *a0,
double *a1,
double *a2,
70 double *b1,
double *b2)
72 double a, A, F, tmp, b0, recipb0, asq, F2, gamma2, siggam2, gam2p1;
73 double gamman, gammad, ta0, ta1, ta2, tb0, tb1, tb2, aa1, ab1;
75 a = tan(M_PI * (cf - 0.25));
77 A = pow(10.0, boost / 20.0);
78 if ((boost < 6.0) && (boost > -6.0)) F = sqrt(A);
79 else if (A > 1.0) F = A / sqrt(2.0);
84 if (fabs(tmp) <=
SPN) gammad = 1.0;
85 else gammad = pow((F2 - 1.0) / tmp, 0.25);
86 gamman = sqrt(A) * gammad;
88 gamma2 = gamman * gamman;
89 gam2p1 = 1.0 + gamma2;
90 siggam2 = 2.0 * sqrt(2.0) / 2.0 * gamman;
91 ta0 = gam2p1 + siggam2;
92 ta1 = -2.0 * (1.0 - gamma2);
93 ta2 = gam2p1 - siggam2;
95 gamma2 = gammad * gammad;
96 gam2p1 = 1.0 + gamma2;
97 siggam2 = 2.0 * sqrt(2.0) / 2.0 * gammad;
98 tb0 = gam2p1 + siggam2;
99 tb1 = -2.0 * (1.0 - gamma2);
100 tb2 = gam2p1 - siggam2;
103 *a0 = ta0 + aa1 + asq * ta2;
104 *a1 = 2.0 * a * (ta0 + ta2) + (1.0 + asq) * ta1;
105 *a2 = asq * ta0 + aa1 + ta2;
108 b0 = tb0 + ab1 + asq * tb2;
109 *b1 = 2.0 * a * (tb0 + tb2) + (1.0 + asq) * tb1;
110 *b2 = asq * tb0 + ab1 + tb2;
126 gain = pow(10.0, boost / 20.0);
127 shelve(freq / (2 * M_PI), boost,
147 for (
unsigned i = 0; i < in.
size(); i++)
176 double a0, a1, a2, b1, b2;
188 std::complex<double> h;
189 std::complex<double> w;
190 std::complex<double> j(0.0,1.0);
191 std::complex<double> z;
197 h = 0.95 * (a0 * (z*z) + (a1*z) + a2) / ((z*z) - (b1*z) - b2);
199 return sqrt(std::norm(h));
206 double new_freq = QVariant(fc).toDouble();
207 if (qFuzzyCompare(new_freq,
m_f_cutoff))
return;
virtual ~LowPassFilter() Q_DECL_OVERRIDE
static void shelve(double cf, double boost, double *a0, double *a1, double *a2, double *b1, double *b2)
virtual double at(double f) Q_DECL_OVERRIDE
Kwave::SampleArray m_buffer
void input(Kwave::SampleArray data)
void output(Kwave::SampleArray data)
static double sample2double(const sample_t s)
void setFrequency(const QVariant fc)
static sample_t double2sample(const double f)
virtual void goOn() Q_DECL_OVERRIDE
unsigned int size() const
void normed_setfilter_shelvelowpass(double freq)
bool resize(unsigned int size) Q_REQUIRED_RESULT
struct Kwave::LowPassFilter::@13 m_filter