CTS Verifier fix latency estimation for Loopback test

Fixed correlation computation by filtering out low level noise
from signal.

Bug: 25011345

Change-Id: I31995af998a59f1762819af2dbe4e85e44f1eaf3
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/audio/Correlation.java b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Correlation.java
index 75b04eb..98d1365 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/audio/Correlation.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/audio/Correlation.java
@@ -30,6 +30,8 @@
     public double mEstimatedLatencyMs = 0;
     public double mEstimatedLatencyConfidence = 0.0;
 
+    private double mAmplitudeThreshold = 0.001;  // 0.001 = -60 dB noise
+
     public void init(int blockSize, int samplingRate) {
         mBlockSize = blockSize;
         mSamplingRate = samplingRate;
@@ -40,7 +42,7 @@
         log("Started Auto Correlation for data with " + data.length + " points");
         mSamplingRate = samplingRate;
 
-        downsampleData(data, mDataDownsampled);
+        downsampleData(data, mDataDownsampled, mAmplitudeThreshold);
 
         //correlation vector
         autocorrelation(mDataDownsampled, mDataAutocorrelated);
@@ -95,7 +97,7 @@
         return status;
     }
 
-    private boolean downsampleData(double [] data, double [] dataDownsampled) {
+    private boolean downsampleData(double [] data, double [] dataDownsampled, double threshold) {
 
         boolean status = false;
         // mDataDownsampled = new double[mBlockSize];
@@ -106,6 +108,8 @@
         int N = data.length; //all samples available
         double groupSize =  (double) N / mBlockSize;
 
+        int ignored = 0;
+
         int currentIndex = 0;
         double nextGroup = groupSize;
         for (int i = 0; i<N && currentIndex<mBlockSize; i++) {
@@ -118,9 +122,18 @@
             if (currentIndex>=mBlockSize) {
                 break;
             }
-            dataDownsampled[currentIndex] += Math.abs(data[i]);
+
+            double value =  Math.abs(data[i]);
+            if (value >= threshold) {
+                dataDownsampled[currentIndex] += value;
+            } else {
+                ignored++;
+            }
         }
 
+        log(String.format(" Threshold: %.3f, ignored:%d/%d (%%.2f)", threshold, ignored, N,
+                (double) ignored/(double)N));
+
         status = true;
         return status;
     }