diff --git a/lib/filters.c b/lib/filters.c index 91cd964..9dc0a32 100644 --- a/lib/filters.c +++ b/lib/filters.c @@ -18,23 +18,24 @@ float hard_clip(float sample, float threshold) { void init_lpf(FIR *filter, float cutoff, int sample_rate) { float a = tanf(M_PI*cutoff/sample_rate); float a2 = a*a; - float r; + float r, e; for(int i = 0; i < FIR_ORDER; i++) { r = sinf(M_PI*(2.0f*i+1.0f)/(4.0f*FIR_ORDER)); - sample_rate = a2+2.0f*a*r+1.0f; - filter->A[i] = a2 / sample_rate; - filter->d1[i] = 2.0f*(1.0f-a2)/sample_rate; - filter->d2[i] = -(a2 - 2.0f * a * r + 1.0f) / sample_rate; + e = a2+2.0f*a*r+1.0f; + filter->A[i] = a2 / e; + filter->d1[i] = 2.0f*(1.0f-a2)/e; + filter->d2[i] = -(a2 - 2.0f * a * r + 1.0f) / e; } } float process_lpf(FIR *filter, float x) { + float output; for(int i = 0; i < FIR_ORDER; i++) { filter->w0[i] = filter->d1[i]*filter->w1[i] + filter->d2[i]*filter->w2[i] + x; - x = filter->A[i] * (filter->w0[i] + 2.0f * filter->w1[i] + filter->w2[i]); + output = filter->A[i] * (filter->w0[i] + 2.0f * filter->w1[i] + filter->w2[i]); filter->w2[i] = filter->w1[i]; filter->w1[i] = filter->w0[i]; } - return x; + return output; } \ No newline at end of file diff --git a/lib/filters.h b/lib/filters.h index 5cd620d..e4e15f5 100644 --- a/lib/filters.h +++ b/lib/filters.h @@ -5,7 +5,7 @@ #include "constants.h" #include "oscillator.h" -#define FIR_ORDER 10 +#define FIR_ORDER 21 typedef struct {