shithub: aubio

Download patch

ref: 3873e5e8670dc2a851e38f414b027bf84c06c4b2
parent: 60583a3817b8c4120861ec7df2e9836146efd54d
author: Paul Brossier <piem@piem.org>
date: Tue Sep 5 09:01:34 EDT 2017

src/spectral/dct_ooura.c: further optimize by computing scaling factors once

--- a/src/spectral/dct_ooura.c
+++ b/src/spectral/dct_ooura.c
@@ -30,6 +30,7 @@
   fvec_t *input;
   smpl_t *w;
   int *ip;
+  smpl_t scalers[5];
 };
 
 aubio_dct_t * new_aubio_dct (uint_t size) {
@@ -44,6 +45,11 @@
   s->w = AUBIO_ARRAY(smpl_t, s->size * 5 / 4);
   s->ip = AUBIO_ARRAY(int, 3 + (1 << (int)FLOOR(LOG(s->size/2) / LOG(2))) / 2);
   s->ip[0] = 0;
+  s->scalers[0] = 2. * SQRT(1./(4.*s->size));
+  s->scalers[1] = 2. * SQRT(1./(2.*s->size));
+  s->scalers[2] = 1. / s->scalers[0];
+  s->scalers[3] = 1. / s->scalers[1];
+  s->scalers[4] = 2. / s->size;
   return s;
 beach:
   AUBIO_FREE(s);
@@ -62,9 +68,9 @@
   fvec_copy(input, s->input);
   aubio_ooura_ddct(s->size, -1, s->input->data, s->ip, s->w);
   // apply orthonormal scaling
-  s->input->data[0] *= 2.* SQRT(1./(4.*s->input->length));
+  s->input->data[0] *= s->scalers[0];
   for (i = 1; i < s->input->length; i++) {
-    s->input->data[i] *= 2. * SQRT(1./(2.*s->input->length));
+    s->input->data[i] *= s->scalers[1];
   }
   fvec_copy(s->input, output);
 }
@@ -72,14 +78,14 @@
 void aubio_dct_rdo(aubio_dct_t *s, const fvec_t *input, fvec_t *output) {
   uint_t i = 0;
   fvec_copy(input, s->input);
-  s->input->data[0] /= 2.* SQRT(1./(4.*s->input->length));
+  s->input->data[0] *= s->scalers[2];
   for (i = 1; i < s->input->length; i++) {
-    s->input->data[i] /= 2. * SQRT(1./(2.*s->input->length));
+    s->input->data[i] *= s->scalers[3];
   }
   s->input->data[0] *= .5;
   aubio_ooura_ddct(s->size, 1, s->input->data, s->ip, s->w);
   for (i = 0; i < s->input->length; i++) {
-    s->input->data[i] *= 2./s->input->length;
+    s->input->data[i] *= s->scalers[4];
   }
   fvec_copy(s->input, output);
 }