onsetdection.{c,h}: add spectral flux (L2 norm, only energy increases)
authorPaul Brossier <piem@piem.org>
Wed, 21 Nov 2007 11:01:22 +0000 (12:01 +0100)
committerPaul Brossier <piem@piem.org>
Wed, 21 Nov 2007 11:01:22 +0000 (12:01 +0100)
src/onsetdetection.c
src/onsetdetection.h

index de3ab7bd15678aa2f7e37e5393e5e09686dfbaff..b6ca035500dc7e2e8c205709f405be9abd8fe6e8 100644 (file)
@@ -195,6 +195,19 @@ void aubio_onsetdetection_mkl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec
   }
 }
 
+/* Spectral flux */
+void aubio_onsetdetection_specflux(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset){ 
+  uint_t i, j;
+  for (i=0;i<fftgrain->channels;i++) {
+    onset->data[i][0] = 0.;
+    for (j=0;j<fftgrain->length;j++) {
+      if (fftgrain->norm[i][j] > o->oldmag->data[i][j])
+        onset->data[i][0] += fftgrain->norm[i][j] - o->oldmag->data[i][j];
+      o->oldmag->data[i][j] = fftgrain->norm[i][j];
+    }
+  }
+}
+
 /* Generic function pointing to the choosen one */
 void 
 aubio_onsetdetection(aubio_onsetdetection_t *o, cvec_t * fftgrain, 
@@ -242,6 +255,7 @@ new_aubio_onsetdetection (aubio_onsetdetection_type type,
       break;
     case aubio_onset_kl:
     case aubio_onset_mkl:
+    case aubio_onset_specflux:
       o->oldmag = new_fvec(rsize,channels);
       break;
     default:
@@ -274,6 +288,9 @@ new_aubio_onsetdetection (aubio_onsetdetection_type type,
     case aubio_onset_mkl:
       o->funcpointer = aubio_onsetdetection_mkl;
       break;
+    case aubio_onset_specflux:
+      o->funcpointer = aubio_onsetdetection_specflux;
+      break;
     default:
       break;
   }
index 0034bfeb9059316c0260159dc7a289b1f3f1fc24..ba1c1329076926b295808a062c627e7d2eddd3ef 100644 (file)
@@ -47,6 +47,7 @@ typedef enum {
         aubio_onset_phase,          /**< phase fast */            
         aubio_onset_kl,             /**< Kullback Liebler */
         aubio_onset_mkl,            /**< modified Kullback Liebler */
+        aubio_onset_specflux,       /**< spectral flux */
 } aubio_onsetdetection_type;
 
 /** onsetdetection structure */
@@ -136,6 +137,18 @@ void aubio_onsetdetection_kl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_
 
 */
 void aubio_onsetdetection_mkl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset);
+/** Spectral Flux 
+
+  Simon Dixon, Onset Detection Revisited, in ``Proceedings of the 9th
+  International Conference on Digital Audio Effects'' (DAFx-06), Montreal,
+  Canada, 2006. 
+
+  \param o onset detection object as returned by new_aubio_onsetdetection()
+  \param fftgrain input spectral frame
+  \param onset output onset detection function
+
+*/
+void aubio_onsetdetection_specflux(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset);
 /** execute onset detection function on a spectral frame 
 
   Generic function to compute onset detection.