shithub: aubio

Download patch

ref: cf7c76a0350408b569c08743c1bb1180b777140a
parent: a0fd4e4defd8dbe992d110774b8ee7f239b91e8c
author: Paul Brossier <piem@altern.org>
date: Mon Apr 11 12:31:48 EDT 2005

update pitchyin.[ch] and pitchdetection.c

--- a/src/pitchdetection.c
+++ b/src/pitchdetection.c
@@ -103,16 +103,12 @@
 					p->buf->data[i][j] = ibuf->data[i][j];
 				}
 			}
-			/* get the autocorr and pitch */
-			aubio_pitchyin_diff(p->buf,p->yin);
-		        aubio_pitchyin_getcum(p->yin);
-		        pitch = aubio_pitchyin_getpitch(p->yin);
+		        pitch = aubio_pitchyin_getpitchfast(p->buf,p->yin, 0.5);
 		        if (pitch>0) {
 		                pitch = p->srate/(pitch+0.);
 		        } else {
 		                pitch = 0.;
 			}
-			//fprintf(stderr,"%f\n",pitch);
 			break;
 		case mcomb:
 			aubio_filter_do(p->filter,ibuf);
--- a/src/pitchyin.c
+++ b/src/pitchyin.c
@@ -82,41 +82,39 @@
 		}
 		tau++;
 	} while (tau<yin->length);
-	//AUBIO_DBG("No pitch found");
+	AUBIO_DBG("No pitch found");
 	return 0;
 }
 
 
 /* all the above in one */
-uint_t aubio_pitchyin_getpitchfast(fvec_t * input, fvec_t * yin){
-	uint_t c,j,tau = 0;
+uint_t aubio_pitchyin_getpitchfast(fvec_t * input, fvec_t * yin, smpl_t tol){
+	uint_t c=0,j,tau = 0;
 	smpl_t tmp = 0, tmp2;
-	for (c=0;c<input->channels;c++)
+	for (tau=0;tau<yin->length;tau++)
 	{
-		for (tau=0;tau<yin->length;tau++)
+		yin->data[c][tau] = 0.;
+	}
+	for (tau=1;tau<yin->length;tau++)
+	{
+		for (j=0;j<yin->length;j++)
 		{
-			yin->data[c][tau] = 0.;
+			tmp = input->data[c][j] - input->data[c][j+tau];
+			yin->data[c][tau] += SQR(tmp);
 		}
-		for (tau=1;tau<yin->length;tau++)
-		{
-			for (j=0;j<yin->length;j++)
-			{
-				tmp = input->data[c][j] - input->data[c][j+tau];
-				yin->data[c][tau] += SQR(tmp);
-			}
-		}
-		tmp2 = 0.;
-		yin->data[c][0] = 1.;
-		for (tau=1;tau<yin->length;tau++)
-		{
-			tmp += yin->data[c][tau];
-			yin->data[c][tau] *= tau/tmp;
-		}
 	}
+	tmp2 = 0.;
+	yin->data[c][0] = 1.;
+	for (tau=1;tau<yin->length;tau++)
+	{
+		tmp += yin->data[c][tau];
+		yin->data[c][tau] *= tau/tmp;
+	}
 	/* should merge the following with above */
+        tau = 1;
 	do 
 	{
-		if(yin->data[c][tau] < 0.1) { 
+		if(yin->data[c][tau] < tol) { 
 			while (yin->data[c][tau+1] < yin->data[c][tau]) {
 				tau++;
 			}
--- a/src/pitchyin.h
+++ b/src/pitchyin.h
@@ -38,7 +38,7 @@
 
 uint_t aubio_pitchyin_getpitch(fvec_t *yinbuf);
 
-uint_t aubio_pitchyin_getpitchfast(fvec_t * input, fvec_t *yinbuf);
+uint_t aubio_pitchyin_getpitchfast(fvec_t * input, fvec_t *yinbuf, smpl_t tol);
 
 #ifdef __cplusplus
 }