fix: calculate normals without struct

This commit is contained in:
2023-09-08 17:11:36 +04:00
parent 55242db407
commit 1cf3cccb69
5 changed files with 20 additions and 28 deletions

View File

@@ -2,21 +2,16 @@
#include "Effect.h" #include "Effect.h"
class Filter : public Effect { class Filter : public Effect {
protected: protected:
struct Normals {
float V;
float K;
};
float m_freq; // cutoff frequency float m_freq; // cutoff frequency
float m_q; // filter quantity (resonance) float m_q; // filter quantity (resonance)
float m_order; // filter order (peakGain) float m_order; // filter order (peakGain)
/* todo: filter adsr */ /* todo: filter adsr */
float m_norm; float m_norm, m_v, m_k;
float m_a0, m_a1, m_a2, m_b1, m_b2; float m_a0, m_a1, m_a2, m_b1, m_b2;
float m_z1, m_z2; float m_z1, m_z2;
Normals calculate_normals();
void calculate_normals();
virtual void calculate_coefficients(){}; virtual void calculate_coefficients(){};
public: public:

View File

@@ -13,11 +13,11 @@ BandPassFilter::BandPassFilter(float freq, float res, float q) {}
BandPassFilter::~BandPassFilter() {} BandPassFilter::~BandPassFilter() {}
void BandPassFilter::calculate_coefficients() { void BandPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals(); calculate_normals();
m_norm = 1 / (1 + base.K / m_q + base.K * base.K); m_norm = 1 / (1 + m_k / m_q + m_k * m_k);
m_a0 = base.K / m_q * m_norm; m_a0 = m_k / m_q * m_norm;
m_a1 = 0; m_a1 = 0;
m_a2 = -m_a0; m_a2 = -m_a0;
m_b1 = 2 * (base.K * base.K - 1) * m_norm; m_b1 = 2 * (m_k * m_k - 1) * m_norm;
m_b2 = (1 - base.K / m_q + base.K * base.K) * m_norm; m_b2 = (1 - m_k / m_q + m_k * m_k) * m_norm;
} }

View File

@@ -5,12 +5,9 @@ Filter::Filter(/* args */) {}
Filter::~Filter() {} Filter::~Filter() {}
Filter::Normals Filter::calculate_normals() { void Filter::calculate_normals() {
Filter::Normals res; m_v = powf(10, fabs(m_order) / 20.0);
res.V = powf(10, fabs(m_order) / 20.0); m_k = tanf(M_PI * m_freq);
res.K = tanf(M_PI * m_freq);
return res;
} }
void Filter::Trigger() {} void Filter::Trigger() {}

View File

@@ -13,11 +13,11 @@ HighPassFilter::HighPassFilter(float freq, float res, float q) {}
HighPassFilter::~HighPassFilter() {} HighPassFilter::~HighPassFilter() {}
void HighPassFilter::calculate_coefficients() { void HighPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals(); calculate_normals();
m_norm = 1 / (1 + base.K / m_q + base.K * base.K); m_norm = 1 / (1 + m_k / m_q + m_k * m_k);
m_a0 = 1 * m_norm; m_a0 = 1 * m_norm;
m_a1 = -2 * m_a0; m_a1 = -2 * m_a0;
m_a2 = m_a0; m_a2 = m_a0;
m_b1 = 2 * (base.K * base.K - 1) * m_norm; m_b1 = 2 * (m_k * m_k - 1) * m_norm;
m_b2 = (1 - base.K / m_q + base.K * base.K) * m_norm; m_b2 = (1 - m_k / m_q + m_k * m_k) * m_norm;
} }

View File

@@ -23,11 +23,11 @@ LowPassFilter::LowPassFilter(Filter* filter) {
LowPassFilter::~LowPassFilter() {} LowPassFilter::~LowPassFilter() {}
void LowPassFilter::calculate_coefficients() { void LowPassFilter::calculate_coefficients() {
Filter::Normals base = calculate_normals(); calculate_normals();
m_norm = 1 / (1 + base.K / m_q + base.K * base.K); m_norm = 1 / (1 + m_k / m_q + m_k * m_k);
m_a0 = base.K * base.K * m_norm; m_a0 = m_k * m_k * m_norm;
m_a1 = 2 * m_a0; m_a1 = 2 * m_a0;
m_a2 = m_a0; m_a2 = m_a0;
m_b1 = 2 * (base.K * base.K - 1) * m_norm; m_b1 = 2 * (m_k * m_k - 1) * m_norm;
m_b2 = (1 - base.K / m_q + base.K * base.K) * m_norm; m_b2 = (1 - m_k / m_q + m_k * m_k) * m_norm;
} }