Changeset ec2fa2a


Ignore:
Timestamp:
Nov 21, 2007, 11:59:54 AM (12 years ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/constantq, feature/pitchshift, feature/pydocstrings, feature/timestretch, master, pitchshift, sampler, timestretch, yinfft+
Children:
fabb7cd
Parents:
2a00568
Message:

onsetdetection.{c,h}: redo indentation

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/onsetdetection.c

    r2a00568 rec2fa2a  
    3131  /** Pointer to aubio_onsetdetection_<type> function */
    3232  void (*funcpointer)(aubio_onsetdetection_t *o,
    33     cvec_t * fftgrain, fvec_t * onset);
     33      cvec_t * fftgrain, fvec_t * onset);
    3434  smpl_t threshold;      /**< minimum norm threshold for phase and specdiff */
    3535  fvec_t *oldmag;        /**< previous norm vector */
     
    4444/* Energy based onset detection function */
    4545void aubio_onsetdetection_energy  (aubio_onsetdetection_t *o UNUSED,
    46                 cvec_t * fftgrain, fvec_t * onset) {
    47         uint_t i,j;
    48         for (i=0;i<fftgrain->channels;i++) {
    49                 onset->data[i][0] = 0.;
    50                 for (j=0;j<fftgrain->length;j++) {
    51                         onset->data[i][0] += SQR(fftgrain->norm[i][j]);
    52                 }
    53         }
     46    cvec_t * fftgrain, fvec_t * onset) {
     47  uint_t i,j;
     48  for (i=0;i<fftgrain->channels;i++) {
     49    onset->data[i][0] = 0.;
     50    for (j=0;j<fftgrain->length;j++) {
     51      onset->data[i][0] += SQR(fftgrain->norm[i][j]);
     52    }
     53  }
    5454}
    5555
     
    5757void aubio_onsetdetection_hfc(aubio_onsetdetection_t *o UNUSED,
    5858    cvec_t * fftgrain, fvec_t * onset){
    59         uint_t i,j;
    60         for (i=0;i<fftgrain->channels;i++) {
    61                 onset->data[i][0] = 0.;
    62                 for (j=0;j<fftgrain->length;j++) {
    63                         onset->data[i][0] += (j+1)*fftgrain->norm[i][j];
    64                 }
    65         }
     59  uint_t i,j;
     60  for (i=0;i<fftgrain->channels;i++) {
     61    onset->data[i][0] = 0.;
     62    for (j=0;j<fftgrain->length;j++) {
     63      onset->data[i][0] += (j+1)*fftgrain->norm[i][j];
     64    }
     65  }
    6666}
    6767
     
    6969/* Complex Domain Method onset detection function */
    7070void aubio_onsetdetection_complex (aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset) {
    71         uint_t i, j;
    72         uint_t nbins = fftgrain->length;
    73         for (i=0;i<fftgrain->channels; i++)     {
    74                 onset->data[i][0] = 0.;
    75                 for (j=0;j<nbins; j++)  {
    76                         o->dev1->data[i][j]      = aubio_unwrap2pi(
    77                                         fftgrain->phas[i][j]
    78                                         -2.0*o->theta1->data[i][j]+
    79                                         o->theta2->data[i][j]);
     71  uint_t i, j;
     72  uint_t nbins = fftgrain->length;
     73  for (i=0;i<fftgrain->channels; i++)  {
     74    onset->data[i][0] = 0.;
     75    for (j=0;j<nbins; j++)  {
     76      o->dev1->data[i][j]    = aubio_unwrap2pi(
     77          fftgrain->phas[i][j]
     78          -2.0*o->theta1->data[i][j]+
     79          o->theta2->data[i][j]);
    8080#ifdef HAVE_COMPLEX_H
    81                         o->meas[j] = fftgrain->norm[i][j]*CEXPC(I*o->dev1->data[i][j]);
    82                         /* sum on all bins */
    83                         onset->data[i][0]                += //(fftgrain->norm[i][j]);
    84                                         SQRT(SQR( REAL(o->oldmag->data[i][j]-o->meas[j]) )
    85                                                 +  SQR( IMAG(o->oldmag->data[i][j]-o->meas[j]) )
    86                                                 );
     81      o->meas[j] = fftgrain->norm[i][j]*CEXPC(I*o->dev1->data[i][j]);
     82      /* sum on all bins */
     83      onset->data[i][0]    += //(fftgrain->norm[i][j]);
     84          SQRT(SQR( REAL(o->oldmag->data[i][j]-o->meas[j]) )
     85            +  SQR( IMAG(o->oldmag->data[i][j]-o->meas[j]) )
     86            );
    8787#else
    88                         o->meas[j]             = (fftgrain->norm[i][j])*COS(o->dev1->data[i][j]);
    89                         o->meas[(nbins-1)*2-j] = (fftgrain->norm[i][j])*SIN(o->dev1->data[i][j]);
    90                         /* sum on all bins */
    91                         onset->data[i][0]                += //(fftgrain->norm[i][j]);
    92                                         SQRT(SQR( (o->oldmag->data[i][j]-o->meas[j]) )
    93                                                 +  SQR( (-o->meas[(nbins-1)*2-j]) )
    94                                                 );
     88      o->meas[j]             = (fftgrain->norm[i][j])*COS(o->dev1->data[i][j]);
     89      o->meas[(nbins-1)*2-j] = (fftgrain->norm[i][j])*SIN(o->dev1->data[i][j]);
     90      /* sum on all bins */
     91      onset->data[i][0]    += //(fftgrain->norm[i][j]);
     92          SQRT(SQR( (o->oldmag->data[i][j]-o->meas[j]) )
     93            +  SQR( (-o->meas[(nbins-1)*2-j]) )
     94            );
    9595#endif
    96                         /* swap old phase data (need to remember 2 frames behind)*/
    97                         o->theta2->data[i][j] = o->theta1->data[i][j];
    98                         o->theta1->data[i][j] = fftgrain->phas[i][j];
    99                         /* swap old magnitude data (1 frame is enough) */
    100                         o->oldmag->data[i][j] = fftgrain->norm[i][j];
    101                 }
    102         }
     96      /* swap old phase data (need to remember 2 frames behind)*/
     97      o->theta2->data[i][j] = o->theta1->data[i][j];
     98      o->theta1->data[i][j] = fftgrain->phas[i][j];
     99      /* swap old magnitude data (1 frame is enough) */
     100      o->oldmag->data[i][j] = fftgrain->norm[i][j];
     101    }
     102  }
    103103}
    104104
     
    106106/* Phase Based Method onset detection function */
    107107void aubio_onsetdetection_phase(aubio_onsetdetection_t *o,
    108                 cvec_t * fftgrain, fvec_t * onset){
    109         uint_t i, j;
    110         uint_t nbins = fftgrain->length;
    111         for (i=0;i<fftgrain->channels; i++)     {
    112                 onset->data[i][0] = 0.0f;
    113                 o->dev1->data[i][0]=0.;
    114                 for ( j=0;j<nbins; j++ )        {
    115                         o->dev1->data[i][j] =
    116                                 aubio_unwrap2pi(
    117                                                 fftgrain->phas[i][j]
    118                                                 -2.0*o->theta1->data[i][j]
    119                                                 +o->theta2->data[i][j]);
    120                         if ( o->threshold < fftgrain->norm[i][j] )
    121                                 o->dev1->data[i][j] = ABS(o->dev1->data[i][j]);
    122                         else
    123                                 o->dev1->data[i][j] = 0.0f;
    124                         /* keep a track of the past frames */
    125                         o->theta2->data[i][j] = o->theta1->data[i][j];
    126                         o->theta1->data[i][j] = fftgrain->phas[i][j];
    127                 }
    128                 /* apply o->histogram */
    129                 aubio_hist_dyn_notnull(o->histog,o->dev1);
    130                 /* weight it */
    131                 aubio_hist_weight(o->histog);
    132                 /* its mean is the result */
    133                 onset->data[i][0] = aubio_hist_mean(o->histog);
    134                 //onset->data[i][0] = vec_mean(o->dev1);
    135         }
     108    cvec_t * fftgrain, fvec_t * onset){
     109  uint_t i, j;
     110  uint_t nbins = fftgrain->length;
     111  for (i=0;i<fftgrain->channels; i++)  {
     112    onset->data[i][0] = 0.0f;
     113    o->dev1->data[i][0]=0.;
     114    for ( j=0;j<nbins; j++ )  {
     115      o->dev1->data[i][j] =
     116        aubio_unwrap2pi(
     117            fftgrain->phas[i][j]
     118            -2.0*o->theta1->data[i][j]
     119            +o->theta2->data[i][j]);
     120      if ( o->threshold < fftgrain->norm[i][j] )
     121        o->dev1->data[i][j] = ABS(o->dev1->data[i][j]);
     122      else
     123        o->dev1->data[i][j] = 0.0f;
     124      /* keep a track of the past frames */
     125      o->theta2->data[i][j] = o->theta1->data[i][j];
     126      o->theta1->data[i][j] = fftgrain->phas[i][j];
     127    }
     128    /* apply o->histogram */
     129    aubio_hist_dyn_notnull(o->histog,o->dev1);
     130    /* weight it */
     131    aubio_hist_weight(o->histog);
     132    /* its mean is the result */
     133    onset->data[i][0] = aubio_hist_mean(o->histog); 
     134    //onset->data[i][0] = vec_mean(o->dev1);
     135  }
    136136}
    137137
    138138/* Spectral difference method onset detection function */
    139139void aubio_onsetdetection_specdiff(aubio_onsetdetection_t *o,
    140                 cvec_t * fftgrain, fvec_t * onset){
    141         uint_t i, j;
    142         uint_t nbins = fftgrain->length;
    143         for (i=0;i<fftgrain->channels; i++)     {
    144                 onset->data[i][0] = 0.0f;
    145                 for (j=0;j<nbins; j++)  {
    146                         o->dev1->data[i][j] = SQRT(
    147                                         ABS(SQR( fftgrain->norm[i][j])
    148                                                 - SQR(o->oldmag->data[i][j])));
    149                         if (o->threshold < fftgrain->norm[i][j] )
    150                                 o->dev1->data[i][j] = ABS(o->dev1->data[i][j]);
    151                         else
    152                                 o->dev1->data[i][j] = 0.0f;
    153                         o->oldmag->data[i][j] = fftgrain->norm[i][j];
    154                 }
    155 
    156                 /* apply o->histogram (act somewhat as a low pass on the
    157                 * overall function)*/
    158                 aubio_hist_dyn_notnull(o->histog,o->dev1);
    159                 /* weight it */
    160                 aubio_hist_weight(o->histog);
    161                 /* its mean is the result */
    162                 onset->data[i][0] = aubio_hist_mean(o->histog);
    163 
    164         }
     140    cvec_t * fftgrain, fvec_t * onset){
     141  uint_t i, j;
     142  uint_t nbins = fftgrain->length;
     143  for (i=0;i<fftgrain->channels; i++)  {
     144    onset->data[i][0] = 0.0f;
     145    for (j=0;j<nbins; j++)  {
     146      o->dev1->data[i][j] = SQRT(
     147          ABS(SQR( fftgrain->norm[i][j])
     148            - SQR(o->oldmag->data[i][j])));
     149      if (o->threshold < fftgrain->norm[i][j] )
     150        o->dev1->data[i][j] = ABS(o->dev1->data[i][j]);
     151      else
     152        o->dev1->data[i][j] = 0.0f;
     153      o->oldmag->data[i][j] = fftgrain->norm[i][j];
     154    }
     155
     156    /* apply o->histogram (act somewhat as a low pass on the
     157    * overall function)*/
     158    aubio_hist_dyn_notnull(o->histog,o->dev1);
     159    /* weight it */
     160    aubio_hist_weight(o->histog);
     161    /* its mean is the result */
     162    onset->data[i][0] = aubio_hist_mean(o->histog); 
     163
     164  }
    165165}
    166166
     
    169169 * negative (1.+) and infinite values (+1.e-10) */
    170170void aubio_onsetdetection_kl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset){
    171         uint_t i,j;
    172         for (i=0;i<fftgrain->channels;i++) {
    173                 onset->data[i][0] = 0.;
    174                 for (j=0;j<fftgrain->length;j++) {
    175                         onset->data[i][0] += fftgrain->norm[i][j]
    176                                 *LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10));
    177                         o->oldmag->data[i][j] = fftgrain->norm[i][j];
    178                 }
    179                 if (isnan(onset->data[i][0])) onset->data[i][0] = 0.;
    180         }
     171  uint_t i,j;
     172  for (i=0;i<fftgrain->channels;i++) {
     173    onset->data[i][0] = 0.;
     174    for (j=0;j<fftgrain->length;j++) {
     175      onset->data[i][0] += fftgrain->norm[i][j]
     176        *LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10));
     177      o->oldmag->data[i][j] = fftgrain->norm[i][j];
     178    }
     179    if (isnan(onset->data[i][0])) onset->data[i][0] = 0.;
     180  }
    181181}
    182182
     
    185185 * negative (1.+) and infinite values (+1.e-10) */
    186186void aubio_onsetdetection_mkl(aubio_onsetdetection_t *o, cvec_t * fftgrain, fvec_t * onset){
    187         uint_t i,j;
    188         for (i=0;i<fftgrain->channels;i++) {
    189                 onset->data[i][0] = 0.;
    190                 for (j=0;j<fftgrain->length;j++) {
    191                         onset->data[i][0] += LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10));
    192                         o->oldmag->data[i][j] = fftgrain->norm[i][j];
    193                 }
    194                 if (isnan(onset->data[i][0])) onset->data[i][0] = 0.;
    195         }
     187  uint_t i,j;
     188  for (i=0;i<fftgrain->channels;i++) {
     189    onset->data[i][0] = 0.;
     190    for (j=0;j<fftgrain->length;j++) {
     191      onset->data[i][0] += LOG(1.+fftgrain->norm[i][j]/(o->oldmag->data[i][j]+1.e-10));
     192      o->oldmag->data[i][j] = fftgrain->norm[i][j];
     193    }
     194    if (isnan(onset->data[i][0])) onset->data[i][0] = 0.;
     195  }
    196196}
    197197
     
    199199void
    200200aubio_onsetdetection(aubio_onsetdetection_t *o, cvec_t * fftgrain,
    201                 fvec_t * onset) {
    202         o->funcpointer(o,fftgrain,onset);
     201    fvec_t * onset) {
     202  o->funcpointer(o,fftgrain,onset);
    203203}
    204204
     
    208208aubio_onsetdetection_t *
    209209new_aubio_onsetdetection (aubio_onsetdetection_type type,
    210                 uint_t size, uint_t channels){
    211         aubio_onsetdetection_t * o = AUBIO_NEW(aubio_onsetdetection_t);
    212         uint_t rsize = size/2+1;
     210    uint_t size, uint_t channels){
     211  aubio_onsetdetection_t * o = AUBIO_NEW(aubio_onsetdetection_t);
     212  uint_t rsize = size/2+1;
    213213  uint_t i;
    214         switch(type) {
    215                 /* for both energy and hfc, only fftgrain->norm is required */
    216                 case aubio_onset_energy:
    217                         break;
    218                 case aubio_onset_hfc:
    219                         break;
    220                 /* the other approaches will need some more memory spaces */
    221                 case aubio_onset_complex:
    222                         o->oldmag = new_fvec(rsize,channels);
    223                         /** bug: must be complex array */
    224                         o->meas = AUBIO_ARRAY(fft_data_t,size+1);
    225                         for (i=0; i<size+1; i++) o->meas[i] = 0;
    226                         o->dev1  = new_fvec(rsize,channels);
    227                         o->theta1 = new_fvec(rsize,channels);
    228                         o->theta2 = new_fvec(rsize,channels);
    229                         break;
    230                 case aubio_onset_phase:
    231                         o->dev1  = new_fvec(rsize,channels);
    232                         o->theta1 = new_fvec(rsize,channels);
    233                         o->theta2 = new_fvec(rsize,channels);
    234                         o->histog = new_aubio_hist(0.0f, PI, 10, channels);
    235                         o->threshold = 0.1;
    236                         break;
    237                 case aubio_onset_specdiff:
    238                         o->oldmag = new_fvec(rsize,channels);
    239                         o->dev1   = new_fvec(rsize,channels);
    240                         o->histog = new_aubio_hist(0.0f, PI, 10, channels);
    241                         o->threshold = 0.1;
    242                         break;
    243                 case aubio_onset_kl:
    244                         o->oldmag = new_fvec(rsize,channels);
    245                         break;
    246                 case aubio_onset_mkl:
    247                         o->oldmag = new_fvec(rsize,channels);
    248                         break;
    249                 default:
    250                         break;
    251         }
    252        
    253         /* this switch could be in its own function to change between
    254          * detections on the fly. this would need getting rid of the switch
    255          * above and always allocate all the structure */
    256 
    257         switch(type) {
    258                 case aubio_onset_energy:
    259                         o->funcpointer = aubio_onsetdetection_energy;
    260                         break;
    261                 case aubio_onset_hfc:
    262                         o->funcpointer = aubio_onsetdetection_hfc;
    263                         break;
    264                 case aubio_onset_complex:
    265                         o->funcpointer = aubio_onsetdetection_complex;
    266                         break;
    267                 case aubio_onset_phase:
    268                         o->funcpointer = aubio_onsetdetection_phase;
    269                         break;
    270                 case aubio_onset_specdiff:
    271                         o->funcpointer = aubio_onsetdetection_specdiff;
    272                         break;
    273                 case aubio_onset_kl:
    274                         o->funcpointer = aubio_onsetdetection_kl;
    275                         break;
    276                 case aubio_onset_mkl:
    277                         o->funcpointer = aubio_onsetdetection_mkl;
    278                         break;
    279                 default:
    280                         break;
    281         }
    282         o->type = type;
    283         return o;
     214  switch(type) {
     215    /* for both energy and hfc, only fftgrain->norm is required */
     216    case aubio_onset_energy:
     217      break;
     218    case aubio_onset_hfc:
     219      break;
     220      /* the other approaches will need some more memory spaces */
     221    case aubio_onset_complex:
     222      o->oldmag = new_fvec(rsize,channels);
     223      /** bug: must be complex array */
     224      o->meas = AUBIO_ARRAY(fft_data_t,size+1);
     225      for (i=0; i<size+1; i++) o->meas[i] = 0;
     226      o->dev1   = new_fvec(rsize,channels);
     227      o->theta1 = new_fvec(rsize,channels);
     228      o->theta2 = new_fvec(rsize,channels);
     229      break;
     230    case aubio_onset_phase:
     231      o->dev1   = new_fvec(rsize,channels);
     232      o->theta1 = new_fvec(rsize,channels);
     233      o->theta2 = new_fvec(rsize,channels);
     234      o->histog = new_aubio_hist(0.0f, PI, 10, channels);
     235      o->threshold = 0.1;
     236      break;
     237    case aubio_onset_specdiff:
     238      o->oldmag = new_fvec(rsize,channels);
     239      o->dev1   = new_fvec(rsize,channels);
     240      o->histog = new_aubio_hist(0.0f, PI, 10, channels);
     241      o->threshold = 0.1;
     242      break;
     243    case aubio_onset_kl:
     244    case aubio_onset_mkl:
     245      o->oldmag = new_fvec(rsize,channels);
     246      break;
     247    default:
     248      break;
     249  }
     250
     251  /* this switch could be in its own function to change between
     252   * detections on the fly. this would need getting rid of the switch
     253   * above and always allocate all the structure */
     254
     255  switch(type) {
     256    case aubio_onset_energy:
     257      o->funcpointer = aubio_onsetdetection_energy;
     258      break;
     259    case aubio_onset_hfc:
     260      o->funcpointer = aubio_onsetdetection_hfc;
     261      break;
     262    case aubio_onset_complex:
     263      o->funcpointer = aubio_onsetdetection_complex;
     264      break;
     265    case aubio_onset_phase:
     266      o->funcpointer = aubio_onsetdetection_phase;
     267      break;
     268    case aubio_onset_specdiff:
     269      o->funcpointer = aubio_onsetdetection_specdiff;
     270      break;
     271    case aubio_onset_kl:
     272      o->funcpointer = aubio_onsetdetection_kl;
     273      break;
     274    case aubio_onset_mkl:
     275      o->funcpointer = aubio_onsetdetection_mkl;
     276      break;
     277    default:
     278      break;
     279  }
     280  o->type = type;
     281  return o;
    284282}
    285283
    286284void del_aubio_onsetdetection (aubio_onsetdetection_t *o){
    287 
    288         switch(o->type) {
    289                 /* for both energy and hfc, only fftgrain->norm is required */
    290                 case aubio_onset_energy:
    291                         break;
    292                 case aubio_onset_hfc:
    293                         break;
    294                 /* the other approaches will need some more memory spaces */
    295                 case aubio_onset_complex:
    296                         AUBIO_FREE(o->meas);
    297                         del_fvec(o->oldmag);
    298                         del_fvec(o->dev1);
    299                         del_fvec(o->theta1);
    300                         del_fvec(o->theta2);
    301                         break;
    302                 case aubio_onset_phase:
    303                         del_fvec(o->dev1);
    304                         del_fvec(o->theta1);
    305                         del_fvec(o->theta2);
    306                         del_aubio_hist(o->histog);
    307                         break;
    308                 case aubio_onset_specdiff:
    309                         del_fvec(o->oldmag);
    310                         del_fvec(o->dev1);
    311                         del_aubio_hist(o->histog);
    312                         break;
    313                 case aubio_onset_kl:
    314                         del_fvec(o->oldmag);
    315                         break;
    316                 case aubio_onset_mkl:
    317                         del_fvec(o->oldmag);
    318                         break;
    319                 default:
    320                         break;
    321         }
    322         AUBIO_FREE(o);
    323        
    324 }
     285  switch(o->type) {
     286    /* for both energy and hfc, only fftgrain->norm is required */
     287    case aubio_onset_energy:
     288      break;
     289    case aubio_onset_hfc:
     290      break;
     291      /* the other approaches will need some more memory spaces */
     292    case aubio_onset_complex:
     293      AUBIO_FREE(o->meas);
     294      del_fvec(o->oldmag);
     295      del_fvec(o->dev1);
     296      del_fvec(o->theta1);
     297      del_fvec(o->theta2);
     298      break;
     299    case aubio_onset_phase:
     300      del_fvec(o->dev1);
     301      del_fvec(o->theta1);
     302      del_fvec(o->theta2);
     303      del_aubio_hist(o->histog);
     304      break;
     305    case aubio_onset_specdiff:
     306      del_fvec(o->oldmag);
     307      del_fvec(o->dev1);
     308      del_aubio_hist(o->histog);
     309      break;
     310    case aubio_onset_kl:
     311      del_fvec(o->oldmag);
     312      break;
     313    case aubio_onset_mkl:
     314      del_fvec(o->oldmag);
     315      break;
     316    default:
     317      break;
     318  }
     319  AUBIO_FREE(o);
     320}
  • src/onsetdetection.h

    r2a00568 rec2fa2a  
    4747        aubio_onset_phase,          /**< phase fast */           
    4848        aubio_onset_kl,             /**< Kullback Liebler */
    49         aubio_onset_mkl             /**< modified Kullback Liebler */
     49        aubio_onset_mkl,            /**< modified Kullback Liebler */
    5050} aubio_onsetdetection_type;
    5151
Note: See TracChangeset for help on using the changeset viewer.