diff options
-rw-r--r-- | examples/puredata/xtract~.c | 11 | ||||
-rw-r--r-- | src/scalar.c | 23 | ||||
-rw-r--r-- | xtract/libxtract.h | 3 | ||||
-rw-r--r-- | xtract/xtract_scalar.h | 5 |
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); |