aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/descriptors.c60
-rw-r--r--src/libxtract.c1
-rw-r--r--src/scalar.c10
-rw-r--r--src/vector.c13
4 files changed, 69 insertions, 15 deletions
diff --git a/src/descriptors.c b/src/descriptors.c
index e96f467..444256d 100644
--- a/src/descriptors.c
+++ b/src/descriptors.c
@@ -71,7 +71,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*argv_min = XTRACT_ANY;
*argv_max = XTRACT_ANY;
*argv_def = XTRACT_ANY;
- *argv_unit = XTRACT_ANY;
+ *argv_unit = XTRACT_DBFS;
break;
case XTRACT_SPECTRAL_INHARMONICITY:
*argv_min = 0.f;
@@ -86,6 +86,12 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*argv_def = XTRACT_SR_DEFAULT;
*argv_unit = XTRACT_HERTZ;
break;
+ case XTRACT_FLATNESS_DB:
+ *argv_min = 0;
+ *argv_max = 1.0;
+ *argv_def = XTRACT_ANY;
+ *argv_unit = XTRACT_DBFS;
+ break;
/* argc = 2 */;
case XTRACT_ROLLOFF:
*argv_min = XTRACT_FFT_BANDS_MIN;
@@ -165,9 +171,9 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*(argv_def + 2) = 0;
*(argv_unit + 2) = XTRACT_NONE;
*(argv_min + 3) = 0;
- *(argv_max + 3) = 1;
+ *(argv_max + 3) = XTRACT_ANY;
*(argv_def + 3) = 0;
- *(argv_unit + 3) = XTRACT_NONE;
+ *(argv_unit + 3) = XTRACT_BINS;
break;
case XTRACT_BARK_COEFFICIENTS:
/* BARK_COEFFICIENTS is special because argc = BARK_BANDS */
@@ -206,9 +212,12 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_SPECTRAL_INHARMONICITY:
*argv_donor = XTRACT_FAILSAFE_F0;
break;
- case XTRACT_TONALITY:
+ case XTRACT_FLATNESS_DB:
*argv_donor = XTRACT_FLATNESS;
break;
+ case XTRACT_TONALITY:
+ *argv_donor = XTRACT_FLATNESS_DB;
+ break;
case XTRACT_LOWEST_VALUE:
case XTRACT_F0:
case XTRACT_FAILSAFE_F0:
@@ -254,6 +263,12 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*(argv_donor + 2) = XTRACT_ANY;
*(argv_donor + 3) = XTRACT_ANY;
break;
+ case XTRACT_SUBBANDS:
+ *argv_donor = XTRACT_ANY;
+ *(argv_donor + 1) = XTRACT_ANY;
+ *(argv_donor + 2) = XTRACT_ANY;
+ *(argv_donor + 3) = XTRACT_ANY;
+ break;
/* BARK_BANDS */
case XTRACT_BARK_COEFFICIENTS:
*argv_donor = XTRACT_INIT_BARK;
@@ -304,6 +319,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_POWER:
case XTRACT_HPS:
case XTRACT_PEAK_SPECTRUM:
+ case XTRACT_SUBBANDS:
case XTRACT_MFCC:
*data_format = XTRACT_SPECTRAL_MAGNITUDES;
break;
@@ -335,6 +351,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*data_format = XTRACT_AUDIO_SAMPLES;
break;
case XTRACT_TONALITY:
+ case XTRACT_FLATNESS_DB:
*data_format = XTRACT_NO_DATA;
break;
case XTRACT_TRISTIMULUS_1:
@@ -394,6 +411,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_NOISINESS:
case XTRACT_CREST:
case XTRACT_FLATNESS:
+ case XTRACT_FLATNESS_DB:
case XTRACT_POWER:
case XTRACT_BARK_COEFFICIENTS:
case XTRACT_RMS_AMPLITUDE:
@@ -408,6 +426,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_LPC:
case XTRACT_LPCC:
case XTRACT_WINDOWED:
+ case XTRACT_SUBBANDS:
*data_unit = XTRACT_ANY;
break;
case XTRACT_SPECTRAL_MEAN:
@@ -444,7 +463,6 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
strcpy(desc, "Extract the mean of an input vector");
strcpy(p_desc, "Extract the mean of a range of values");
strcpy(author, "");
- d->argv.type = XTRACT_NONE;
break;
case XTRACT_VARIANCE:
strcpy(name, "variance");
@@ -660,6 +678,14 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
strcpy(author, "Rabiner and Juang");
*year = 1993;
break;
+ case XTRACT_SUBBANDS:
+ strcpy(name, "subbands");
+ strcpy(p_name, "Sub band coefficients");
+ strcpy(desc, "Extract subband coefficients from spectral magnitudes");
+ strcpy(p_desc,
+ "Extract subband coefficients from spectral magnitudes");
+ strcpy(author, "");
+ break;
case XTRACT_BARK_COEFFICIENTS:
strcpy(name, "bark_coefficients");
strcpy(p_name, "Bark Coefficients");
@@ -740,6 +766,15 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
strcpy(author, "Tristan Jehan");
*year = 2005;
break;
+ case XTRACT_FLATNESS_DB:
+ strcpy(name, "flatness_db");
+ strcpy(p_name, "Log Spectral Flatness");
+ strcpy(desc, "Extract the log spectral flatness of a spectrum");
+ strcpy(p_desc,
+ "Extract the log spectral flatness of an audio spectrum");
+ strcpy(author, "Peeters");
+ *year = 2003;
+ break;
case XTRACT_SPREAD:
strcpy(name, "spread");
strcpy(p_name, "Spectral Spread");
@@ -933,6 +968,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_LOWEST_VALUE:
case XTRACT_F0:
case XTRACT_FAILSAFE_F0:
+ case XTRACT_FLATNESS_DB:
case XTRACT_TONALITY:
*argc = 1;
*argv_type = XTRACT_FLOAT;
@@ -955,6 +991,10 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*argc = 4;
*argv_type = XTRACT_FLOAT;
break;
+ case XTRACT_SUBBANDS:
+ *argc = 4;
+ *argv_type = XTRACT_INT;
+ break;
case XTRACT_MFCC:
*argc = 1;
*argv_type = XTRACT_MEL_FILTER;
@@ -1034,6 +1074,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_ROLLOFF:
case XTRACT_LOUDNESS:
case XTRACT_FLATNESS:
+ case XTRACT_FLATNESS_DB:
case XTRACT_TONALITY:
case XTRACT_CREST:
case XTRACT_NOISINESS:
@@ -1060,6 +1101,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_BARK_COEFFICIENTS:
case XTRACT_PEAK_SPECTRUM:
case XTRACT_SPECTRUM:
+ case XTRACT_SUBBANDS:
case XTRACT_AUTOCORRELATION_FFT:
case XTRACT_MFCC:
case XTRACT_LPC:
@@ -1108,6 +1150,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_ROLLOFF:
case XTRACT_LOUDNESS:
case XTRACT_FLATNESS:
+ case XTRACT_FLATNESS_DB:
case XTRACT_TONALITY:
case XTRACT_CREST:
case XTRACT_NOISINESS:
@@ -1130,6 +1173,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_BARK_COEFFICIENTS:
case XTRACT_PEAK_SPECTRUM:
case XTRACT_SPECTRUM:
+ case XTRACT_SUBBANDS:
case XTRACT_AUTOCORRELATION_FFT:
case XTRACT_MFCC:
case XTRACT_LPC:
@@ -1204,6 +1248,11 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
*result_min = 0.f;
*result_max = 1.f;
break;
+ case XTRACT_FLATNESS_DB:
+ *result_unit = XTRACT_DBFS;
+ *result_min = XTRACT_ANY; /* FIX: check this */
+ *result_max = XTRACT_ANY;
+ break;
case XTRACT_LOUDNESS:
case XTRACT_FLATNESS:
case XTRACT_TONALITY:
@@ -1233,6 +1282,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){
case XTRACT_AMDF:
case XTRACT_ASDF:
case XTRACT_DCT:
+ case XTRACT_SUBBANDS:
case XTRACT_WINDOWED:
*result_format = XTRACT_ARBITRARY_SERIES;
*result_unit = XTRACT_ANY;
diff --git a/src/libxtract.c b/src/libxtract.c
index 5de699f..0215add 100644
--- a/src/libxtract.c
+++ b/src/libxtract.c
@@ -84,6 +84,7 @@ int(*xtract[])(const float *, const int, const void *, float *) = {
xtract_harmonic_spectrum,
xtract_lpc,
xtract_lpcc,
+ xtract_subbands,
/* xtract_helper.h */
xtract_windowed
};
diff --git a/src/scalar.c b/src/scalar.c
index b2fa868..4a2b672 100644
--- a/src/scalar.c
+++ b/src/scalar.c
@@ -535,14 +535,14 @@ int xtract_flatness(const float *data, const int N, const void *argv, float *res
int xtract_flatness_db(const float *data, const int N, const void *argv, float *result){
- float flatness_db;
+ float flatness;
- flatness_db = *(float *)argv;
+ flatness = *(float *)argv;
- if (flatness_db <= 0)
- flatness_db = XTRACT_LOG_LIMIT;
+ if (flatness <= 0)
+ flatness = XTRACT_LOG_LIMIT;
- *result = 10 * log10f(flatness_db);
+ *result = 10 * log10f(flatness);
return XTRACT_SUCCESS;
diff --git a/src/vector.c b/src/vector.c
index 97a876b..449cd0d 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -545,9 +545,10 @@ int xtract_lpcc(const float *data, const int N, const void *argv, float *result)
int cep_length;
if(argv == NULL)
- cep_length = N - 1;
+ cep_length = N - 1; /* FIX: if we're going to have default values, they should come from the descriptor */
else
- cep_length = (int)((float *)argv)[0];
+ cep_length = *(int *)argv;
+ //cep_length = (int)((float *)argv)[0];
memset(result, 0, cep_length * sizeof(float));
@@ -584,20 +585,22 @@ int xtract_subbands(const float *data, const int N, const void *argv, float *res
scale = argi[2];
start = argi[3];
-
if(scale == XTRACT_LINEAR_SUBBANDS)
bw = floorf((N - start) / nbands);
else
bw = start;
lower = start;
+ rv = XTRACT_SUCCESS;
for(n = 0; n < nbands; n++){
/* Bounds sanity check */
- if(lower + bw >= N)
- result[n] = 0.f
+ if(lower >= N || lower + bw >= N){
+ // printf("n: %d\n", n);
+ result[n] = 0.f;
continue;
+ }
rv = xtract[xtract_func](data+lower, bw, NULL, &result[n]);