1 package org.lsst.ccs.utilities.dsp;
2
3 import java.util.Arrays;
4
5
6
7
8
9
10 public class BoxCarFilter implements DigitalFilter {
11
12
13
14
15 private static final long serialVersionUID = 6387011792246109318L;
16
17 public BoxCarFilter(int sz) {
18 this.sz = sz;
19 history = new double[sz];
20 current = 0;
21 n = 0;
22 }
23
24 public void reset() {
25 Arrays.fill(history, 0);
26 ip = 0;
27 current = 0;
28 n = 0;
29 }
30
31 public int getDelay() {
32 return sz / 2;
33 }
34
35 public double apply(double signal) {
36 if (sz == 0)
37 return signal;
38 ip++;
39 if (ip >= sz) {
40 ip = 0;
41 }
42 n++;
43 int used = n;
44 if (used > sz) {
45 used = sz;
46 }
47 if (n > sz) {
48 current -= history[ip];
49 }
50 history[ip] = signal;
51 current += signal;
52 return current / used;
53 }
54
55 int flushed = -1;
56
57 public double flush() {
58 if (flushed == -1) {
59 flushed = sz;
60 }
61 ip++;
62 if (ip >= sz) {
63 ip = 0;
64 }
65 current -= history[ip];
66 flushed--;
67 if (flushed == 0)
68 throw new IllegalStateException();
69 System.out.println("flushed " + flushed + " " + history[ip] + " "
70 + current / flushed);
71 return current / flushed;
72 }
73
74 public double freqResp(double freq) {
75 return 0;
76 }
77
78 public int getOrder() {
79 return sz;
80 }
81
82 int sz;
83
84 double[] history;
85
86 double current;
87
88 int ip;
89
90 int n;
91
92 @Override
93 public Object clone() {
94 try {
95 BoxCarFilter f = (BoxCarFilter) super.clone();
96 f.history = new double[sz];
97 return f;
98 } catch (CloneNotSupportedException e) {
99 return null;
100 }
101 }
102
103 public static void main(String[] args) {
104 int sz = 25;
105 int n = 200;
106 double[] result = new double[n];
107 BoxCarFilter f = new BoxCarFilter(sz);
108 int d = f.getDelay();
109 for (int i = 0; i < d; i++) {
110 f.apply(i);
111 }
112 for (int i = 0; i < n - d; i++) {
113 result[i] = f.apply(i + d);
114 }
115 for (int i = n - d; i < n; i++) {
116 result[i] = f.flush();
117 }
118 for (int i = 0; i < n; i++) {
119 System.out.println(i + " " + result[i]);
120 }
121
122 }
123 }