changeset 164:7a23234648b4

Pass block size to xtract_init_vdsp_data() instead of block size / 2. Fixes bug with erroneous values in second half of spectrum when using vDSP FFT
author Jamie Bullock <jamie@jamiebullock.com>
date Sun, 02 Jun 2013 22:54:41 +0100
parents 5c20a9a34f0c
children 19e5ef005bdb
files src/init.c
diffstat 1 files changed, 6 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/init.c	Fri May 31 23:01:59 2013 +0100
+++ b/src/init.c	Sun Jun 02 22:54:41 2013 +0100
@@ -126,8 +126,8 @@
 void xtract_init_vdsp_data(xtract_vdsp_data *vdsp_data, unsigned int N)
 {
     vdsp_data->setup = vDSP_create_fftsetupD(log2f(N), FFT_RADIX2);
-    vdsp_data->fft.realp = (double *) malloc((N >> 1) * sizeof(double));
-    vdsp_data->fft.imagp = (double *) malloc((N >> 1) * sizeof(double));
+    vdsp_data->fft.realp = (double *) malloc((N >> 1) * sizeof(double) + 1);
+    vdsp_data->fft.imagp = (double *) malloc((N >> 1) * sizeof(double) + 1);
     vdsp_data->log2N = log2f(N);
     vdsp_data->initialised = true;
 }
@@ -144,14 +144,6 @@
 
 int xtract_init_vdsp_(int N, int feature_name)
 {
-
-    int M = N >> 1;
-
-    if(feature_name == XTRACT_AUTOCORRELATION_FFT)
-    {
-        M = N; /* allow for zero padding */
-    }
-
     switch(feature_name)
     {
     case XTRACT_SPECTRUM:
@@ -159,27 +151,27 @@
         {
             xtract_free_vdsp_data(&vdsp_data_spectrum);
         }
-        xtract_init_vdsp_data(&vdsp_data_spectrum, M);
+        xtract_init_vdsp_data(&vdsp_data_spectrum, N);
         break;
     case XTRACT_AUTOCORRELATION_FFT:
         if(vdsp_data_autocorrelation_fft.initialised)
         {
             xtract_free_vdsp_data(&vdsp_data_autocorrelation_fft);
         }
-        xtract_init_vdsp_data(&vdsp_data_autocorrelation_fft, M);
+        xtract_init_vdsp_data(&vdsp_data_autocorrelation_fft, N * 2); // allow for zero padding
         break;
     case XTRACT_DCT:
         if(vdsp_data_dct.initialised)
         {
             xtract_free_vdsp_data(&vdsp_data_dct);
         }
-        xtract_init_vdsp_data(&vdsp_data_dct, M);
+        xtract_init_vdsp_data(&vdsp_data_dct, N);
     case XTRACT_MFCC:
         if(vdsp_data_mfcc.initialised)
         {
             xtract_free_vdsp_data(&vdsp_data_mfcc);
         }
-        xtract_init_vdsp_data(&vdsp_data_mfcc, M);
+        xtract_init_vdsp_data(&vdsp_data_mfcc, N);
         break;
     }