aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/puredata/xtract~.c11
-rw-r--r--src/scalar.c23
-rw-r--r--xtract/libxtract.h3
-rw-r--r--xtract/xtract_scalar.h5
4 files changed, 34 insertions, 8 deletions
diff --git a/examples/puredata/xtract~.c b/examples/puredata/xtract~.c
index 7866ff3..6c65e4b 100644
--- a/examples/puredata/xtract~.c
+++ b/examples/puredata/xtract~.c
@@ -123,11 +123,14 @@ static void *xtract_new(t_symbol *me, t_int argc, t_atom *argv) {
else if(tmp == gensym("sharpness")) x->feature = SHARPNESS;
else if(tmp == gensym("slope")) x->feature = SLOPE;
else if(tmp == gensym("f0")){
- x->feature = F0;
- x->argv = getbytes(sizeof(t_float));
- }
+ x->feature = F0;
+ x->argv = getbytes(sizeof(t_float));
+ }
else if(tmp == gensym("hps"))x->feature = HPS;
- else if(tmp == gensym("lowest_match"))x->feature = LOWEST_MATCH;
+ else if(tmp == gensym("lowest_match")){
+ x->feature = LOWEST_MATCH;
+ x->argv = getbytes(sizeof(t_float));
+ }
else if(tmp == gensym("magnitude_spectrum"))
x->feature = MAGNITUDE_SPECTRUM;
else if(tmp == gensym("autocorrelation")) x->feature = AUTOCORRELATION;
diff --git a/src/scalar.c b/src/scalar.c
index 111c300..95c77a0 100644
--- a/src/scalar.c
+++ b/src/scalar.c
@@ -436,6 +436,25 @@ int xtract_hps(float *data, int N, void *argv, float *result){
int xtract_f0(float *data, int N, void *argv, float *result){
- NOT_IMPLEMENTED;
-
+ int M, sr, tau, n;
+ float f0, err_tau_1, err_tau_x;
+
+ sr = *(float*)argv;
+ M = N >> 1;
+ err_tau_1 = 0;
+ for (n = 1; n < M; n++){
+ err_tau_1 = err_tau_1 + fabs(data[n] - data[n+1]);
+ }
+ for (tau = 2; tau < M; tau++){
+ err_tau_x = 0;
+ for (n = 1; n < M; n++){
+ err_tau_x = err_tau_x + fabs(data[n] - data[n+tau]);
+ }
+ if (err_tau_x < err_tau_1) {
+ f0 = sr / (tau + (err_tau_x / err_tau_1));
+ *result = f0;
+ return SUCCESS;
+ }
+ }
+ return NO_RESULT;
}
diff --git a/xtract/libxtract.h b/xtract/libxtract.h
index c9e43d2..9ab0663 100644
--- a/xtract/libxtract.h
+++ b/xtract/libxtract.h
@@ -109,7 +109,8 @@ enum return_codes_ {
SUCCESS,
MALLOC_FAILED,
BAD_ARGV,
- BAD_VECTOR_SIZE
+ BAD_VECTOR_SIZE,
+ NO_RESULT
};
/**
diff --git a/xtract/xtract_scalar.h b/xtract/xtract_scalar.h
index bea7298..96969bd 100644
--- a/xtract/xtract_scalar.h
+++ b/xtract/xtract_scalar.h
@@ -288,8 +288,11 @@ int xtract_hps(float *data, int N, void *argv, float *result);
*
* \param *data: a pointer to the first element in an array of floats representing an audio vector
* \param N: the number of elements to be considered
- * \param *argv: a pointer to NULL
+ * \param *argv: a pointer to a float representing the sample rate of the vector
* \param *result: the pitch of N values from the array pointed to by *data
+ *
+ * This algorithm is based on the AMDF and would benefit from further refinement
+ *
*/
int xtract_f0(float *data, int N, void *argv, float *result);