Changes in / [2a7bcaa:911b175d]


Ignore:
Files:
3 added
15 edited

Legend:

Unmodified
Added
Removed
  • examples/aubioonset.c

    r2a7bcaa r911b175d  
    4444    aubio_wavetable_stop ( wavetable );
    4545  }
    46   if (mix_input)
     46  if (mix_input) {
    4747    aubio_wavetable_do (wavetable, ibuf, obuf);
    48   else
     48    fvec_clamp(obuf, 1.);
     49  } else {
    4950    aubio_wavetable_do (wavetable, obuf, obuf);
     51  }
    5052}
    5153
  • examples/aubiotrack.c

    r2a7bcaa r911b175d  
    4747    aubio_wavetable_stop ( wavetable );
    4848  }
    49   if (mix_input)
     49  if (mix_input) {
    5050    aubio_wavetable_do (wavetable, ibuf, obuf);
    51   else
     51    fvec_clamp(obuf, 1.);
     52  } else {
    5253    aubio_wavetable_do (wavetable, obuf, obuf);
     54  }
    5355}
    5456
  • python/lib/gen_code.py

    r2a7bcaa r911b175d  
    184184    def gen_code(self):
    185185        out = ""
    186         out += self.gen_struct()
    187         out += self.gen_doc()
    188         out += self.gen_new()
    189         out += self.gen_init()
    190         out += self.gen_del()
    191         out += self.gen_do()
    192         out += self.gen_memberdef()
    193         out += self.gen_set()
    194         out += self.gen_get()
    195         out += self.gen_methodef()
    196         out += self.gen_typeobject()
     186        try:
     187            out += self.gen_struct()
     188            out += self.gen_doc()
     189            out += self.gen_new()
     190            out += self.gen_init()
     191            out += self.gen_del()
     192            out += self.gen_do()
     193            out += self.gen_memberdef()
     194            out += self.gen_set()
     195            out += self.gen_get()
     196            out += self.gen_methodef()
     197            out += self.gen_typeobject()
     198        except Exception as e:
     199            print ("Failed generating code for", self.shortname)
     200            raise
    197201        return out
    198202
  • python/lib/gen_external.py

    r2a7bcaa r911b175d  
    4040  #'sampler',
    4141  'audio_unit',
     42  'spectral_whitening',
    4243  ]
    4344
  • src/aubio.h

    r2a7bcaa r911b175d  
    188188#include "spectral/mfcc.h"
    189189#include "spectral/specdesc.h"
     190#include "spectral/awhitening.h"
    190191#include "spectral/tss.h"
    191192#include "pitch/pitch.h"
  • src/cvec.c

    r2a7bcaa r911b175d  
    140140  cvec_phas_zeros(s);
    141141}
     142
     143void cvec_logmag(cvec_t *s, smpl_t lambda) {
     144  uint_t j;
     145  for (j=0; j< s->length; j++) {
     146    s->norm[j] = LOG(lambda * s->norm[j] + 1);
     147  }
     148}
  • src/cvec.h

    r2a7bcaa r911b175d  
    231231void cvec_zeros(cvec_t *s);
    232232
     233/** take logarithmic magnitude
     234
     235  \param s input cvec to compress
     236  \param lambda value to use for normalisation
     237
     238*/
     239void cvec_logmag(cvec_t *s, smpl_t lambda);
     240
    233241#ifdef __cplusplus
    234242}
  • src/mathutils.c

    r2a7bcaa r911b175d  
    290290}
    291291
     292void fvec_push(fvec_t *in, smpl_t new_elem) {
     293  uint_t i;
     294  for (i = 0; i < in->length - 1; i++) {
     295    in->data[i] = in->data[i + 1];
     296  }
     297  in->data[in->length - 1] = new_elem;
     298}
     299
     300void fvec_clamp(fvec_t *in, smpl_t absmax) {
     301  uint_t i;
     302  for (i = 0; i < in->length; i++) {
     303    if (in->data[i] > 0 && in->data[i] > ABS(absmax)) {
     304      in->data[i] = absmax;
     305    } else if (in->data[i] < 0 && in->data[i] < -ABS(absmax)) {
     306      in->data[i] = -absmax;
     307    }
     308  }
     309}
     310
    292311smpl_t
    293312aubio_level_lin (const fvec_t * f)
  • src/mathutils.h

    r2a7bcaa r911b175d  
    117117*/
    118118void fvec_ishift (fvec_t * v);
     119
     120/** push a new element to the end of a vector, erasing the first element and
     121 * sliding all others
     122
     123  \param in vector to push to
     124  \param new_elem new_element to add at the end of the vector
     125
     126  In numpy words, this is equivalent to: in = np.concatenate([in, [new_elem]])[1:]
     127
     128*/
     129void fvec_push(fvec_t *in, smpl_t new_elem);
    119130
    120131/** compute the sum of all elements of a vector
  • src/musicutils.h

    r2a7bcaa r911b175d  
    157157smpl_t aubio_level_detection (const fvec_t * v, smpl_t threshold);
    158158
     159/** clamp the values of a vector within the range [-abs(max), abs(max)]
     160
     161  \param in vector to clamp
     162  \param absmax maximum value over which input vector elements should be clamped
     163
     164*/
     165void fvec_clamp(fvec_t *in, smpl_t absmax);
     166
    159167#ifdef __cplusplus
    160168}
  • src/onset/onset.c

    r2a7bcaa r911b175d  
    2424#include "spectral/specdesc.h"
    2525#include "spectral/phasevoc.h"
     26#include "spectral/awhitening.h"
    2627#include "onset/peakpicker.h"
    2728#include "mathutils.h"
    2829#include "onset/onset.h"
     30
     31void aubio_onset_default_parameters (aubio_onset_t *o, const char_t * method);
    2932
    3033/** structure to store object state */
     
    4346  uint_t total_frames;          /**< total number of frames processed since the beginning */
    4447  uint_t last_onset;            /**< last detected onset location, in frames */
     48
     49  uint_t apply_compression;
     50  smpl_t lambda_compression;
     51  uint_t apply_adaptive_whitening;
     52  aubio_spectral_whitening_t *spectral_whitening;
    4553};
    4654
     
    5058  smpl_t isonset = 0;
    5159  aubio_pvoc_do (o->pv,input, o->fftgrain);
     60  /*
     61  if (apply_filtering) {
     62  }
     63  */
     64  if (o->apply_adaptive_whitening) {
     65    aubio_spectral_whitening_do(o->spectral_whitening, o->fftgrain);
     66  }
     67  if (o->apply_compression) {
     68    cvec_logmag(o->fftgrain, o->apply_compression);
     69  }
    5270  aubio_specdesc_do (o->od, o->fftgrain, o->desc);
    5371  aubio_peakpicker_do(o->pp, o->desc, onset);
     
    100118}
    101119
     120uint_t aubio_onset_set_adaptive_whitening (aubio_onset_t *o, uint_t apply_adaptive_whitening)
     121{
     122  o->apply_adaptive_whitening = apply_adaptive_whitening;
     123  return AUBIO_OK;
     124}
     125
     126uint_t aubio_onset_get_adaptive_whitening (aubio_onset_t *o)
     127{
     128  return o->apply_adaptive_whitening;
     129}
     130
    102131uint_t aubio_onset_set_silence(aubio_onset_t * o, smpl_t silence) {
    103132  o->silence = silence;
     
    210239  o->desc = new_fvec(1);
    211240
    212   /* set some default parameter */
    213   aubio_onset_set_threshold (o, 0.3);
    214   aubio_onset_set_delay(o, 4.3 * hop_size);
    215   aubio_onset_set_minioi_ms(o, 20.);
    216   aubio_onset_set_silence(o, -70.);
     241  o->spectral_whitening = new_aubio_spectral_whitening(buf_size, hop_size, samplerate);
     242
     243  aubio_onset_default_parameters (o, onset_mode);
    217244
    218245  /* initialize internal variables */
     
    229256}
    230257
     258void aubio_onset_default_parameters (aubio_onset_t * o, const char_t * onset_mode)
     259{
     260  /* set some default parameter */
     261  aubio_onset_set_threshold (o, 0.3);
     262  aubio_onset_set_delay (o, 4.3 * o->hop_size);
     263  aubio_onset_set_minioi_ms (o, 50.);
     264  aubio_onset_set_silence (o, -70.);
     265  aubio_onset_set_adaptive_whitening (o, 0);
     266
     267  o->apply_compression = 0;
     268  o->lambda_compression = 1.;
     269
     270  /* method specific optimisations */
     271  if (strcmp (onset_mode, "energy") == 0) {
     272  } else if (strcmp (onset_mode, "hfc") == 0 || strcmp (onset_mode, "default") == 0) {
     273    aubio_onset_set_threshold (o, 0.058);
     274    o->apply_compression = 1;
     275    o->lambda_compression = 1.;
     276    aubio_onset_set_adaptive_whitening (o, 0);
     277  } else if (strcmp (onset_mode, "complexdomain") == 0
     278             || strcmp (onset_mode, "complex") == 0) {
     279    aubio_onset_set_delay (o, 4.6 * o->hop_size);
     280    aubio_onset_set_threshold (o, 0.15);
     281    o->apply_compression = 1;
     282    o->lambda_compression = 1.;
     283  } else if (strcmp (onset_mode, "phase") == 0) {
     284    o->apply_compression = 0;
     285    aubio_onset_set_adaptive_whitening (o, 0);
     286  } else if (strcmp (onset_mode, "mkl") == 0) {
     287    aubio_onset_set_threshold (o, 0.05);
     288  } else if (strcmp (onset_mode, "kl") == 0) {
     289    aubio_onset_set_threshold (o, 0.35);
     290  } else if (strcmp (onset_mode, "specflux") == 0) {
     291    aubio_onset_set_threshold (o, 0.4);
     292  } else if (strcmp (onset_mode, "specdiff") == 0) {
     293  } else {
     294    AUBIO_WRN("onset: unknown spectral descriptor type %s, "
     295               "using default parameters.\n", onset_mode);
     296  }
     297}
     298
    231299void del_aubio_onset (aubio_onset_t *o)
    232300{
     301  del_aubio_spectral_whitening(o->spectral_whitening);
    233302  del_aubio_specdesc(o->od);
    234303  del_aubio_peakpicker(o->pp);
  • src/onset/onset.h

    r2a7bcaa r911b175d  
    118118smpl_t aubio_onset_get_last_ms (const aubio_onset_t *o);
    119119
     120/** set onset detection adaptive whitening
     121
     122  \param o onset detection object as returned by new_aubio_onset()
     123  \param apply_adaptive_whitening 1 to enable, 0 to disable
     124
     125*/
     126uint_t aubio_onset_set_adaptive_whitening(aubio_onset_t * o, uint_t apply_adaptive_whitening);
     127
     128/** get onset detection silence threshold
     129
     130  \param o onset detection object as returned by new_aubio_onset()
     131
     132  \return adaptive whitening mode, 1 if enabled, 0 otherwise
     133
     134*/
     135uint_t aubio_onset_get_adaptive_whitening(aubio_onset_t * o);
     136
    120137/** set onset detection silence threshold
    121138
  • src/onset/peakpicker.c

    r2a7bcaa r911b175d  
    9393  fvec_t *scratch = p->scratch;
    9494  smpl_t mean = 0., median = 0.;
    95   uint_t length = p->win_post + p->win_pre + 1;
    9695  uint_t j = 0;
    9796
    98   /* store onset in onset_keep */
    99   /* shift all elements but last, then write last */
    100   for (j = 0; j < length - 1; j++) {
    101     onset_keep->data[j] = onset_keep->data[j + 1];
    102     onset_proc->data[j] = onset_keep->data[j];
    103   }
    104   onset_keep->data[length - 1] = onset->data[0];
    105   onset_proc->data[length - 1] = onset->data[0];
     97  /* push new novelty to the end */
     98  fvec_push(onset_keep, onset->data[0]);
     99  /* store a copy */
     100  fvec_copy(onset_keep, onset_proc);
    106101
    107   /* filter onset_proc */
    108   /** \bug filtfilt calculated post+pre times, should be only once !? */
     102  /* filter this copy */
    109103  aubio_filter_do_filtfilt (p->biquad, onset_proc, scratch);
    110104
    111105  /* calculate mean and median for onset_proc */
    112106  mean = fvec_mean (onset_proc);
    113   /* copy to scratch */
    114   for (j = 0; j < length; j++)
    115     scratch->data[j] = onset_proc->data[j];
     107
     108  /* copy to scratch and compute its median */
     109  fvec_copy(onset_proc, scratch);
    116110  median = p->thresholdfn (scratch);
    117111
  • src/spectral/specdesc.c

    r2a7bcaa r911b175d  
    3131void aubio_specdesc_complex(aubio_specdesc_t *o, const cvec_t * fftgrain, fvec_t * onset);
    3232void aubio_specdesc_phase(aubio_specdesc_t *o, const cvec_t * fftgrain, fvec_t * onset);
     33void aubio_specdesc_wphase(aubio_specdesc_t *o, const cvec_t * fftgrain, fvec_t * onset);
    3334void aubio_specdesc_specdiff(aubio_specdesc_t *o, const cvec_t * fftgrain, fvec_t * onset);
    3435void aubio_specdesc_kl(aubio_specdesc_t *o, const cvec_t * fftgrain, fvec_t * onset);
     
    5859        aubio_onset_complex,        /**< complex domain */       
    5960        aubio_onset_phase,          /**< phase fast */           
     61        aubio_onset_wphase,         /**< weighted phase */
    6062        aubio_onset_kl,             /**< Kullback Liebler */
    6163        aubio_onset_mkl,            /**< modified Kullback Liebler */
     
    158160  onset->data[0] = aubio_hist_mean(o->histog); 
    159161  //onset->data[0] = fvec_mean(o->dev1);
     162}
     163
     164/* weighted phase */
     165void
     166aubio_specdesc_wphase(aubio_specdesc_t *o,
     167    const cvec_t *fftgrain, fvec_t *onset) {
     168  uint_t i;
     169  aubio_specdesc_phase(o, fftgrain, onset);
     170  for (i = 0; i < fftgrain->length; i++) {
     171    o->dev1->data[i] *= fftgrain->norm[i];
     172  }
     173  /* apply o->histogram */
     174  aubio_hist_dyn_notnull(o->histog,o->dev1);
     175  /* weight it */
     176  aubio_hist_weight(o->histog);
     177  /* its mean is the result */
     178  onset->data[0] = aubio_hist_mean(o->histog);
    160179}
    161180
     
    251270  else if (strcmp (onset_mode, "phase") == 0)
    252271      onset_type = aubio_onset_phase;
     272  else if (strcmp (onset_mode, "wphase") == 0)
     273      onset_type = aubio_onset_wphase;
    253274  else if (strcmp (onset_mode, "mkl") == 0)
    254275      onset_type = aubio_onset_mkl;
     
    292313      break;
    293314    case aubio_onset_phase:
     315    case aubio_onset_wphase:
    294316      o->dev1   = new_fvec(rsize);
    295317      o->theta1 = new_fvec(rsize);
     
    326348      o->funcpointer = aubio_specdesc_phase;
    327349      break;
     350    case aubio_onset_wphase:
     351      o->funcpointer = aubio_specdesc_wphase;
     352      break;
    328353    case aubio_onset_specdiff:
    329354      o->funcpointer = aubio_specdesc_specdiff;
     
    379404      break;
    380405    case aubio_onset_phase:
     406    case aubio_onset_wphase:
    381407      del_fvec(o->dev1);
    382408      del_fvec(o->theta1);
  • src/spectral/specdesc.h

    r2a7bcaa r911b175d  
    6060  Hong-Kong, 2003.
    6161
     62  \b \p wphase : Weighted Phase Deviation onset detection function
     63
     64  S. Dixon. Onset detection revisited. In Proceedings of the 9th International
     65  Conference on Digital Audio Ef- fects (DAFx) , pages 133–137, 2006.
     66
     67  http://www.eecs.qmul.ac.uk/~simond/pub/2006/dafx.pdf
     68
    6269  \b \p specdiff : Spectral difference method onset detection function
    6370
     
    175182  The parameter \p method is a string that can be any of:
    176183
    177     - `energy`, `hfc`, `complex`, `phase`, `specdiff`, `kl`, `mkl`, `specflux`
    178     - `centroid`, `spread`, `skewness`, `kurtosis`, `slope`, `decrease`, `rolloff`
     184    - onset novelty functions: `complex`, `energy`, `hfc`, `kl`, `mkl`,
     185    `phase`, `specdiff`, `specflux`, `wphase`,
     186
     187    - spectral descriptors: `centroid`, `decrease`, `kurtosis`, `rolloff`,
     188    `skewness`, `slope`, `spread`.
    179189
    180190*/
Note: See TracChangeset for help on using the changeset viewer.