ref: 95a64c7e8aaaacb64ed5a0c81e8bdd7a0454ce1e
parent: 787f1f341dda2329703d7b0759fdb25a214eba01
author: Amaury Hazan <mahmoudax@gmail.org>
date: Wed Sep 12 15:23:35 EDT 2007
secondary frequency vectors make a copy of freqs values and are properly freed
--- a/src/filterbank.c
+++ b/src/filterbank.c
@@ -180,15 +180,12 @@
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 @@
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,16 +300,14 @@
}
+
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;
--- a/src/sample.c
+++ b/src/sample.c
@@ -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;