shithub: aubio

Download patch

ref: 3e17aed37ad2b2c7b1d5b7e4e0900b183416e058
parent: 2e4fb04084c09663b1f149a23d060925c3530ca9
author: Paul Brossier <piem@piem.org>
date: Thu Nov 5 19:06:27 EST 2009

src/: rename peakpick.h to peakpicker.h, make public again

--- a/src/aubio.h
+++ b/src/aubio.h
@@ -169,6 +169,7 @@
 #include "spectral/specdesc.h"
 #include "pitch/pitch.h"
 #include "onset/onset.h"
+#include "onset/peakpicker.h"
 #include "tempo/tempo.h"
 
 #if AUBIO_UNSTABLE
@@ -184,7 +185,6 @@
 #include "pitch/pitchyinfft.h"
 #include "pitch/pitchschmitt.h"
 #include "pitch/pitchfcomb.h"
-#include "onset/peakpick.h"
 #include "tempo/beattracking.h"
 #endif
 
--- a/src/onset/onset.c
+++ b/src/onset/onset.c
@@ -23,7 +23,7 @@
 #include "cvec.h"
 #include "spectral/specdesc.h"
 #include "spectral/phasevoc.h"
-#include "onset/peakpick.h"
+#include "onset/peakpicker.h"
 #include "mathutils.h"
 #include "onset/onset.h"
 
