diff --git a/src/libfilter/iir_filter.c b/src/libfilter/iir_filter.c index 5872d61..2749f96 100644 --- a/src/libfilter/iir_filter.c +++ b/src/libfilter/iir_filter.c @@ -88,13 +88,12 @@ void iir_bandpass_init(iir_filter_t *filter, double frequency, int samplerate, i filter->b2 = (1 - K / Q + K * K) * norm; } -void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations) +void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations, double Q) { - double Fc, Q, K, norm; + double Fc, K, norm; memset(filter, 0, sizeof(*filter)); filter->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); diff --git a/src/libfilter/iir_filter.h b/src/libfilter/iir_filter.h index a5956c8..9b2d7ce 100644 --- a/src/libfilter/iir_filter.h +++ b/src/libfilter/iir_filter.h @@ -10,7 +10,7 @@ typedef struct iir_filter { void iir_lowpass_init(iir_filter_t *filter, double frequency, int samplerate, int iterations); void iir_highpass_init(iir_filter_t *filter, double frequency, int samplerate, int iterations); void iir_bandpass_init(iir_filter_t *filter, double frequency, int samplerate, int iterations); -void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations); +void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations, double Q); void iir_process(iir_filter_t *filter, sample_t *samples, int length); void iir_process_baseband(iir_filter_t *filter, float *baseband, int length); diff --git a/src/test/test_filter.c b/src/test/test_filter.c index 3011930..ceaa463 100644 --- a/src/test/test_filter.c +++ b/src/test/test_filter.c @@ -85,6 +85,25 @@ int main(void) printf("\n"); } + printf("testing notch filter with %d iterations, Q = 4\n", 1); + + iir_notch_init(&filter_high, 2605.0, SAMPLERATE, 1, 4); + + for (i = 0; i < 4001; i += 100) { + gen_samples(samples, (double)i); + iir_process(&filter_high, samples, SAMPLERATE); + level = get_level(samples); + printf("%s%4d Hz: %.1f dB", debug_db(level), i, level2db(level)); + if (i == 2600) + printf(" filter frequency (2605 Hz)\n"); + else if (i == 2800) + printf(" about 200 Hz above\n"); + else if (i == 2400) + printf(" about 200 Hz below\n"); + else + printf("\n"); + } + printf("testing band-pass filter with %d iterations\n", iter); iir_lowpass_init(&filter_low, 2000.0, SAMPLERATE, iter);