diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/descriptors.c | 57 | ||||
-rw-r--r-- | src/vector.c | 48 |
2 files changed, 86 insertions, 19 deletions
diff --git a/src/descriptors.c b/src/descriptors.c index 4460de8..e96f467 100644 --- a/src/descriptors.c +++ b/src/descriptors.c @@ -86,7 +86,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){ *argv_def = XTRACT_SR_DEFAULT; *argv_unit = XTRACT_HERTZ; break; - /* argc = 2 */; + /* argc = 2 */; case XTRACT_ROLLOFF: *argv_min = XTRACT_FFT_BANDS_MIN; *argv_max = XTRACT_FFT_BANDS_MAX; @@ -97,24 +97,6 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){ *(argv_def + 1) = 95.f; *(argv_unit + 1) = XTRACT_PERCENT; break; - case XTRACT_SPECTRUM: - *argv_min = XTRACT_SR_LOWER_LIMIT / XTRACT_FFT_BANDS_MIN; - *argv_max = XTRACT_SR_UPPER_LIMIT / XTRACT_FFT_BANDS_MAX; - *argv_def = XTRACT_SR_DEFAULT / XTRACT_FFT_BANDS_DEF; - *argv_unit = XTRACT_HERTZ; - *(argv_min + 1) = 0; - *(argv_max + 1) = 3 ; - *(argv_def + 1) = 0; - *(argv_unit + 1) = XTRACT_NONE; - *(argv_min + 2) = 0; - *(argv_max + 2) = 1; - *(argv_def + 2) = 0; - *(argv_unit + 2) = XTRACT_NONE; - *(argv_min + 3) = 0; - *(argv_max + 3) = 1; - *(argv_def + 3) = 0; - *(argv_unit + 3) = XTRACT_NONE; - break; case XTRACT_PEAK_SPECTRUM: *argv_min = XTRACT_SR_LOWER_LIMIT / 2; *argv_max = XTRACT_SR_UPPER_LIMIT / 2; @@ -150,6 +132,43 @@ xtract_function_descriptor_t *xtract_make_descriptors(void){ *(argv_def + 1) = XTRACT_NONE; *(argv_unit + 1) = XTRACT_NONE; break; + /* argc = 4 */ + case XTRACT_SPECTRUM: + *argv_min = XTRACT_SR_LOWER_LIMIT / XTRACT_FFT_BANDS_MIN; + *argv_max = XTRACT_SR_UPPER_LIMIT / XTRACT_FFT_BANDS_MAX; + *argv_def = XTRACT_SR_DEFAULT / XTRACT_FFT_BANDS_DEF; + *argv_unit = XTRACT_HERTZ; + *(argv_min + 1) = 0; + *(argv_max + 1) = 3 ; + *(argv_def + 1) = 0; + *(argv_unit + 1) = XTRACT_NONE; + *(argv_min + 2) = 0; + *(argv_max + 2) = 1; + *(argv_def + 2) = 0; + *(argv_unit + 2) = XTRACT_NONE; + *(argv_min + 3) = 0; + *(argv_max + 3) = 1; + *(argv_def + 3) = 0; + *(argv_unit + 3) = XTRACT_NONE; + break; + case XTRACT_SUBBANDS: + *argv_min = XTRACT_ANY; + *argv_max = XTRACT_ANY; + *argv_def = XTRACT_MEAN; + *argv_unit = XTRACT_NONE; + *(argv_min + 1) = 1; + *(argv_max + 1) = 16384; + *(argv_def + 1) = 4; + *(argv_unit + 1) = XTRACT_NONE; + *(argv_min + 2) = 0; + *(argv_max + 2) = 32; + *(argv_def + 2) = 0; + *(argv_unit + 2) = XTRACT_NONE; + *(argv_min + 3) = 0; + *(argv_max + 3) = 1; + *(argv_def + 3) = 0; + *(argv_unit + 3) = XTRACT_NONE; + break; case XTRACT_BARK_COEFFICIENTS: /* BARK_COEFFICIENTS is special because argc = BARK_BANDS */ case XTRACT_WINDOWED: diff --git a/src/vector.c b/src/vector.c index ce74630..97a876b 100644 --- a/src/vector.c +++ b/src/vector.c @@ -573,4 +573,52 @@ int xtract_lpcc(const float *data, const int N, const void *argv, float *result) // return XTRACT_SUCCESS; //} +int xtract_subbands(const float *data, const int N, const void *argv, float *result){ + + int n, bw, xtract_func, nbands, scale, start, lower, *argi, rv; + + argi = (int *)argv; + + xtract_func = argi[0]; + nbands = argi[1]; + scale = argi[2]; + start = argi[3]; + + + if(scale == XTRACT_LINEAR_SUBBANDS) + bw = floorf((N - start) / nbands); + else + bw = start; + + lower = start; + + for(n = 0; n < nbands; n++){ + + /* Bounds sanity check */ + if(lower + bw >= N) + result[n] = 0.f + continue; + + rv = xtract[xtract_func](data+lower, bw, NULL, &result[n]); + + if(rv != XTRACT_SUCCESS) + return rv; + + switch(scale){ + case XTRACT_OCTAVE_SUBBANDS: + lower += bw; + bw = lower; + break; + case XTRACT_LINEAR_SUBBANDS: + lower += bw; + break; + } + + } + + return rv; + +} + + |