Mercurial > hg > libxtract
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