aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/filter.c')
-rw-r--r--src/common/filter.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/src/common/filter.c b/src/common/filter.c
index f568f1b..3aea327 100644
--- a/src/common/filter.c
+++ b/src/common/filter.c
@@ -26,14 +26,18 @@
#define PI M_PI
-//#define CASCADE
-
-void filter_lowpass_init(filter_lowpass_t *bq, double frequency, int samplerate)
+void filter_lowpass_init(filter_t *bq, double frequency, int samplerate, int iterations)
{
double Fc, Q, K, norm;
+ if (iterations > 64) {
+ fprintf(stderr, "%s failed: too many iterations, please fix!\n", __func__);
+ abort();
+ }
+
memset(bq, 0, sizeof(*bq));
- Q = sqrt(0.5); /* 0.7071... */
+ bq->iter = iterations;
+ Q = pow(sqrt(0.5), 1.0 / (double)iterations); /* 0.7071 @ 1 iteration */
Fc = frequency / (double)samplerate;
K = tan(PI * Fc);
norm = 1 / (1 + K / Q + K * K);
@@ -44,18 +48,31 @@ void filter_lowpass_init(filter_lowpass_t *bq, double frequency, int samplerate)
bq->b2 = (1 - K / Q + K * K) * norm;
}
-void filter_lowpass_process(filter_lowpass_t *bq, double *samples, int length, int iterations)
+void filter_highpass_init(filter_t *bq, double frequency, int samplerate, int iterations)
+{
+ double Fc, Q, K, norm;
+
+ memset(bq, 0, sizeof(*bq));
+ bq->iter = iterations;
+ Q = pow(sqrt(0.5), 1.0 / (double)iterations); /* 0.7071 @ 1 iteration */
+ Fc = frequency / (double)samplerate;
+ K = tan(PI * Fc);
+ norm = 1 / (1 + K / Q + K * K);
+ bq->a0 = 1 * norm;
+ bq->a1 = -2 * bq->a0;
+ bq->a2 = bq->a0;
+ bq->b1 = 2 * (K * K - 1) * norm;
+ bq->b2 = (1 - K / Q + K * K) * norm;
+}
+
+void filter_process(filter_t *bq, double *samples, int length)
{
double a0, a1, a2, b1, b2;
double *z1, *z2;
double in, out;
+ int iterations = bq->iter;
int i, j;
- if (iterations > 10) {
- fprintf(stderr, "%s failed: too many iterations, please fix!\n", __func__);
- abort();
- }
-
/* get states */
a0 = bq->a0;
a1 = bq->a1;