Fix notch filter and add a test for it
This commit is contained in:
@@ -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;
|
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));
|
memset(filter, 0, sizeof(*filter));
|
||||||
filter->iter = iterations;
|
filter->iter = iterations;
|
||||||
Q = pow(sqrt(0.5), 1.0 / (double)iterations); /* 0.7071 @ 1 iteration */
|
|
||||||
Fc = frequency / (double)samplerate;
|
Fc = frequency / (double)samplerate;
|
||||||
K = tan(PI * Fc);
|
K = tan(PI * Fc);
|
||||||
norm = 1 / (1 + K / Q + K * K);
|
norm = 1 / (1 + K / Q + K * K);
|
||||||
|
@@ -10,7 +10,7 @@ typedef struct iir_filter {
|
|||||||
void iir_lowpass_init(iir_filter_t *filter, double frequency, int samplerate, int iterations);
|
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_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_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(iir_filter_t *filter, sample_t *samples, int length);
|
||||||
void iir_process_baseband(iir_filter_t *filter, float *baseband, int length);
|
void iir_process_baseband(iir_filter_t *filter, float *baseband, int length);
|
||||||
|
|
||||||
|
@@ -85,6 +85,25 @@ int main(void)
|
|||||||
printf("\n");
|
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);
|
printf("testing band-pass filter with %d iterations\n", iter);
|
||||||
|
|
||||||
iir_lowpass_init(&filter_low, 2000.0, SAMPLERATE, iter);
|
iir_lowpass_init(&filter_low, 2000.0, SAMPLERATE, iter);
|
||||||
|
Reference in New Issue
Block a user