1515 */
1616package com .mobileer .oboetester ;
1717
18+ import android .util .Log ;
1819import java .util .ArrayList ;
1920
2021/**
2122 * Analyze a recording and extract edges for latency analysis.
2223 */
2324public class TapLatencyAnalyser {
25+ public static final String TAG = "TapLatencyAnalyser" ;
2426 public static final int TYPE_TAP = 0 ;
25- float [] mHighPassBuffer ;
27+
28+ public enum FilterType {
29+ AUTO ,
30+ HIGH_PASS ,
31+ AVERAGE
32+ }
33+
34+ private FilterType mFilterType = FilterType .AUTO ;
35+
36+ private float [] mFilteredBuffer ;
2637 float [] mFastBuffer ;
2738 float [] mSlowBuffer ;
2839 float [] mLowThresholdBuffer ;
2940 float [] mArmedIndexes ;
3041
42+ private boolean mAverageFilterUsedInAuto = false ;
43+
3144 private float mDroop = 0.995f ;
3245 private static final float EDGE_THRESHOLD = 0.01f ;
3346 private static final float LOW_FRACTION = 0.5f ;
@@ -51,20 +64,42 @@ public TapLatencyEvent(int type, int sampleIndex) {
5164 */
5265 public TapLatencyEvent [] analyze (float [] buffer , int offset , int numSamples ) {
5366 // Use high pass filter to remove rumble from air conditioners.
54- mHighPassBuffer = new float [numSamples ];
55- highPassFilter (buffer , offset , numSamples , mHighPassBuffer );
56-
57- float [] mAverageBuffer = new float [numSamples ];
58- averageFilter (mHighPassBuffer , numSamples , mAverageBuffer );
59- mHighPassBuffer = mAverageBuffer ;
60-
61- // Apply envelope follower.
62- float [] peakBuffer = new float [numSamples ];
6367 mFastBuffer = new float [numSamples ];
6468 mSlowBuffer = new float [numSamples ];
6569 mLowThresholdBuffer = new float [numSamples ];
6670 mArmedIndexes = new float [numSamples ];
67- fillPeakBuffer (mHighPassBuffer , 0 , numSamples , peakBuffer );
71+
72+ mAverageFilterUsedInAuto = false ;
73+ float [] highPassBuffer = new float [numSamples ];
74+ highPassFilter (buffer , offset , numSamples , highPassBuffer );
75+ TapLatencyEvent [] eventsFromHighpass = applyEnvelopeFollowerAndScanForEdges (highPassBuffer , numSamples );
76+
77+ float [] avgFilteredBuffer = new float [numSamples ];
78+ averageFilter (highPassBuffer , numSamples , avgFilteredBuffer );
79+ TapLatencyEvent [] eventsFromAvg = applyEnvelopeFollowerAndScanForEdges (avgFilteredBuffer , numSamples );
80+
81+ if (mFilterType == FilterType .HIGH_PASS ){
82+ mFilteredBuffer = highPassBuffer ;
83+ return eventsFromHighpass ;
84+ }else if (mFilterType == FilterType .AVERAGE ){
85+ mFilteredBuffer = avgFilteredBuffer ;
86+ return eventsFromAvg ;
87+ }else {
88+ if (eventsFromHighpass .length == 2 ) {
89+ mFilteredBuffer = highPassBuffer ;
90+ return eventsFromHighpass ;
91+ } else {
92+ mFilteredBuffer = avgFilteredBuffer ;
93+ mAverageFilterUsedInAuto = true ;
94+ return eventsFromAvg ;
95+ }
96+ }
97+ }
98+
99+ public TapLatencyEvent [] applyEnvelopeFollowerAndScanForEdges (float [] buffer , int numSamples ) {
100+ // Apply envelope follower.
101+ float [] peakBuffer = new float [numSamples ];
102+ fillPeakBuffer (buffer , 0 , numSamples , peakBuffer );
68103 // Look for two attacks.
69104 return scanForEdges (peakBuffer , numSamples );
70105 }
@@ -74,7 +109,7 @@ public TapLatencyEvent[] analyze(float[] buffer, int offset, int numSamples) {
74109 * High-pass filtered to emphasize high-frequency events such as edges.
75110 */
76111 public float [] getFilteredBuffer () {
77- return mHighPassBuffer ;
112+ return mFilteredBuffer ;
78113 }
79114
80115
@@ -93,6 +128,16 @@ public float[] getLowThresholdBuffer() {
93128 public float [] getArmedIndexes () {
94129 return mArmedIndexes ;
95130 }
131+
132+ public void setFilterType (FilterType filterType ) {
133+ mFilterType = filterType ;
134+ Log .d (TAG , "setFilterType: " + filterType );
135+ }
136+
137+ public boolean getAverageFilterUsedInAuto () {
138+ return mAverageFilterUsedInAuto ;
139+ }
140+
96141 // Based on https://en.wikipedia.org/wiki/High-pass_filter
97142 private void highPassFilter (
98143 float [] buffer , int offset , int numSamples , float [] highPassBuffer ) {
@@ -114,6 +159,10 @@ private void highPassFilter(
114159 }
115160
116161 private void averageFilter (float [] buffer , int numSamples , float [] averageBuffer ) {
162+ if (numSamples <= 0 ) {
163+ Log .e ("TapLatencyAnalyser" , "averageFilter: numSamples = " + numSamples );
164+ return ;
165+ }
117166 double sum = 0.0 ;
118167 for (int i = 0 ; i < numSamples ; i ++) {
119168 sum += buffer [i ];
0 commit comments