Changes in / [65a4fb4:057ecee]


Ignore:
Files:
19 added
9 edited

Legend:

Unmodified
Added
Removed
  • python/lib/moresetuptools.py

    r65a4fb4 r057ecee  
    8080                'libswresample', 'libavresample',
    8181                'sndfile',
     82                'hdf5',
    8283                #'fftw3f',
    8384               ]
     
    104105        ext.define_macros += [('HAVE_FFTW3F', 1)]
    105106        ext.define_macros += [('HAVE_FFTW3', 1)]
     107    if 'hdf5' in ext.libraries:
     108        ext.libraries += ['hdf5_hl']
     109        ext.define_macros += [('HAVE_HDF5', 1)]
    106110
    107111    # add accelerate on darwin
  • src/aubio_priv.h

    r65a4fb4 r057ecee  
    134134#define aubio_cblas_swap      cblas_sswap
    135135#define aubio_cblas_dot       cblas_sdot
     136#define aubio_cblas__gemv     cblas_sgemv
    136137#else /* HAVE_AUBIO_DOUBLE */
    137138#ifdef HAVE_ATLAS
     
    141142#define aubio_cblas_swap      cblas_dswap
    142143#define aubio_cblas_dot       cblas_ddot
     144#define aubio_cblas__gemv     cblas_dgemv
    143145#endif /* HAVE_AUBIO_DOUBLE */
    144146#endif /* HAVE_BLAS */
     
    399401#endif /* DEBUG */
    400402
     403// goto to failure if condition x is not true
     404#define AUBIO_GOTO_FAILURE(x) if (!(x)) goto failure
     405
     406#define AUBIO_ASSERT_EQUAL_SHAPE(t1, t2) { \
     407    AUBIO_ASSERT(t1 && t2); \
     408    AUBIO_ASSERT(t1->ndim == t2->ndim); \
     409    uint_t nn; \
     410    for (nn = 0; nn < t1->ndim; nn++) \
     411      AUBIO_ASSERT(t1->shape[nn] == t2->shape[nn]); \
     412    }
     413
    401414#endif /* AUBIO_PRIV_H */
  • src/fmat.c

    r65a4fb4 r057ecee  
    2424fmat_t * new_fmat (uint_t height, uint_t length) {
    2525  fmat_t * s;
    26   uint_t i,j;
     26  uint_t i;
    2727  if ((sint_t)length <= 0 || (sint_t)height <= 0 ) {
    2828    return NULL;
     
    3232  s->length = length;
    3333  s->data = AUBIO_ARRAY(smpl_t*,s->height);
    34   for (i=0; i< s->height; i++) {
    35     s->data[i] = AUBIO_ARRAY(smpl_t, s->length);
    36     for (j=0; j< s->length; j++) {
    37       s->data[i][j]=0.;
    38     }
     34  s->data[0] = AUBIO_ARRAY(smpl_t, s->length * s->height);
     35  for (i=1; i< s->height; i++) {
     36    s->data[i] = s->data[0] + i * s->length;
    3937  }
    4038  return s;
     
    4240
    4341void del_fmat (fmat_t *s) {
    44   uint_t i;
    45   for (i=0; i<s->height; i++) {
    46     AUBIO_FREE(s->data[i]);
    47   }
    48   AUBIO_FREE(s->data);
     42  AUBIO_ASSERT(s);
     43  if (s->data[0])
     44    AUBIO_FREE(s->data[0]);
     45  if (s->data)
     46    AUBIO_FREE(s->data);
    4947  AUBIO_FREE(s);
    5048}
     
    156154
    157155void fmat_vecmul(const fmat_t *s, const fvec_t *scale, fvec_t *output) {
    158   uint_t k;
    159 #if 0
    160   assert(s->height == output->length);
    161   assert(s->length == scale->length);
    162 #endif
    163156#if !defined(HAVE_ACCELERATE) && !defined(HAVE_BLAS)
    164   uint_t j;
     157  uint_t j, k;
     158  AUBIO_ASSERT(s->height == output->length);
     159  AUBIO_ASSERT(s->length == scale->length);
    165160  fvec_zeros(output);
    166161  for (j = 0; j < s->length; j++) {
    167162    for (k = 0; k < s->height; k++) {
    168       output->data[k] += scale->data[j]
    169           * s->data[k][j];
     163      output->data[k] += scale->data[j] * s->data[k][j];
    170164    }
    171165  }
    172166#elif defined(HAVE_BLAS)
     167#if 0
    173168  for (k = 0; k < s->height; k++) {
    174169    output->data[k] = aubio_cblas_dot( s->length, scale->data, 1, s->data[k], 1);
    175170  }
     171#else
     172  aubio_cblas__gemv(CblasColMajor, CblasTrans,
     173      s->length, s->height, 1.,
     174      s->data[0], s->length,
     175      scale->data, 1, 0.,
     176      output->data, 1);
     177#endif
    176178#elif defined(HAVE_ACCELERATE)
    177179#if 0
     
    179181  vDSP_mmul (s->data[0], 1, scale->data, 1, output->data, 1, s->height, 1, s->length);
    180182#else
     183  uint_t k;
    181184  for (k = 0; k < s->height; k++) {
    182185    aubio_vDSP_dotpr( scale->data, 1, s->data[k], 1, &(output->data[k]), s->length);
     
    185188#endif
    186189}
     190
     191void fvec_matmul(const fvec_t *scale, const fmat_t *s, fvec_t *output) {
     192  AUBIO_ASSERT(s->height == scale->length);
     193  AUBIO_ASSERT(s->length == output->length);
     194#if !defined(HAVE_ACCELERATE) && !defined(HAVE_BLAS)
     195  uint_t j, k;
     196  fvec_zeros(output);
     197  for (k = 0; k < s->height; k++) {
     198    for (j = 0; j < s->length; j++) {
     199      output->data[j] += s->data[k][j] * scale->data[k];
     200    }
     201  }
     202#elif defined(HAVE_BLAS)
     203#if 0
     204  for (k = 0; k < s->length; k++) {
     205    output->data[k] = aubio_cblas_dot( scale->length, scale->data, 1,
     206        &s->data[0][0] + k, s->length);
     207  }
     208#else
     209  aubio_cblas__gemv(CblasColMajor, CblasNoTrans,
     210      s->length, s->height, 1.,
     211      s->data[0], s->length,
     212      scale->data, 1, 0.,
     213      output->data, 1);
     214#endif
     215#elif defined(HAVE_ACCELERATE)
     216#if 0
     217  // seems slower and less precise (and dangerous?)
     218  vDSP_mmul (s->data[0], 1, scale->data, 1, output->data, 1, s->height, 1, s->length);
     219#else
     220  uint_t k;
     221  for (k = 0; k < s->height; k++) {
     222    aubio_vDSP_dotpr( scale->data, 1, s->data[k], 1, &(output->data[k]), scale->length);
     223  }
     224#endif
     225#endif
     226}
  • src/fmat.h

    r65a4fb4 r057ecee  
    161161   \param s matrix to compute product with
    162162   \param scale vector to compute product with
    163    \param output vector to store restults in
     163   \param output vector of results
     164
    164165
    165166*/
    166167void fmat_vecmul(const fmat_t *s, const fvec_t *scale, fvec_t *output);
     168
     169/** compute the product of a vector by a matrix
     170
     171   \param s matrix to compute product with
     172   \param scale input to compute product with
     173   \param output vector of results
     174
     175*/
     176void fvec_matmul(const fvec_t *scale, const fmat_t *s, fvec_t *output);
    167177
    168178#ifdef __cplusplus
  • src/fvec.c

    r65a4fb4 r057ecee  
    9999}
    100100
     101void fvec_vecadd(fvec_t *s, const fvec_t *bias) {
     102  uint_t j;
     103  uint_t length = MIN(s->length, bias->length);
     104  for (j = 0; j < length; j++) {
     105    s->data[j] += bias->data[j];
     106  }
     107}
     108
    101109void fvec_weight(fvec_t *s, const fvec_t *weight) {
    102110  uint_t length = MIN(s->length, weight->length);
  • src/fvec.h

    r65a4fb4 r057ecee  
    144144void fvec_rev(fvec_t *s);
    145145
     146/** add a vector b to vector a, modifying a
     147
     148  \param a  input vector to add b to
     149  \param b  input vector of the values to be added to a
     150
     151  Upon return, he content of a[i] will be set to a[i] + b[i].
     152
     153*/
     154void fvec_vecadd(fvec_t *a, const fvec_t *b);
     155
    146156/** apply weight to vector
    147157
  • src/pitch/pitch.c

    r65a4fb4 r057ecee  
    4949  aubio_pitcht_yinfast,    /**< `yinfast`, YIN fast */
    5050  aubio_pitcht_specacf,    /**< `specacf`, Spectral autocorrelation */
     51  aubio_pitcht_crepe,      /**< `crepe`, convolutional neural network */
    5152  aubio_pitcht_default
    5253    = aubio_pitcht_yinfft, /**< `default` */
     
    99100static void aubio_pitch_do_yinfast (aubio_pitch_t * p, const fvec_t * ibuf, fvec_t * obuf);
    100101static void aubio_pitch_do_specacf (aubio_pitch_t * p, const fvec_t * ibuf, fvec_t * obuf);
     102static void aubio_pitch_do_crepe (aubio_pitch_t * p, const fvec_t * ibuf, fvec_t * obuf);
    101103
    102104/* internal functions for frequency conversion */
     
    104106static smpl_t freqconvmidi (smpl_t f, uint_t samplerate, uint_t bufsize);
    105107static smpl_t freqconvpass (smpl_t f, uint_t samplerate, uint_t bufsize);
     108
     109typedef struct _aubio_pitch_crepe_t aubio_pitch_crepe_t;
     110extern aubio_pitch_crepe_t *new_aubio_pitch_crepe(void);
     111extern void aubio_pitch_crepe_do(aubio_pitch_crepe_t *t, fvec_t *input, fvec_t *out);
     112extern void del_aubio_pitch_crepe(aubio_pitch_crepe_t *t);
     113extern smpl_t aubio_pitch_crepe_get_confidence (aubio_pitch_crepe_t * o);
     114uint_t aubio_pitch_crepe_set_tolerance(aubio_pitch_crepe_t * o, smpl_t
     115    tolerance);
     116smpl_t aubio_pitch_crepe_get_tolerance (aubio_pitch_crepe_t * o);
    106117
    107118/* adapter to stack ibuf new samples at the end of buf, and trim `buf` to `bufsize` */
     
    133144  else if (strcmp (pitch_mode, "specacf") == 0)
    134145    pitch_type = aubio_pitcht_specacf;
     146  else if (strcmp (pitch_mode, "crepe") == 0)
     147    pitch_type = aubio_pitcht_crepe;
    135148  else if (strcmp (pitch_mode, "default") == 0)
    136149    pitch_type = aubio_pitcht_default;
     
    214227      aubio_pitchspecacf_set_tolerance (p->p_object, 0.85);
    215228      break;
     229    case aubio_pitcht_crepe:
     230      // TODO add resampling and blocking
     231      if (samplerate != 16000) {
     232        AUBIO_ERROR("pitch: crepe samplerate must be 16000Hz, got %d\n",
     233            samplerate);
     234        goto beach;
     235      }
     236      if (bufsize != 1024) {
     237        AUBIO_ERROR("pitch: crepe buffer size must be 1024, got %d\n",
     238            bufsize);
     239        goto beach;
     240      }
     241      p->buf = new_fvec (bufsize);
     242      p->p_object = new_aubio_pitch_crepe();
     243      if (!p->p_object) goto beach;
     244      p->detect_cb = aubio_pitch_do_crepe;
     245      p->conf_cb = (aubio_pitch_get_conf_t)aubio_pitch_crepe_get_confidence;
     246      //aubio_pitch_crepe_set_tolerance (p->p_object, 0.85);
     247      break;
    216248    default:
    217249      break;
     
    260292      del_fvec (p->buf);
    261293      del_aubio_pitchspecacf (p->p_object);
     294      break;
     295    case aubio_pitcht_crepe:
     296      del_fvec (p->buf);
     297      del_aubio_pitch_crepe (p->p_object);
    262298      break;
    263299    default:
     
    350386      aubio_pitchyinfast_set_tolerance (p->p_object, tol);
    351387      break;
     388    case aubio_pitcht_crepe:
     389      aubio_pitch_crepe_set_tolerance (p->p_object, tol);
     390      break;
    352391    default:
    353392      break;
     
    369408    case aubio_pitcht_yinfast:
    370409      tolerance = aubio_pitchyinfast_get_tolerance (p->p_object);
     410      break;
     411    case aubio_pitcht_crepe:
     412      tolerance = aubio_pitch_crepe_get_tolerance (p->p_object);
    371413      break;
    372414    default:
     
    479521
    480522void
     523aubio_pitch_do_crepe (aubio_pitch_t * p, const fvec_t * ibuf, fvec_t * out)
     524{
     525  //smpl_t pitch = 0., period;
     526  aubio_pitch_slideblock (p, ibuf);
     527  aubio_pitch_crepe_do(p->p_object, p->buf, out);
     528  out->data[0] = aubio_miditofreq(out->data[0]);
     529}
     530
     531void
    481532aubio_pitch_do_fcomb (aubio_pitch_t * p, const fvec_t * ibuf, fvec_t * out)
    482533{
  • src/wscript_build

    r65a4fb4 r057ecee  
    1313uselib += ['AVUTIL']
    1414uselib += ['BLAS']
     15uselib += ['HDF5', 'HDF5_HL']
    1516
    1617source = ctx.path.ant_glob('*.c **/*.c')
  • wscript

    r65a4fb4 r057ecee  
    9898            help_disable_str = 'do not compile source_wavwrite')
    9999
     100    add_option_enable_disable(ctx, 'hdf5', default = None,
     101            help_str = 'use libhdf5 (default)',
     102            help_disable_str = 'do not use libhdf5')
     103
    100104    add_option_enable_disable(ctx, 'docs', default = None,
    101105            help_str = 'build documentation (auto)',
     
    460464    if (ctx.options.enable_memcpy == True):
    461465        ctx.define('HAVE_MEMCPY_HACKS', 1)
     466
     467    if (ctx.options.enable_hdf5 != True):
     468        ctx.check_cfg(package='hdf5', args='--cflags --libs',
     469                uselib_store='HDF5', mandatory=ctx.options.enable_hdf5)
     470        ctx.check(lib=['hdf5_hl'], use = ['HDF5'],
     471                uselib_store='HDF5_HL', mandatory=ctx.options.enable_hdf5)
    462472
    463473    # write configuration header
Note: See TracChangeset for help on using the changeset viewer.