Changeset 4e19e5b


Ignore:
Timestamp:
Sep 12, 2009, 1:22:20 PM (10 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:
ae4d5de
Parents:
54a5d56
Message:

src/tempo/beattracking.c: interpolate beat period and position to reduce quantization, improve comments

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tempo/beattracking.c

    r54a5d56 r4e19e5b  
    3838        uint_t step;
    3939        uint_t rayparam; /** Rayleigh parameter */
    40         uint_t lastbeat;
     40        smpl_t lastbeat;
    4141        sint_t counter;
    4242        uint_t flagstep;
    4343        smpl_t g_var;
    44         uint_t gp;
    45         uint_t bp;
    46         uint_t rp;
    47         uint_t rp1;
    48         uint_t rp2;
     44        smpl_t gp;
     45        smpl_t bp;
     46        smpl_t rp;
     47        smpl_t rp1;
     48        smpl_t rp2;
    4949};
    5050
     
    115115
    116116        uint_t i,k;
    117         /* current beat period value found using gaussian weighting (from context dependent model) */
    118117        uint_t step     = bt->step;
    119118        uint_t laglen   = bt->rwv->length;
     
    130129        uint_t numelem  = 4;
    131130
    132         //parameters for making s.i.c.f.b.
    133         uint_t a,b;
    134         //beat alignment
    135         uint_t phase;
    136         uint_t kmax;
    137         sint_t beat;
    138         uint_t bp;
     131        smpl_t phase; // beat alignment (step - lastbeat)
     132        smpl_t beat;  // beat position
     133        smpl_t bp;    // beat period
     134        uint_t a,b;   // used to build shift invariant comb filterbank
     135        uint_t kmax;  // number of elements used to find beat phase
    139136
    140137        for (i = 0; i < winlen; i++){
     
    145142        /* find autocorrelation function */
    146143        aubio_autocorr(dfframe,bt->acf);
    147         /*
    148         for (i = 0; i < winlen; i++){
    149                 AUBIO_DBG("%f,",acf[i]);
    150         }
    151         AUBIO_DBG("\n");
    152         */
    153 
    154         /* get acfout - assume Rayleigh weightvector only */
     144
    155145        /* if timesig is unknown, use metrically unbiased version of filterbank */
    156         if(!bt->timesig)
     146        if(!bt->timesig) {
    157147                numelem = 4;
    158         //        AUBIO_DBG("using unbiased filterbank, timesig: %d\n", timesig);
    159         else
     148        } else {
    160149                numelem = bt->timesig;
    161         //        AUBIO_DBG("using biased filterbank, timesig: %d\n", timesig);
     150        }
    162151
    163152        /* first and last output values are left intentionally as zero */
     
    165154                acfout[i] = 0.;
    166155
     156        /* get acfout - assume Rayleigh weightvector only */
    167157        for(i=1;i<laglen-1;i++){
    168158                for (a=1; a<=numelem; a++){
     
    176166        /* find non-zero Rayleigh period */
    177167        maxindex = vec_max_elem(bt->acfout);
    178         bt->rp = maxindex ? maxindex : 1;
     168        bt->rp = maxindex ? vec_quadint(bt->acfout, maxindex, 1) : 1;
    179169        //rp = (maxindex==127) ? 43 : maxindex; //rayparam
    180170        bt->rp = (maxindex==bt->acfout->length-1) ? bt->rayparam : maxindex; //rayparam
     
    182172        /* activate biased filterbank */
    183173        aubio_beattracking_checkstate(bt);
     174#if 0 // debug metronome mode
     175        bt->bp = 36.9142;
     176#endif
    184177        bp = bt->bp;
    185178        /* end of biased filterbank */
     
    189182
    190183        /* deliberate integer operation, could be set to 3 max eventually */
    191         kmax = winlen/bp;
     184        kmax = FLOOR(winlen/bp);
    192185
    193186        for(i=0;i<bp;i++){
    194187                phout[i] = 0.;
    195188                for(k=0;k<kmax;k++){
    196                         phout[i] += dfrev[i+bp*k] * phwv[i];
     189                        phout[i] += dfrev[i+(uint_t)ROUND(bp*k)] * phwv[i];
    197190                }
    198191        }
     
    200193        /* find Rayleigh period */
    201194        maxindex = vec_max_elem(bt->phout);
    202         if (maxindex == winlen-1) maxindex = 0;
    203         phase =  1 + maxindex;
    204 
    205         /* debug */
    206         //AUBIO_DBG("beat period = %d, rp1 = %d, rp2 = %d\n", bp, rp1, rp2);
    207         //AUBIO_DBG("rp = %d, gp = %d, phase = %d\n", bt->rp, bt->gp, phase);
     195        if (maxindex == winlen) maxindex = 0;
     196        phase =  1. + vec_quadint(bt->phout, maxindex, 1);
     197#if 0 // debug metronome mode
     198        phase = step - bt->lastbeat;
     199#endif
    208200
    209201        /* reset output */
     
    212204
    213205        i = 1;
    214         beat =  bp - phase;
     206        beat = bp - phase;
    215207        /* start counting the beats */
    216208        if(beat >= 0)
    217209        {
    218                 output->data[0][i] = (smpl_t)beat;
     210                output->data[0][i] = beat;
    219211                i++;
    220212        }
    221213
    222         while( beat+bp < step )
     214        while( beat + bp <= step)
    223215        {
    224216                beat += bp;
    225                 output->data[0][i] = (smpl_t)beat;
     217                output->data[0][i] = beat;
    226218                i++;
    227219        }
     
    255247        sint_t counter  = bt->counter;
    256248        uint_t flagstep = bt->flagstep;
    257         uint_t gp       = bt->gp;
    258         uint_t bp       = bt->bp;
    259         uint_t rp       = bt->rp;
    260         uint_t rp1      = bt->rp1;
    261         uint_t rp2      = bt->rp2;
     249        smpl_t gp       = bt->gp;
     250        smpl_t bp       = bt->bp;
     251        smpl_t rp       = bt->rp;
     252        smpl_t rp1      = bt->rp1;
     253        smpl_t rp2      = bt->rp2;
    262254        uint_t laglen   = bt->rwv->length;
    263255        uint_t acflen   = bt->acf->length;
     
    284276                        }
    285277                }
    286                 gp = vec_max_elem(bt->acfout);
     278                gp = vec_quadint(bt->acfout, vec_max_elem(bt->acfout), 1);
    287279                /*
    288280                while(gp<32) gp =gp*2;
     
    381373smpl_t aubio_beattracking_get_bpm(aubio_beattracking_t * bt) {
    382374        if (bt->timesig != 0 && bt->counter == 0 && bt->flagstep == 0) {
    383           return 5168. / (smpl_t)bt->gp;
     375          return 5168. / vec_quadint(bt->acfout, bt->bp, 1);
    384376        } else {
    385377          return 0.;
Note: See TracChangeset for help on using the changeset viewer.