diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/descriptors.c | 60 | ||||
-rw-r--r-- | src/libxtract.c | 1 | ||||
-rw-r--r-- | src/scalar.c | 10 | ||||
-rw-r--r-- | src/vector.c | 13 |
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]); |