1 /* Experimenting Filter
2
3 * Copyright (C) 1998 J.A. Bezemer
4 *
5 * Licensed under the terms of the GNU General Public License.
6 * ABSOLUTELY NO WARRANTY.
7 * See the file `COPYING' in this directory.
8 */
9
10 /* You can experiment with this filter to your hearts desire. Currently,
11 samples x[t-100] through x[t+100] are accessible. An example
12 smoothing filter is presented below, so you can get an idea how
13 to program things. */
14
15 #include "signpr_exper.h"
16 #include "signpr_general.h"
17 #include "errorwindow.h"
18 #include <math.h>
19
20
21 void
experiment_param_defaults(parampointer_t parampointer)22 experiment_param_defaults (parampointer_t parampointer)
23 {
24 }
25
26 #ifndef SWIG
27 void
experiment_param_screen(parampointer_t parampointer)28 experiment_param_screen (parampointer_t parampointer)
29 {
30 error_window ("This is a filter with which you can experiment. The \
31 source code is in signpr_exper.c");
32 }
33 #endif
34
35 void
init_experiment_filter(int filterno,parampointer_t parampointer)36 init_experiment_filter (int filterno, parampointer_t parampointer)
37 {
38 parampointer->buffer = init_buffer (100, 100);
39
40 parampointer->filterno = filterno;
41 }
42
43 void
delete_experiment_filter(parampointer_t parampointer)44 delete_experiment_filter (parampointer_t parampointer)
45 {
46 delete_buffer (¶mpointer->buffer);
47 }
48
49
50 sample_t
51 #ifndef SWIG
experiment_filter(parampointer_t parampointer)52 experiment_filter (parampointer_t parampointer)
53 #else
54 experiment_filter (parampointer_t parampointer, int *filter_type)
55 #endif
56 {
57 sample_t sample;
58 longsample_t longsample;
59 /* doublesample_t doublesample; */
60
61 #ifndef SWIG
62 advance_current_pos (¶mpointer->buffer, parampointer->filterno);
63 #else
64 advance_current_pos (¶mpointer->buffer, parampointer->filterno, filter_type);
65 #endif
66
67 /* Example: a smoothing filter (lowpass, that is):
68
69 y[t] = { x[t-2] + 5*x[t-1] + 13*x[t] + 5*x[t+1] + x[t+2] } / 25
70 */
71
72 /* zero totals */
73 longsample.left = 0;
74 longsample.right = 0;
75
76 /* compute the weighted sum */
77 sample = get_from_buffer (¶mpointer->buffer, -2);
78 longsample.left += sample.left;
79 longsample.right += sample.right;
80
81 sample = get_from_buffer (¶mpointer->buffer, -1);
82 longsample.left += 5 * sample.left;
83 longsample.right += 5 * sample.right;
84
85 sample = get_from_buffer (¶mpointer->buffer, 0);
86 longsample.left += 13 * sample.left;
87 longsample.right += 13 * sample.right;
88
89 sample = get_from_buffer (¶mpointer->buffer, 1);
90 longsample.left += 5 * sample.left;
91 longsample.right += 5 * sample.right;
92
93 sample = get_from_buffer (¶mpointer->buffer, 2);
94 longsample.left += sample.left;
95 longsample.right += sample.right;
96
97 /* devide by the total weight */
98 sample.left = longsample.left / 25;
99 sample.right = longsample.right / 25;
100
101 /* return the computed sample */
102 return sample;
103 }
104