/*
* Copyright (C) 2015 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.android.utils.picidae;
/**
* Specific types of tap detectors for accelerometer and gyroscope that
* initialize ThreeDSensorTapDetector. Encapsulates the large number of parameters
* needed to support different sensor types.
*/
@SuppressWarnings("PointlessArithmeticExpression")
public enum ThreeDSensorTapDetectorType {
ACCELEROMETER(
new float[] {0.8f, -0.8f} /* filterNum */,
new float[] {1.0f, -0.8f} /* filterDen */,
1.0f /* energyPerSampleNoiseLimit */,
5f /* multipleOfNoiseForPossibleTap */,
30 * 1000 * 1000 /* definiteTapsHighAmplitudeTimeNanos */,
40 * 1000 * 1000 /* possibleTapsHighAmplitudeTimeNanos */,
70 * 1000 * 1000 /* definiteTapsFallTimeNanos */,
60 * 1000 * 1000 /* possibleTapsFallTimeNanos */,
3f /* definiteTapsLowLevel */,
5f /* possibleTapsLowLevel */,
0 /* definiteTapsLowTimeNanos */,
0 /* possibleTapsLowTimeNanos */),
GYROSCOPE(
new float[] {1.0f, -1.0f} /* filterNum */,
new float[] {1.0f, 0.0f} /* filterDen */,
0.05f /* energyPerSampleNoiseLimit */,
4f /* multipleOfNoiseForPossibleTap */,
30 * 1000 * 1000 /* definiteTapsHighAmplitudeTimeNanos */,
40 * 1000 * 1000 /* possibleTapsHighAmplitudeTimeNanos */,
0 * 1000 * 1000 /* definiteTapsFallTimeNanos */,
0 * 1000 * 1000 /* possibleTapsFallTimeNanos */,
0.25f /* definiteTapsLowLevel */,
0.5f /* possibleTapsLowLevel */,
70 * 1000 * 1000 /* definiteTapsLowTimeNanos */,
60 * 1000 * 1000 /* possibleTapsLowTimeNanos */);
/**
* The three axes are all filtered with an IIR filter. This filter must be
* be first order, so both mFilterNum and mFilterDen have length 2.
* mFilterDen[0] is ignored and assumed to be 1.0f.
*/
public final float filterNum[];
public final float filterDen[];
/**
* Limit to declare a signal noisy. Units are sensor units squared.
*/
public final float energyPerSampleNoiseLimit;
/**
* Start processing a possible tap if we're above this multiple of current
* noise during NOISY state
*/
public final float multipleOfNoiseForPossibleTap;
/**
* Threshold for starting to detect a possible tap in the absence of noise
*/
public final float thresholdForPossibleTap;
/**
* Threshold for starting to detect a definite tap in the absence of noise
*/
public final float thresholdForDefiniteTap;
/**
* Once we've starting detecting a tap, we want to see its energy stay inside an
* envelope. The envelope is infinite for the HighAmplitudeTime, and then
* drops to the maximum detected energy and then falls linearly to the
* LowLevel during the FallTime. It then stays at LowLevel for LowTime.
*/
public final long definiteTapsHighAmplitudeTimeNanos;
public final long possibleTapsHighAmplitudeTimeNanos;
public final long definiteTapsFallTimeNanos;
public final long possibleTapsFallTimeNanos;
public final float definiteTapsLowLevel;
public final float possibleTapsLowLevel;
public final long definiteTapsLowTimeNanos;
public final long possibleTapsLowTimeNanos;
/**
* @param filterNumInit IIR filter numerator. Must have length 2.
* @param filterDenInit IIR filter denominator. Must have length 2.
* @param energyPerSampleNoiseLimitInit Limit for detecting noise. Sensor
* units.
* @param multipleOfNoiseForPossibleTapInit Threshold to detect possible tap
* when signal is noisy
* @param definiteTapsHighAmplitudeTimeNanosInit Time definite taps may be
* high amplitude
* @param possibleTapsHighAmplitudeTimeNanosInit Time possible taps may be
* high amplitude
* @param definiteTapsFallTimeNanosInit Time definite taps must drop from
* high to low amplitude
* @param possibleTapsFallTimeNanosInit Time possible taps must drop from
* high to low amplitude
* @param definiteTapsLowLevelInit Low level of definite tap envelope
* @param possibleTapsLowLevelInit Low level of possible tap envelope
* @param definiteTapsLowTimeNanosInit Time definite taps must stay at low
* level
* @param possibleTapsLowTimeNanosInit Time possible taps must stay at low
* level
*/
private ThreeDSensorTapDetectorType(float[] filterNumInit, float[] filterDenInit,
float energyPerSampleNoiseLimitInit, float multipleOfNoiseForPossibleTapInit,
long definiteTapsHighAmplitudeTimeNanosInit,
long possibleTapsHighAmplitudeTimeNanosInit, long definiteTapsFallTimeNanosInit,
long possibleTapsFallTimeNanosInit, float definiteTapsLowLevelInit,
float possibleTapsLowLevelInit, long definiteTapsLowTimeNanosInit,
long possibleTapsLowTimeNanosInit) {
filterNum = filterNumInit;
filterDen = filterDenInit;
energyPerSampleNoiseLimit = energyPerSampleNoiseLimitInit;
multipleOfNoiseForPossibleTap = multipleOfNoiseForPossibleTapInit;
thresholdForPossibleTap =
energyPerSampleNoiseLimitInit * multipleOfNoiseForPossibleTapInit;
thresholdForDefiniteTap = 2f * thresholdForPossibleTap;
definiteTapsHighAmplitudeTimeNanos = definiteTapsHighAmplitudeTimeNanosInit;
possibleTapsHighAmplitudeTimeNanos = possibleTapsHighAmplitudeTimeNanosInit;
definiteTapsFallTimeNanos = definiteTapsFallTimeNanosInit;
possibleTapsFallTimeNanos = possibleTapsFallTimeNanosInit;
definiteTapsLowLevel = definiteTapsLowLevelInit;
possibleTapsLowLevel = possibleTapsLowLevelInit;
definiteTapsLowTimeNanos = definiteTapsLowTimeNanosInit;
possibleTapsLowTimeNanos = possibleTapsLowTimeNanosInit;
}
}