// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.google.vrtoolkit.cardboard.sensors.internal; import java.util.concurrent.TimeUnit; public class LowPassFilter { private static final double NANOS_TO_SECONDS; private final double timeConstantSecs; private final Vector3d filteredData = new Vector3d(); private long lastTimestampNs; private int numSamples; private final Vector3d temp = new Vector3d(); public LowPassFilter(double cutoffFrequency) { this.timeConstantSecs = 1.0D / (6.283185307179586D * cutoffFrequency); } public int getNumSamples() { return this.numSamples; } public void addSample(Vector3d sampleData, long timestampNs) { this.addWeightedSample(sampleData, timestampNs, 1.0D); } public void addWeightedSample(Vector3d sampleData, long timestampNs, double weight) { ++this.numSamples; if(this.numSamples == 1) { this.filteredData.set(sampleData); this.lastTimestampNs = timestampNs; } else { double weightedDeltaSecs = weight * (double)(timestampNs - this.lastTimestampNs) * NANOS_TO_SECONDS; double alpha = weightedDeltaSecs / (this.timeConstantSecs + weightedDeltaSecs); this.filteredData.scale(1.0D - alpha); this.temp.set(sampleData); this.temp.scale(alpha); Vector3d.add(this.temp, this.filteredData, this.filteredData); this.lastTimestampNs = timestampNs; } } public Vector3d getFilteredData() { return this.filteredData; } static { NANOS_TO_SECONDS = 1.0D / (double)TimeUnit.NANOSECONDS.convert(1L, TimeUnit.SECONDS); } }