Esempio n. 1
0
void aubio_pvoc_do(aubio_pvoc_t *pv, fvec_t * datanew, cvec_t *fftgrain) {
  /* slide  */
  aubio_pvoc_swapbuffers(pv->data->data,pv->dataold->data,
      datanew->data,pv->win_s,pv->hop_s);
  /* windowing */
  fvec_weight(pv->data, pv->w);
  /* shift */
  fvec_shift(pv->data);
  /* calculate fft */
  aubio_fft_do (pv->fft,pv->data,fftgrain);
}
Esempio n. 2
0
void
aubio_beattracking_checkstate (aubio_beattracking_t * bt)
{
    uint_t i, j, a, b;
    uint_t flagconst = 0;
    sint_t counter = bt->counter;
    uint_t flagstep = bt->flagstep;
    smpl_t gp = bt->gp;
    smpl_t bp = bt->bp;
    smpl_t rp = bt->rp;
    smpl_t rp1 = bt->rp1;
    smpl_t rp2 = bt->rp2;
    uint_t laglen = bt->rwv->length;
    uint_t acflen = bt->acf->length;
    uint_t step = bt->step;
    fvec_t *acf = bt->acf;
    fvec_t *acfout = bt->acfout;

    if (gp) {
        // compute shift invariant comb filterbank
        fvec_zeros (acfout);
        for (i = 1; i < laglen - 1; i++) {
            for (a = 1; a <= bt->timesig; a++) {
                for (b = 1; b < 2 * a; b++) {
                    acfout->data[i] += acf->data[i * a + b - 1];
                }
            }
        }
        // since gp is set, gwv has been computed in previous checkstate
        fvec_weight (acfout, bt->gwv);
        gp = fvec_quadratic_peak_pos (acfout, fvec_max_elem (acfout));
    } else {
        //still only using general model
        gp = 0;
    }

    //now look for step change - i.e. a difference between gp and rp that
    // is greater than 2*constthresh - always true in first case, since gp = 0
    if (counter == 0) {
        if (ABS (gp - rp) > 2. * bt->g_var) {
            flagstep = 1;             // have observed  step change.
            counter = 3;              // setup 3 frame counter
        } else {
            flagstep = 0;
        }
    }
    //i.e. 3rd frame after flagstep initially set
    if (counter == 1 && flagstep == 1) {
        //check for consistency between previous beatperiod values
        if (ABS (2 * rp - rp1 - rp2) < bt->g_var) {
            //if true, can activate context dependent model
            flagconst = 1;
            counter = 0;              // reset counter and flagstep
        } else {
            //if not consistent, then don't flag consistency!
            flagconst = 0;
            counter = 2;              // let it look next time
        }
    } else if (counter > 0) {
        //if counter doesn't = 1,
        counter = counter - 1;
    }

    rp2 = rp1;
    rp1 = rp;

    if (flagconst) {
        /* first run of new hypothesis */
        gp = rp;
        bt->timesig = fvec_gettimesig (acf, acflen, gp);
        for (j = 0; j < laglen; j++)
            bt->gwv->data[j] =
                EXP (-.5 * SQR ((smpl_t) (j + 1. - gp)) / SQR (bt->g_var));
        flagconst = 0;
        bp = gp;
        /* flat phase weighting */
        fvec_ones (bt->phwv);
    } else if (bt->timesig) {
        /* context dependant model */
        bp = gp;
        /* gaussian phase weighting */
        if (step > bt->lastbeat) {
            for (j = 0; j < 2 * laglen; j++) {
                bt->phwv->data[j] =
                    EXP (-.5 * SQR ((smpl_t) (1. + j - step +
                                              bt->lastbeat)) / (bp / 8.));
            }
        } else {
            //AUBIO_DBG("NOT using phase weighting as step is %d and lastbeat %d \n",
            //                step,bt->lastbeat);
            fvec_ones (bt->phwv);
        }
    } else {
        /* initial state */
        bp = rp;
        /* flat phase weighting */
        fvec_ones (bt->phwv);
    }

    /* do some further checks on the final bp value */

    /* if tempo is > 206 bpm, half it */
    while (0 < bp && bp < 25) {
#if AUBIO_BEAT_WARNINGS
        AUBIO_WRN ("doubling from %f (%f bpm) to %f (%f bpm)\n",
                   bp, 60.*44100./512./bp, bp/2., 60.*44100./512./bp/2. );
        //AUBIO_DBG("warning, halving the tempo from %f\n", 60.*samplerate/hopsize/bp);
#endif /* AUBIO_BEAT_WARNINGS */
        bp = bp * 2;
    }

    //AUBIO_DBG("tempo:\t%3.5f bpm | ", 5168./bp);

    /* smoothing */
    //bp = (uint_t) (0.8 * (smpl_t)bp + 0.2 * (smpl_t)bp2);
    //AUBIO_DBG("tempo:\t%3.5f bpm smoothed | bp2 %d | bp %d | ", 5168./bp, bp2, bp);
    //bp2 = bp;
    //AUBIO_DBG("time signature: %d \n", bt->timesig);
    bt->counter = counter;
    bt->flagstep = flagstep;
    bt->gp = gp;
    bt->bp = bp;
    bt->rp1 = rp1;
    bt->rp2 = rp2;
}
Esempio n. 3
0
void
aubio_beattracking_do (aubio_beattracking_t * bt, const fvec_t * dfframe,
                       fvec_t * output)
{

    uint_t i, k;
    uint_t step = bt->step;
    uint_t laglen = bt->rwv->length;
    uint_t winlen = bt->dfwv->length;
    uint_t maxindex = 0;
    //number of harmonics in shift invariant comb filterbank
    uint_t numelem = 4;

    smpl_t phase;                 // beat alignment (step - lastbeat)
    smpl_t beat;                  // beat position
    smpl_t bp;                    // beat period
    uint_t a, b;                  // used to build shift invariant comb filterbank
    uint_t kmax;                  // number of elements used to find beat phase

    /* copy dfframe, apply detection function weighting, and revert */
    fvec_copy (dfframe, bt->dfrev);
    fvec_weight (bt->dfrev, bt->dfwv);
    fvec_rev (bt->dfrev);

    /* compute autocorrelation function */
    aubio_autocorr (dfframe, bt->acf);

    /* if timesig is unknown, use metrically unbiased version of filterbank */
    if (!bt->timesig) {
        numelem = 4;
    } else {
        numelem = bt->timesig;
    }

    /* first and last output values are left intentionally as zero */
    fvec_zeros (bt->acfout);

    /* compute shift invariant comb filterbank */
    for (i = 1; i < laglen - 1; i++) {
        for (a = 1; a <= numelem; a++) {
            for (b = 1; b < 2 * a; b++) {
                bt->acfout->data[i] += bt->acf->data[i * a + b - 1]
                                       * 1. / (2. * a - 1.);
            }
        }
    }
    /* apply Rayleigh weight */
    fvec_weight (bt->acfout, bt->rwv);

    /* find non-zero Rayleigh period */
    maxindex = fvec_max_elem (bt->acfout);
    if (maxindex > 0 && maxindex < bt->acfout->length - 1) {
        bt->rp = fvec_quadratic_peak_pos (bt->acfout, maxindex);
    } else {
        bt->rp = bt->rayparam;
    }

    /* activate biased filterbank */
    aubio_beattracking_checkstate (bt);
#if 0                           // debug metronome mode
    bt->bp = 36.9142;
#endif
    bp = bt->bp;
    /* end of biased filterbank */

    if (bp == 0) {
        fvec_zeros(output);
        return;
    }

    /* deliberate integer operation, could be set to 3 max eventually */
    kmax = FLOOR (winlen / bp);

    /* initialize output */
    fvec_zeros (bt->phout);
    for (i = 0; i < bp; i++) {
        for (k = 0; k < kmax; k++) {
            bt->phout->data[i] += bt->dfrev->data[i + (uint_t) ROUND (bp * k)];
        }
    }
    fvec_weight (bt->phout, bt->phwv);

    /* find Rayleigh period */
    maxindex = fvec_max_elem (bt->phout);
    if (maxindex >= winlen - 1) {
#if AUBIO_BEAT_WARNINGS
        AUBIO_WRN ("no idea what this groove's phase is\n");
#endif /* AUBIO_BEAT_WARNINGS */
        phase = step - bt->lastbeat;
    } else {
        phase = fvec_quadratic_peak_pos (bt->phout, maxindex);
    }
    /* take back one frame delay */
    phase += 1.;
#if 0                           // debug metronome mode
    phase = step - bt->lastbeat;
#endif

    /* reset output */
    fvec_zeros (output);

    i = 1;
    beat = bp - phase;

    // AUBIO_DBG ("bp: %f, phase: %f, lastbeat: %f, step: %d, winlen: %d\n",
    //    bp, phase, bt->lastbeat, step, winlen);

    /* the next beat will be earlier than 60% of the tempo period
      skip this one */
    if ( ( step - bt->lastbeat - phase ) < -0.40 * bp ) {
#if AUBIO_BEAT_WARNINGS
        AUBIO_WRN ("back off-beat error, skipping this beat\n");
#endif /* AUBIO_BEAT_WARNINGS */
        beat += bp;
    }

    /* start counting the beats */
    while (beat + bp < 0) {
        beat += bp;
    }

    if (beat >= 0) {
        //AUBIO_DBG ("beat: %d, %f, %f\n", i, bp, beat);
        output->data[i] = beat;
        i++;
    }

    while (beat + bp <= step) {
        beat += bp;
        //AUBIO_DBG ("beat: %d, %f, %f\n", i, bp, beat);
        output->data[i] = beat;
        i++;
    }

    bt->lastbeat = beat;
    /* store the number of beats in this frame as the first element */
    output->data[0] = i;
}