changeset 215:44401945d850

Add xtract_peak() determines whether the 'current' value is a peak
author Jamie Bullock <jamie@jamiebullock.com>
date Tue, 03 Jun 2014 21:17:51 +0100
parents f28f66faa016
children 1f18f47e29eb
files src/scalar.c xtract/libxtract.h xtract/xtract_scalar.h
diffstat 3 files changed, 48 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/scalar.c	Tue Jun 03 21:17:07 2014 +0100
+++ b/src/scalar.c	Tue Jun 03 21:17:51 2014 +0100
@@ -1002,3 +1002,36 @@
     return XTRACT_SUCCESS;
 }
 
+int xtract_peak_picker(const double *data, const int N, const void *argv, double *result)
+{
+    double threshold = *(double *)argv;
+    double current = data[N - 1];
+    double average = 0.0;
+    double maximum = -DBL_MAX;
+    
+    for (uint32_t n = 0; n < N; ++n)
+    {
+        average += data[n];
+        if (data[n] > maximum)
+        {
+            maximum = data[n];
+        }
+    }
+    
+    average /= (double)N;
+    
+    if (current != maximum)
+    {
+        return XTRACT_NO_RESULT;
+    }
+    
+    if (current < average + threshold)
+    {
+        return XTRACT_NO_RESULT;
+    }
+    
+    return XTRACT_SUCCESS;
+    
+}
+
+
--- a/xtract/libxtract.h	Tue Jun 03 21:17:07 2014 +0100
+++ b/xtract/libxtract.h	Tue Jun 03 21:17:51 2014 +0100
@@ -172,6 +172,7 @@
     XTRACT_MALLOC_FAILED,
     XTRACT_BAD_ARGV,
     XTRACT_BAD_VECTOR_SIZE,
+    XTRACT_BAD_STATE,
     XTRACT_DENORMAL_FOUND,
     XTRACT_NO_RESULT, /* This usually occurs when the correct calculation cannot take place because required data is missing or would result in a NaN or infinity/-infinity. Under these curcumstances 0.f is usually given by *result */
     XTRACT_FEATURE_NOT_IMPLEMENTED,
--- a/xtract/xtract_scalar.h	Tue Jun 03 21:17:07 2014 +0100
+++ b/xtract/xtract_scalar.h	Tue Jun 03 21:17:51 2014 +0100
@@ -457,6 +457,20 @@
  */
 int xtract_nonzero_count(const double *data, const int N, const void *argv, double *result);
 
+/**
+ *  \brief Return XTRACT_SUCCESS if the 'current' value is considered a peak
+ *
+ *  @param data   a pointer to an array containing time series as provided by *result from xtract_last_n() where the Nth value is considered the 'current' value
+ *  @param N      an integer representing the number of elements in the time series
+ *  @param argv   a pointer to a double representing the threshold, whereby the current value will be considered a peak if it is above the average of the last N values (*data) by the threshold
+ *  @param result a pointer to a copy of the current value if the current value is considered a peak
+ *
+ *
+ *  @return XTRACT_SUCCESS if a peak was found or XTRACT_NO_RESULT if not
+ */
+int xtract_peak(const double *data, const int N, const void *argv, double *result);
+
+    
 /** @} */
 
 #ifdef __cplusplus