aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/puredata/xtract~.c1
-rw-r--r--src/libxtract.c1
-rw-r--r--src/scalar.c19
-rw-r--r--xtract/libxtract.h3
-rw-r--r--xtract/xtract_scalar.h9
5 files changed, 32 insertions, 1 deletions
diff --git a/examples/puredata/xtract~.c b/examples/puredata/xtract~.c
index 035a43d..7866ff3 100644
--- a/examples/puredata/xtract~.c
+++ b/examples/puredata/xtract~.c
@@ -101,6 +101,7 @@ static void *xtract_new(t_symbol *me, t_int argc, t_atom *argv) {
else if(tmp == gensym("average_deviation")) x->feature = AVERAGE_DEVIATION;
else if(tmp == gensym("skewness")) x->feature = SKEWNESS;
else if(tmp == gensym("kurtosis")) x->feature = KURTOSIS;
+ else if(tmp == gensym("centroid")) x->feature = CENTROID;
else if(tmp == gensym("irregularity_k")) x->feature = IRREGULARITY_K;
else if(tmp == gensym("irregularity_j")) x->feature = IRREGULARITY_J;
else if(tmp == gensym("tristimulus_1")) x->feature = TRISTIMULUS_1;
diff --git a/src/libxtract.c b/src/libxtract.c
index b9a98ef..8202f6d 100644
--- a/src/libxtract.c
+++ b/src/libxtract.c
@@ -29,6 +29,7 @@ int(*xtract[])(float *, int, void *, float *) = {
xtract_average_deviation,
xtract_skewness,
xtract_kurtosis,
+ xtract_centroid,
xtract_irregularity_k,
xtract_irregularity_j,
xtract_tristimulus_1,
diff --git a/src/scalar.c b/src/scalar.c
index 1cc3128..111c300 100644
--- a/src/scalar.c
+++ b/src/scalar.c
@@ -84,6 +84,25 @@ int xtract_kurtosis(float *data, int N, void *argv, float *result){
}
+
+int xtract_centroid(float *data, int N, void *argv, float *result){
+
+ int n = N;
+
+ float *freqs, *amps, FA, A;
+
+ freqs = data;
+ amps = data + (N >> 1);
+
+ while(n--){
+ FA += freqs[n] * amps[n];
+ A += amps[n];
+ }
+
+ *result = FA / A;
+
+}
+
int xtract_irregularity_k(float *data, int N, void *argv, float *result){
int n,
diff --git a/xtract/libxtract.h b/xtract/libxtract.h
index f1da9c1..c9e43d2 100644
--- a/xtract/libxtract.h
+++ b/xtract/libxtract.h
@@ -38,7 +38,7 @@ extern "C" {
#include "xtract_types.h"
#include "xtract_macros.h"
-#define XTRACT_FEATURES 42
+#define XTRACT_FEATURES 43
#define LOG_LIMIT 10e-10
#define VERY_BIG_NUMBER 2e10
#define SR_LIMIT 192000
@@ -52,6 +52,7 @@ enum features_ {
AVERAGE_DEVIATION,
SKEWNESS,
KURTOSIS,
+ CENTROID,
IRREGULARITY_K,
IRREGULARITY_J,
TRISTIMULUS_1,
diff --git a/xtract/xtract_scalar.h b/xtract/xtract_scalar.h
index 6ddea98..bea7298 100644
--- a/xtract/xtract_scalar.h
+++ b/xtract/xtract_scalar.h
@@ -82,6 +82,15 @@ int xtract_skewness(float *data, int N, void *argv, float *result);
*/
int xtract_kurtosis(float *data, int N, void *argv, float *result);
+/** \brief Extract the kurtosis of an input vector
+ *
+ * \param *data: a pointer to the first element in an array of floats represeting a frequency spectrum of size N/2 and a magnitude peak spectrum of size N/2 (This is the output format of xtract_peaks)
+ * \param N: the number of elements to be considered
+ * \param *argv: a pointer to NULL
+ * \param *result: the centroid of the values pointed to by *data
+ */
+int xtract_centroid(float *data, int N, void *argv, float *result);
+
/** \brief Calculate the Irregularity of an input vector using a method described by Krimphoff (1994)
*
* \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector