Index: src/fvec.c
===================================================================
--- src/fvec.c	(revision f8340e1cf44061891b4d45d8c835bd140ee46318)
+++ src/fvec.c	(revision 0969113110f96081523419ccde6ac0e8616e8eeb)
@@ -28,8 +28,10 @@
 #define aubio_vDSP_vmul       vDSP_vmul
 #define aubio_vDSP_vfill      vDSP_vfill
+#define aubio_catlas_set      catlas_sset
 #else /* HAVE_AUBIO_DOUBLE */
 #define aubio_vDSP_mmov       vDSP_mmovD
 #define aubio_vDSP_vmul       vDSP_vmulD
 #define aubio_vDSP_vfill      vDSP_vfillD
+#define aubio_catlas_set      catlas_dset
 #endif /* HAVE_AUBIO_DOUBLE */
 #endif
@@ -80,4 +82,5 @@
   }
 #else
+  //aubio_catlas_set(s->length, val, s->data, 1);
   aubio_vDSP_vfill(&val, s->data, 1, s->length);
 #endif
@@ -119,4 +122,16 @@
 }
 
+void fvec_weighted_copy(fvec_t *in, fvec_t *weight, fvec_t *out) {
+#ifndef HAVE_ACCELERATE
+  uint_t j;
+  uint_t length = MIN(s->length, weight->length);
+  for (j=0; j< length; j++) {
+    out->data[j] = in->data[j] * weight->data[j];
+  }
+#else
+  aubio_vDSP_vmul(in->data, 1, weight->data, 1, out->data, 1, out->length);
+#endif /* HAVE_ACCELERATE */
+}
+
 void fvec_copy(fvec_t *s, fvec_t *t) {
   if (s->length != t->length) {
Index: src/fvec.h
===================================================================
--- src/fvec.h	(revision f8340e1cf44061891b4d45d8c835bd140ee46318)
+++ src/fvec.h	(revision 0969113110f96081523419ccde6ac0e8616e8eeb)
@@ -163,4 +163,13 @@
 void fvec_copy(fvec_t *s, fvec_t *t);
 
+/** make a copy of a vector, applying weights to each element
+
+  \param in input vector
+  \param weight weights vector
+  \param out output vector
+
+*/
+void fvec_weighted_copy(fvec_t *in, fvec_t *weight, fvec_t *out);
+
 #ifdef __cplusplus
 }
Index: src/mathutils.c
===================================================================
--- src/mathutils.c	(revision f8340e1cf44061891b4d45d8c835bd140ee46318)
+++ src/mathutils.c	(revision 0969113110f96081523419ccde6ac0e8616e8eeb)
@@ -29,4 +29,12 @@
 #ifdef HAVE_ACCELERATE
 #include <Accelerate/Accelerate.h>
+#endif
+
+#if !HAVE_AUBIO_DOUBLE
+#define aubio_cblas_xswap cblas_sswap
+#define aubio_cblas_dot   cblas_sdot
+#else
+#define aubio_cblas_xswap cblas_dswap
+#define aubio_cblas_dot   cblas_ddot
 #endif
 
@@ -282,8 +290,13 @@
 fvec_shift (fvec_t * s)
 {
+#ifndef HAVE_ACCELERATE
   uint_t j;
   for (j = 0; j < s->length / 2; j++) {
     ELEM_SWAP (s->data[j], s->data[j + s->length / 2]);
   }
+#else
+  uint_t half = s->length / 2;
+  aubio_cblas_xswap(half, s->data, 1, s->data + half, 1);
+#endif
 }
 
@@ -292,8 +305,12 @@
 {
   smpl_t energy = 0.;
+#ifndef HAVE_ACCELERATE
   uint_t j;
   for (j = 0; j < f->length; j++) {
     energy += SQR (f->data[j]);
   }
+#else
+  energy = aubio_cblas_dot(f->length, f->data, 1, f->data, 1);
+#endif
   return energy / f->length;
 }
Index: src/pitch/pitch.c
===================================================================
--- src/pitch/pitch.c	(revision f8340e1cf44061891b4d45d8c835bd140ee46318)
+++ src/pitch/pitch.c	(revision 0969113110f96081523419ccde6ac0e8616e8eeb)
@@ -240,6 +240,7 @@
 aubio_pitch_slideblock (aubio_pitch_t * p, fvec_t * ibuf)
 {
-  uint_t j = 0, overlap_size = 0;
-  overlap_size = p->buf->length - ibuf->length;
+  uint_t overlap_size = p->buf->length - ibuf->length;
+#if !HAVE_MEMCPY_HACKS
+  uint_t j;
   for (j = 0; j < overlap_size; j++) {
     p->buf->data[j] = p->buf->data[j + ibuf->length];
@@ -248,4 +249,10 @@
     p->buf->data[j + overlap_size] = ibuf->data[j];
   }
+#else
+  smpl_t *data = p->buf->data;
+  smpl_t *newdata = ibuf->data;
+  memmove(data, data + ibuf->length, overlap_size);
+  memcpy(data + overlap_size, newdata, ibuf->length);
+#endif
 }
 
Index: src/pitch/pitchyinfft.c
===================================================================
--- src/pitch/pitchyinfft.c	(revision f8340e1cf44061891b4d45d8c835bd140ee46318)
+++ src/pitch/pitchyinfft.c	(revision 0969113110f96081523419ccde6ac0e8616e8eeb)
@@ -108,7 +108,5 @@
   smpl_t tmp = 0., sum = 0.;
   // window the input
-  for (l = 0; l < input->length; l++) {
-    p->winput->data[l] = p->win->data[l] * input->data[l];
-  }
+  fvec_weighted_copy(input, p->win, p->winput);
   // get the real / imag parts of its fft
   aubio_fft_do_complex (p->fft, p->winput, fftout);
