secondary frequency vectors make a copy of freqs values and are properly freed
authorAmaury Hazan <mahmoudax@gmail.org>
Wed, 12 Sep 2007 17:23:35 +0000 (19:23 +0200)
committerAmaury Hazan <mahmoudax@gmail.org>
Wed, 12 Sep 2007 17:23:35 +0000 (19:23 +0200)
src/filterbank.c
src/sample.c

index a0aa50e..fdc549e 100644 (file)
@@ -180,15 +180,12 @@ aubio_filterbank_t * new_aubio_filterbank_mfcc2(uint_t n_filters, uint_t win_s,
   uint_t allFilters = linearFilters + logFilters;
   
   //buffers for computing filter frequencies
-  fvec_t * freqs=new_fvec( allFilters +2 , 1);
+  fvec_t * freqs=new_fvec(allFilters+2 , 1);
   
   fvec_t * lower_freqs=new_fvec( allFilters, 1);
   fvec_t * upper_freqs=new_fvec( allFilters, 1);
   fvec_t * center_freqs=new_fvec( allFilters, 1);
-     
-  /*fvec_t * lower_freqs=freqs;
-  fvec_t * upper_freqs=freqs;
-  fvec_t * center_freqs=freqs*/;
+
   
   fvec_t * triangle_heights=new_fvec( allFilters, 1);
   //lookup table of each bin frequency in hz
@@ -196,29 +193,33 @@ aubio_filterbank_t * new_aubio_filterbank_mfcc2(uint_t n_filters, uint_t win_s,
 
   uint_t filter_cnt, bin_cnt;
   
-  //first: filling all the linear filter frequencies
+  //first step: filling all the linear filter frequencies
   for(filter_cnt=0; filter_cnt<linearFilters; filter_cnt++){
     freqs->data[0][filter_cnt]=lowestFrequency+ filter_cnt*linearSpacing;
   }
   smpl_t lastlinearCF=freqs->data[0][filter_cnt-1];
   
-  //second: filling all the log filter frequencies
+  //second step: filling all the log filter frequencies
   for(filter_cnt=0; filter_cnt<logFilters+2; filter_cnt++){
     freqs->data[0][filter_cnt+linearFilters]=lastlinearCF*(pow(logSpacing,filter_cnt+1));
   }
-  
-  
-  //make fvec->data point directly to freqs arrays
-  lower_freqs->data=freqs->data;
-  center_freqs->data[0]=&(freqs->data[0][1]);
-  upper_freqs->data[0]=&(freqs->data[0][2]);
 
-  
+  //Option 1. copying interesting values to lower_freqs, center_freqs and upper freqs arrays
+  //TODO: would be nicer to have a reference to freqs->data, anyway we do not care in this init step
+    
+  for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
+    lower_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt];
+    center_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt+1];
+    upper_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt+2];
+  }
+
+
   //computing triangle heights so that each triangle has unit area
   for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
     triangle_heights->data[0][filter_cnt]=2./(upper_freqs->data[0][filter_cnt]-lower_freqs->data[0][filter_cnt]);
   }
-
+  
+  
   //AUBIO_DBG
   AUBIO_DBG("filter tables frequencies\n");
   for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++)
@@ -299,17 +300,15 @@ aubio_filterbank_t * new_aubio_filterbank_mfcc2(uint_t n_filters, uint_t win_s,
   }
   
   
+
   del_fvec(freqs);
-  //TODO: Check how to do a proper free for the following f_vec
+  del_fvec(lower_freqs);
+  del_fvec(upper_freqs);
+  del_fvec(center_freqs);
 
-  //del_fvec(lower_freqs);
-  //del_fvec(upper_freqs);
-  //del_fvec(center_freqs);
   del_fvec(triangle_heights);
   del_fvec(fft_freqs);
 
-  
-
   return fb;
 
 }
index c85694a..1daf350 100644 (file)
@@ -20,6 +20,7 @@
 #include "aubio_priv.h"
 #include "sample.h"
 
+
 fvec_t * new_fvec( uint_t length, uint_t channels) {
   fvec_t * s = AUBIO_NEW(fvec_t);
   uint_t i,j;