/* * 作成日: 2008/07/09 */ package jp.ac.fit.asura.nao.misc; import jp.ac.fit.asura.nao.misc.Filter.BooleanFilter; import jp.ac.fit.asura.nao.misc.Filter.FloatFilter; import jp.ac.fit.asura.nao.misc.Filter.IntFilter; /** * @author sey * * @version $Id: MeanFilter.java 691 2008-09-26 06:40:26Z sey $ * */ public class AverageFilter { protected int tail; protected int length; protected int size; public AverageFilter(int size) { tail = length = 0; this.size = size; } protected int current() { return (tail + length) % size; } protected void next() { if (length >= size) tail = (tail + 1) % size; else length++; } public void clear() { tail = length = 0; } public boolean isFilled() { return length == size; } public static class Boolean extends AverageFilter implements BooleanFilter { private boolean[] state; public Boolean(int size) { super(size); state = new boolean[size]; } public void eval() { next(); if (length > 0) length--; } public boolean eval(boolean value) { // フィルタを更新 state[current()] = value; next(); return value(); } public boolean value() { int count = 0; for (int i = 0; i < length; i++) { if (state[i]) count++; } if (length <= 0) { assert false; return false; } return count > length / 2; } } public static class Int extends AverageFilter implements IntFilter { private int[] state; public Int(int size) { super(size); state = new int[size]; } public void eval() { next(); if (length > 0) length--; } public int eval(int value) { // フィルタを更新 state[current()] = value; next(); return value(); } public int value() { int value = 0; for (int i = 0; i < length; i++) { value += state[i]; } if (length <= 0) { assert false; return Integer.MIN_VALUE; } return value / length; } } public static class Float extends AverageFilter implements FloatFilter { private float[] state; public Float(int size) { super(size); state = new float[size]; } public void eval() { next(); if (length > 0) length--; } public float eval(float value) { // フィルタを更新 state[current()] = value; next(); return value(); } public float value() { float value = 0; for (int i = 0; i < length; i++) { value += state[i]; } if (length <= 0) { assert false; return java.lang.Float.NaN; } return value / length; } } }