--- a/src/onset/peakpick.c
+++ /dev/null
@@ -1,212 +1,0 @@
-/*
-  Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
-
-  This file is part of aubio.
-
-  aubio is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  aubio is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with aubio.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-#include "aubio_priv.h"
-#include "fvec.h"
-#include "mathutils.h"
-#include "lvec.h"
-#include "temporal/filter.h"
-#include "temporal/biquad.h"
-#include "onset/peakpick.h"
-
-/** function pointer to thresholding function */
-typedef smpl_t (*aubio_thresholdfn_t)(fvec_t *input, uint_t channel);
-/** function pointer to peak-picking function */
-typedef uint_t (*aubio_pickerfn_t)(fvec_t *input, uint_t pos);
-
-/** set peak picker thresholding function */
-uint_t aubio_peakpicker_set_thresholdfn(aubio_peakpicker_t * p, aubio_thresholdfn_t thresholdfn);
-/** get peak picker thresholding function */
-aubio_thresholdfn_t aubio_peakpicker_get_thresholdfn(aubio_peakpicker_t * p);
-
-/* peak picking parameters, default values in brackets
- *
- *     [<----post----|--pre-->]
- *  .................|.............
- *  time->           ^now
- */
-struct _aubio_peakpicker_t
-{
-        /** thresh: offset threshold [0.033 or 0.01] */
-  smpl_t threshold;
-        /** win_post: median filter window length (causal part) [8] */
-  uint_t win_post;
-        /** pre: median filter window (anti-causal part) [post-1] */
-  uint_t win_pre;
-        /** threshfn: name or handle of fn for computing adaptive threshold [median]  */
-  aubio_thresholdfn_t thresholdfn;
-        /** picker: name or handle of fn for picking event times [peakpick] */
-  aubio_pickerfn_t pickerfn;
-
-        /** biquad lowpass filter */
-  aubio_filter_t *biquad;
-        /** original onsets */
-  fvec_t *onset_keep;
-        /** modified onsets */
-  fvec_t *onset_proc;
-        /** peak picked window [3] */
-  fvec_t *onset_peek;
-        /** thresholded function */
-  fvec_t *thresholded;
-        /** scratch pad for biquad and median */
-  fvec_t *scratch;
-
-  /** number of channels to analyse */
-  uint_t channels;
-
-        /** \bug should be used to calculate filter coefficients */
-  /* cutoff: low-pass filter cutoff [0.34, 1] */
-  /* smpl_t cutoff; */
-
-  /* not used anymore */
-  /* time precision [512/44100  winlength/samplerate, fs/buffer_size */
-  /* smpl_t tau; */
-  /* alpha: normalisation exponent [9] */
-  /* smpl_t alpha; */
-};
-
-
-/** modified version for real time, moving mean adaptive threshold this method
- * is slightly more permissive than the offline one, and yelds to an increase
- * of false positives. best  */
-void
-aubio_peakpicker_do (aubio_peakpicker_t * p, fvec_t * onset, fvec_t * out)
-{
-  fvec_t *onset_keep = p->onset_keep;
-  fvec_t *onset_proc = p->onset_proc;
-  fvec_t *onset_peek = p->onset_peek;
-  fvec_t *thresholded = p->thresholded;
-  fvec_t *scratch = p->scratch;
-  smpl_t mean = 0., median = 0.;
-  uint_t length = p->win_post + p->win_pre + 1;
-  uint_t i, j = 0;
-
-  for (i = 0; i < p->channels; i++) {
-    /* store onset in onset_keep */
-    /* shift all elements but last, then write last */
-    for (j = 0; j < length - 1; j++) {
-      onset_keep->data[i][j] = onset_keep->data[i][j + 1];
-      onset_proc->data[i][j] = onset_keep->data[i][j];
-    }
-    onset_keep->data[i][length - 1] = onset->data[i][0];
-    onset_proc->data[i][length - 1] = onset->data[i][0];
-  }
-
-  /* filter onset_proc */
-  /** \bug filtfilt calculated post+pre times, should be only once !? */
-  aubio_filter_do_filtfilt (p->biquad, onset_proc, scratch);
-
-  for (i = 0; i < p->channels; i++) {
-    /* calculate mean and median for onset_proc */
-    mean = fvec_mean_channel (onset_proc, i);
-    /* copy to scratch */
-    for (j = 0; j < length; j++)
-      scratch->data[i][j] = onset_proc->data[i][j];
-    median = p->thresholdfn (scratch, i);
-
-    /* shift peek array */
-    for (j = 0; j < 3 - 1; j++)
-      onset_peek->data[i][j] = onset_peek->data[i][j + 1];
-    /* calculate new tresholded value */
-    thresholded->data[i][0] =
-        onset_proc->data[i][p->win_post] - median - mean * p->threshold;
-    onset_peek->data[i][2] = thresholded->data[i][0];
-    out->data[i][0] = (p->pickerfn) (onset_peek, 1);
-    if (out->data[i][0]) {
-      out->data[i][0] = fvec_quadint (onset_peek, 1, i);
-    }
-  }
-}
-
-/** this method returns the current value in the pick peaking buffer
- * after smoothing
- */
-fvec_t *
-aubio_peakpicker_get_thresholded_input (aubio_peakpicker_t * p)
-{
-  return p->thresholded;
-}
-
-uint_t
-aubio_peakpicker_set_threshold (aubio_peakpicker_t * p, smpl_t threshold)
-{
-  p->threshold = threshold;
-  return AUBIO_OK;
-}
-
-smpl_t
-aubio_peakpicker_get_threshold (aubio_peakpicker_t * p)
-{
-  return p->threshold;
-}
-
-uint_t
-aubio_peakpicker_set_thresholdfn (aubio_peakpicker_t * p,
-    aubio_thresholdfn_t thresholdfn)
-{
-  p->thresholdfn = thresholdfn;
-  return AUBIO_OK;
-}
-
-aubio_thresholdfn_t
-aubio_peakpicker_get_thresholdfn (aubio_peakpicker_t * p)
-{
-  return (aubio_thresholdfn_t) (p->thresholdfn);
-}
-
-aubio_peakpicker_t *
-new_aubio_peakpicker (uint_t channels)
-{
-  aubio_peakpicker_t *t = AUBIO_NEW (aubio_peakpicker_t);
-  t->threshold = 0.1;           /* 0.0668; 0.33; 0.082; 0.033; */
-  t->win_post = 5;
-  t->win_pre = 1;
-  //channels = 1;
-  t->channels = channels;
-
-  t->thresholdfn = (aubio_thresholdfn_t) (fvec_median_channel); /* (fvec_mean); */
-  t->pickerfn = (aubio_pickerfn_t) (fvec_peakpick);
-
-  t->scratch = new_fvec (t->win_post + t->win_pre + 1, channels);
-  t->onset_keep = new_fvec (t->win_post + t->win_pre + 1, channels);
-  t->onset_proc = new_fvec (t->win_post + t->win_pre + 1, channels);
-  t->onset_peek = new_fvec (3, channels);
-  t->thresholded = new_fvec (1, channels);
-
-  /* cutoff: low-pass filter with cutoff reduced frequency at 0.34
-     generated with octave butter function: [b,a] = butter(2, 0.34);
-   */
-  t->biquad = new_aubio_filter_biquad (0.15998789, 0.31997577, 0.15998789,
-      -0.59488894, 0.23484048, channels);
-
-  return t;
-}
-
-void
-del_aubio_peakpicker (aubio_peakpicker_t * p)
-{
-  del_aubio_filter (p->biquad);
-  del_fvec (p->onset_keep);
-  del_fvec (p->onset_proc);
-  del_fvec (p->onset_peek);
-  del_fvec (p->thresholded);
-  del_fvec (p->scratch);
-  AUBIO_FREE (p);
-}
--- a/src/onset/peakpick.h
+++ /dev/null
@@ -1,55 +1,0 @@
-/*
-  Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
-
-  This file is part of aubio.
-
-  aubio is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, either version 3 of the License, or
-  (at your option) any later version.
-
-  aubio is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with aubio.  If not, see <http://www.gnu.org/licenses/>.
-
-*/
-
-/** \file 
- 
-  Peak picking utilities function
-  
-*/
-
-#ifndef PEAKPICK_H
-#define PEAKPICK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** peak-picker structure */
-typedef struct _aubio_peakpicker_t aubio_peakpicker_t;
-
-/** peak-picker creation function */
-aubio_peakpicker_t * new_aubio_peakpicker(uint_t channels);
-/** real time peak picking function */
-void aubio_peakpicker_do(aubio_peakpicker_t * p, fvec_t * in, fvec_t * out);
-/** destroy peak picker structure */
-void del_aubio_peakpicker(aubio_peakpicker_t * p);
-
-/** get current peak value */
-fvec_t *aubio_peakpicker_get_thresholded_input (aubio_peakpicker_t * p);
-/** set peak picking threshold */
-uint_t aubio_peakpicker_set_threshold(aubio_peakpicker_t * p, smpl_t threshold);
-/** get peak picking threshold */
-smpl_t aubio_peakpicker_get_threshold(aubio_peakpicker_t * p);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* PEAKPICK_H */
--- /dev/null
+++ b/src/onset/peakpicker.c
@@ -1,0 +1,212 @@
+/*
+  Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
+
+  This file is part of aubio.
+
+  aubio is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  aubio is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with aubio.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "aubio_priv.h"
+#include "fvec.h"
+#include "mathutils.h"
+#include "lvec.h"
+#include "temporal/filter.h"
+#include "temporal/biquad.h"
+#include "onset/peakpicker.h"
+
+/** function pointer to thresholding function */
+typedef smpl_t (*aubio_thresholdfn_t)(fvec_t *input, uint_t channel);
+/** function pointer to peak-picking function */
+typedef uint_t (*aubio_pickerfn_t)(fvec_t *input, uint_t pos);
+
+/** set peak picker thresholding function */
+uint_t aubio_peakpicker_set_thresholdfn(aubio_peakpicker_t * p, aubio_thresholdfn_t thresholdfn);
+/** get peak picker thresholding function */
+aubio_thresholdfn_t aubio_peakpicker_get_thresholdfn(aubio_peakpicker_t * p);
+
+/* peak picking parameters, default values in brackets
+ *
+ *     [<----post----|--pre-->]
+ *  .................|.............
+ *  time->           ^now
+ */
+struct _aubio_peakpicker_t
+{
+        /** thresh: offset threshold [0.033 or 0.01] */
+  smpl_t threshold;
+        /** win_post: median filter window length (causal part) [8] */
+  uint_t win_post;
+        /** pre: median filter window (anti-causal part) [post-1] */
+  uint_t win_pre;
+        /** threshfn: name or handle of fn for computing adaptive threshold [median]  */
+  aubio_thresholdfn_t thresholdfn;
+        /** picker: name or handle of fn for picking event times [peakpick] */
+  aubio_pickerfn_t pickerfn;
+
+        /** biquad lowpass filter */
+  aubio_filter_t *biquad;
+        /** original onsets */
+  fvec_t *onset_keep;
+        /** modified onsets */
+  fvec_t *onset_proc;
+        /** peak picked window [3] */
+  fvec_t *onset_peek;
+        /** thresholded function */
+  fvec_t *thresholded;
+        /** scratch pad for biquad and median */
+  fvec_t *scratch;
+
+  /** number of channels to analyse */
+  uint_t channels;
+
+        /** \bug should be used to calculate filter coefficients */
+  /* cutoff: low-pass filter cutoff [0.34, 1] */
+  /* smpl_t cutoff; */
+
+  /* not used anymore */
+  /* time precision [512/44100  winlength/samplerate, fs/buffer_size */
+  /* smpl_t tau; */
+  /* alpha: normalisation exponent [9] */
+  /* smpl_t alpha; */
+};
+
+
+/** modified version for real time, moving mean adaptive threshold this method
+ * is slightly more permissive than the offline one, and yelds to an increase
+ * of false positives. best  */
+void
+aubio_peakpicker_do (aubio_peakpicker_t * p, fvec_t * onset, fvec_t * out)
+{
+  fvec_t *onset_keep = p->onset_keep;
+  fvec_t *onset_proc = p->onset_proc;
+  fvec_t *onset_peek = p->onset_peek;
+  fvec_t *thresholded = p->thresholded;
+  fvec_t *scratch = p->scratch;
+  smpl_t mean = 0., median = 0.;
+  uint_t length = p->win_post + p->win_pre + 1;
+  uint_t i, j = 0;
+
+  for (i = 0; i < p->channels; i++) {
+    /* store onset in onset_keep */
+    /* shift all elements but last, then write last */
+    for (j = 0; j < length - 1; j++) {
+      onset_keep->data[i][j] = onset_keep->data[i][j + 1];
+      onset_proc->data[i][j] = onset_keep->data[i][j];
+    }
+    onset_keep->data[i][length - 1] = onset->data[i][0];
+    onset_proc->data[i][length - 1] = onset->data[i][0];
+  }
+
+  /* filter onset_proc */
+  /** \bug filtfilt calculated post+pre times, should be only once !? */
+  aubio_filter_do_filtfilt (p->biquad, onset_proc, scratch);
+
+  for (i = 0; i < p->channels; i++) {
+    /* calculate mean and median for onset_proc */
+    mean = fvec_mean_channel (onset_proc, i);
+    /* copy to scratch */
+    for (j = 0; j < length; j++)
+      scratch->data[i][j] = onset_proc->data[i][j];
+    median = p->thresholdfn (scratch, i);
+
+    /* shift peek array */
+    for (j = 0; j < 3 - 1; j++)
+      onset_peek->data[i][j] = onset_peek->data[i][j + 1];
+    /* calculate new tresholded value */
+    thresholded->data[i][0] =
+        onset_proc->data[i][p->win_post] - median - mean * p->threshold;
+    onset_peek->data[i][2] = thresholded->data[i][0];
+    out->data[i][0] = (p->pickerfn) (onset_peek, 1);
+    if (out->data[i][0]) {
+      out->data[i][0] = fvec_quadint (onset_peek, 1, i);
+    }
+  }
+}
+
+/** this method returns the current value in the pick peaking buffer
+ * after smoothing
+ */
+fvec_t *
+aubio_peakpicker_get_thresholded_input (aubio_peakpicker_t * p)
+{
+  return p->thresholded;
+}
+
+uint_t
+aubio_peakpicker_set_threshold (aubio_peakpicker_t * p, smpl_t threshold)
+{
+  p->threshold = threshold;
+  return AUBIO_OK;
+}
+
+smpl_t
+aubio_peakpicker_get_threshold (aubio_peakpicker_t * p)
+{
+  return p->threshold;
+}
+
+uint_t
+aubio_peakpicker_set_thresholdfn (aubio_peakpicker_t * p,
+    aubio_thresholdfn_t thresholdfn)
+{
+  p->thresholdfn = thresholdfn;
+  return AUBIO_OK;
+}
+
+aubio_thresholdfn_t
+aubio_peakpicker_get_thresholdfn (aubio_peakpicker_t * p)
+{
+  return (aubio_thresholdfn_t) (p->thresholdfn);
+}
+
+aubio_peakpicker_t *
+new_aubio_peakpicker (uint_t channels)
+{
+  aubio_peakpicker_t *t = AUBIO_NEW (aubio_peakpicker_t);
+  t->threshold = 0.1;           /* 0.0668; 0.33; 0.082; 0.033; */
+  t->win_post = 5;
+  t->win_pre = 1;
+  //channels = 1;
+  t->channels = channels;
+
+  t->thresholdfn = (aubio_thresholdfn_t) (fvec_median_channel); /* (fvec_mean); */
+  t->pickerfn = (aubio_pickerfn_t) (fvec_peakpick);
+
+  t->scratch = new_fvec (t->win_post + t->win_pre + 1, channels);
+  t->onset_keep = new_fvec (t->win_post + t->win_pre + 1, channels);
+  t->onset_proc = new_fvec (t->win_post + t->win_pre + 1, channels);
+  t->onset_peek = new_fvec (3, channels);
+  t->thresholded = new_fvec (1, channels);
+
+  /* cutoff: low-pass filter with cutoff reduced frequency at 0.34
+     generated with octave butter function: [b,a] = butter(2, 0.34);
+   */
+  t->biquad = new_aubio_filter_biquad (0.15998789, 0.31997577, 0.15998789,
+      -0.59488894, 0.23484048, channels);
+
+  return t;
+}
+
+void
+del_aubio_peakpicker (aubio_peakpicker_t * p)
+{
+  del_aubio_filter (p->biquad);
+  del_fvec (p->onset_keep);
+  del_fvec (p->onset_proc);
+  del_fvec (p->onset_peek);
+  del_fvec (p->thresholded);
+  del_fvec (p->scratch);
+  AUBIO_FREE (p);
+}
--- /dev/null
+++ b/src/onset/peakpicker.h
@@ -1,0 +1,55 @@
+/*
+  Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
+
+  This file is part of aubio.
+
+  aubio is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  aubio is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with aubio.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+/** \file 
+ 
+  Peak picking utilities function
+  
+*/
+
+#ifndef PEAKPICK_H
+#define PEAKPICK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** peak-picker structure */
+typedef struct _aubio_peakpicker_t aubio_peakpicker_t;
+
+/** peak-picker creation function */
+aubio_peakpicker_t * new_aubio_peakpicker(uint_t channels);
+/** real time peak picking function */
+void aubio_peakpicker_do(aubio_peakpicker_t * p, fvec_t * in, fvec_t * out);
+/** destroy peak picker structure */
+void del_aubio_peakpicker(aubio_peakpicker_t * p);
+
+/** get current peak value */
+fvec_t *aubio_peakpicker_get_thresholded_input (aubio_peakpicker_t * p);
+/** set peak picking threshold */
+uint_t aubio_peakpicker_set_threshold(aubio_peakpicker_t * p, smpl_t threshold);
+/** get peak picking threshold */
+smpl_t aubio_peakpicker_get_threshold(aubio_peakpicker_t * p);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PEAKPICK_H */
--- a/src/tempo/tempo.c
+++ b/src/tempo/tempo.c
@@ -24,7 +24,7 @@
 #include "spectral/specdesc.h"
 #include "tempo/beattracking.h"
 #include "spectral/phasevoc.h"
-#include "onset/peakpick.h"
+#include "onset/peakpicker.h"
 #include "mathutils.h"
 #include "tempo/tempo.h"