aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/descriptors.c57
-rw-r--r--src/vector.c48
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;
+
+}
+
+