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 (&parampointer->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 (&parampointer->buffer, parampointer->filterno);
63 #else
64   advance_current_pos (&parampointer->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 (&parampointer->buffer, -2);
78   longsample.left += sample.left;
79   longsample.right += sample.right;
80 
81   sample = get_from_buffer (&parampointer->buffer, -1);
82   longsample.left += 5 * sample.left;
83   longsample.right += 5 * sample.right;
84 
85   sample = get_from_buffer (&parampointer->buffer, 0);
86   longsample.left += 13 * sample.left;
87   longsample.right += 13 * sample.right;
88 
89   sample = get_from_buffer (&parampointer->buffer, 1);
90   longsample.left += 5 * sample.left;
91   longsample.right += 5 * sample.right;
92 
93   sample = get_from_buffer (&parampointer->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