diff options
-rw-r--r-- | examples/puredata/xtract~.c | 1 | ||||
-rw-r--r-- | src/libxtract.c | 1 | ||||
-rw-r--r-- | src/scalar.c | 19 | ||||
-rw-r--r-- | xtract/libxtract.h | 3 | ||||
-rw-r--r-- | xtract/xtract_scalar.h | 9 |
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 |