View Javadoc

1   package org.lsst.ccs.utilities.dsp;
2   
3   import java.util.Arrays;
4   
5   /**
6    * 
7    * @author aubourg
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 }