ref: 8c3f717231630680ccda9e2bff134dd8ee372928
parent: 269365558f536ae723ef22420137acd718a5c601
author: Paul Brossier <piem@piem.org>
date: Wed Apr 10 07:43:02 EDT 2013
src/pitch/pitch.{c,h}: add silence gate, default at -50dB
--- a/src/pitch/pitch.c
+++ b/src/pitch/pitch.c
@@ -35,6 +35,8 @@
#include "pitch/pitchspecacf.h"
#include "pitch/pitch.h"
+#define DEFAULT_PITCH_SILENCE -50.
+
/** pitch detection algorithms */
typedef enum
{
@@ -82,6 +84,7 @@
aubio_pitch_detect_t detect_cb; /**< callback to get the pitch candidates */
aubio_pitch_convert_t conv_cb; /**< callback to convert it to the desired unit */
aubio_pitch_get_conf_t conf_cb; /**< pointer to the current confidence callback */
+ smpl_t silence; /**< silence threshold */
};
/* callback functions for pitch detection */
@@ -130,6 +133,7 @@
p->type = pitch_type;
aubio_pitch_set_unit (p, "default");
p->bufsize = bufsize;
+ p->silence = DEFAULT_PITCH_SILENCE;
p->conf_cb = NULL;
switch (p->type) {
case aubio_pitcht_yin:
@@ -280,12 +284,33 @@
return AUBIO_OK;
}
+uint_t
+aubio_pitch_set_silence (aubio_pitch_t * p, smpl_t silence)
+{
+ if (silence < 0 && silence > -200) {
+ p->silence = silence;
+ return AUBIO_OK;
+ } else {
+ AUBIO_ERR("pitch: could do set silence to %.2f", silence);
+ return AUBIO_FAIL;
+ }
+}
+smpl_t
+aubio_pitch_get_silence (aubio_pitch_t * p)
+{
+ return p->silence;
+}
+
+
/* do method, calling the detection callback, then the conversion callback */
void
aubio_pitch_do (aubio_pitch_t * p, fvec_t * ibuf, fvec_t * obuf)
{
p->detect_cb (p, ibuf, obuf);
+ if (aubio_silence_detection(ibuf, p->silence) == 1) {
+ obuf->data[0] = 0.;
+ }
obuf->data[0] = p->conv_cb (obuf->data[0], p->samplerate, p->bufsize);
}
--- a/src/pitch/pitch.h
+++ b/src/pitch/pitch.h
@@ -82,6 +82,23 @@
*/
uint_t aubio_pitch_set_unit (aubio_pitch_t * o, char_t * mode);
+/** set the silence threshold of the pitch detection object
+
+ \param o pitch detection object as returned by new_aubio_pitch()
+ \param silence level threshold under which pitch should be ignored, in dB
+
+*/
+uint_t aubio_pitch_set_silence (aubio_pitch_t * o, smpl_t silence);
+
+/** set the silence threshold of the pitch detection object
+
+ \param o pitch detection object as returned by new_aubio_pitch()
+
+ \param return level threshold under which pitch should be ignored, in dB
+
+*/
+smpl_t aubio_pitch_get_silence (aubio_pitch_t * o);
+
/** get the current confidence
\param o pitch detection object as returned by new_aubio_pitch()