aboutsummaryrefslogtreecommitdiffstats
path: root/src/test/test_filter.c
blob: f1fe5cc89f20e036d0977302d2264053d551879c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <string.h>
#include "../libsample/sample.h"
#include "../libfilter/iir_filter.h"
#include "../libfilter/fir_filter.h"
#include "../liblogging/logging.h"

#define level2db(level)		(20 * log10(level))
#define db2level(db)		pow(10, (double)db / 20.0)

#define SAMPLERATE	48000

static double get_level(sample_t *samples)
{
	int i;
	double envelope = 0;
	for (i = SAMPLERATE/2; i < SAMPLERATE; i++) {
		if (samples[i] > envelope)
			envelope = samples[i];
	}

	return envelope;
}

static void gen_samples(sample_t *samples, double freq)
{
	int i;
	double value;

	for (i = 0; i < SAMPLERATE; i++) {
		value = cos(2.0 * M_PI * freq / (double)SAMPLERATE * (double)i);
		samples[i] = value;
	}
}

int num_kanal;

int main(void)
{
	iir_filter_t filter_low;
	iir_filter_t filter_high;
	fir_filter_t	*fir_low/*, *fir_high*/;
	sample_t samples[SAMPLERATE];
	double level;
	int iter = 2;
	int i;

	printf("testing low-pass filter with %d iterations\n", iter);

	iir_lowpass_init(&filter_low, 1000.0, SAMPLERATE, iter);

	for (i = 0; i < 4001; i += 100) {
		gen_samples(samples, (double)i);
		iir_process(&filter_low, samples, SAMPLERATE);
		level = get_level(samples);
		printf("%s%4d Hz: %.1f dB", debug_db(level), i, level2db(level));
		if (i == 1000)
			printf(" cutoff\n");
		else if (i == 2000)
			printf(" double frequency\n");
		else if (i == 4000)
			printf(" quad frequency\n");
		else
			printf("\n");
	}

	printf("testing high-pass filter with %d iterations\n", iter);

	iir_highpass_init(&filter_high, 2000.0, SAMPLERATE, iter);

	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 == 2000)
			printf(" cutoff\n");
		else if (i == 1000)
			printf(" half frequency\n");
		else if (i == 500)
			printf(" quarter frequency\n");
		else
			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);
	iir_highpass_init(&filter_high, 1000.0, SAMPLERATE, iter);

	for (i = 0; i < 4001; i += 100) {
		gen_samples(samples, (double)i);
		iir_process(&filter_low, samples, SAMPLERATE);
		iir_process(&filter_high, samples, SAMPLERATE);
		level = get_level(samples);
		printf("%s%4d Hz: %.1f dB", debug_db(level), i, level2db(level));
		if (i == 1000)
			printf(" cutoff high\n");
		else if (i == 2000)
			printf(" cutoff low\n");
		else
			printf("\n");
	}

	double freq = 2000.0;
	double tb = 400.0;
	printf("testing low-pass FIR filter with %.0fHz transition bandwidth\n", tb);

	fir_low = fir_lowpass_init(SAMPLERATE, freq, tb);
	printf("Using %d taps\n", fir_low->ntaps);

	for (i = 0; i < 4001; i += 100) {
		gen_samples(samples, (double)i);
		fir_process(fir_low, samples, SAMPLERATE);
		level = get_level(samples);
		printf("%s%s%4d Hz: %.1f dB", debug_amplitude(level), debug_db(level), i, level2db(level));
		if (i == freq)
			printf(" cutoff\n");
		else
			printf("\n");
	}
	fir_exit(fir_low);

#if 0
	double freq1 = 1000.0, freq2 = 2000.0;
	tb = 100.0;
	printf("testing two-pass FIR filter\n");

	fir_high = fir_twopass_init(SAMPLERATE, freq1, freq2, tb);
	printf("Using %d taps\n", fir_high->ntaps);

	for (i = 0; i < 4001; i += 100) {
		gen_samples(samples, (double)i);
		fir_process(fir_high, samples, SAMPLERATE);
		level = get_level(samples);
		printf("%s%s%4d Hz: %.1f dB", debug_amplitude(level), debug_db(level), i, level2db(level));
		if (i == freq1 || i == freq2)
			printf(" cutoff\n");
		else
			printf("\n");
	}
	fir_exit(fir_high);
#endif

	return 0;
}