annotate src/vector.c @ 144:7fbca00c2c05

removed floatArray and intArray from Java SWIG bindings
author Jamie Bullock <jamie@jamiebullock.com>
date Tue, 08 Jan 2013 14:32:45 +0000
parents e4f704649c50
children baaa9d8b4d10
rev   line source
jamie@141 1 /*
jamie@141 2 * Copyright (C) 2012 Jamie Bullock
jamie@140 3 *
jamie@141 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
jamie@141 5 * of this software and associated documentation files (the "Software"), to
jamie@141 6 * deal in the Software without restriction, including without limitation the
jamie@141 7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
jamie@141 8 * sell copies of the Software, and to permit persons to whom the Software is
jamie@141 9 * furnished to do so, subject to the following conditions:
jamie@1 10 *
jamie@141 11 * The above copyright notice and this permission notice shall be included in
jamie@141 12 * all copies or substantial portions of the Software.
jamie@1 13 *
jamie@141 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jamie@141 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jamie@141 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jamie@141 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jamie@141 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
jamie@141 19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
jamie@141 20 * IN THE SOFTWARE.
jamie@1 21 *
jamie@1 22 */
jamie@1 23
jamie@1 24 /* xtract_vector.c: defines functions that extract a feature as a single value from an input vector */
jamie@1 25
jamie@1 26 #include <math.h>
jamie@43 27 #include <string.h>
jamie@43 28 #include <stdlib.h>
jamie@30 29
jamie@140 30 #include "fftsg.h"
jamie@140 31
jamie@98 32 #include "xtract/libxtract.h"
jamie@98 33 #include "xtract_macros_private.h"
jamie@98 34
jamie@85 35 #ifndef roundf
jamie@140 36 float roundf(float f)
jamie@140 37 {
jamie@140 38 if (f - (int)f >= 0.5)
jamie@140 39 return (float)((int)f + 1);
jamie@140 40 else
jamie@140 41 return (float)((int)f);
jamie@140 42 }
jamie@85 43 #endif
jamie@85 44
jamie@113 45 #ifndef powf
jamie@120 46 #define powf pow
jamie@113 47 #endif
jamie@113 48
jamie@113 49 #ifndef expf
jamie@120 50 #define expf exp
jamie@113 51 #endif
jamie@113 52
jamie@113 53 #ifndef sqrtf
jamie@120 54 #define sqrtf sqrt
jamie@113 55 #endif
jamie@113 56
jamie@113 57 #ifndef fabsf
jamie@120 58 #define fabsf fabs
jamie@113 59 #endif
jamie@113 60
jamie@98 61 #include "xtract_globals_private.h"
jamie@98 62 #include "xtract_macros_private.h"
jamie@1 63
jamie@140 64 int xtract_spectrum(const float *data, const int N, const void *argv, float *result)
jamie@140 65 {
jamie@1 66
jamie@140 67 int vector = 0;
jamie@140 68 int withDC = 0;
jamie@140 69 int normalise = 0;
jamie@140 70 float q = 0.f;
jamie@140 71 float temp = 0.f;
jamie@140 72 float max = 0.f;
jamie@140 73 float NxN = XTRACT_SQ(N);
jamie@140 74 float *marker = NULL;
jamie@140 75 size_t bytes = N * sizeof(double);
jamie@140 76 double *rfft = NULL;
jamie@140 77 unsigned int n = 0;
jamie@140 78 unsigned int m = 0;
jamie@140 79 unsigned int nx2 = 0;
jamie@140 80 unsigned int M = N >> 1;
jamie@98 81
jamie@140 82 rfft = (double *)malloc(bytes);
jamie@140 83 //memcpy(rfft, data, bytes);
jamie@1 84
jamie@140 85 for(n = 0; n < N; ++n){
jamie@140 86 rfft[n] = (double)data[n];
jamie@140 87 }
jamie@1 88
jamie@56 89 q = *(float *)argv;
jamie@54 90 vector = (int)*((float *)argv+1);
jamie@70 91 withDC = (int)*((float *)argv+2);
jamie@105 92 normalise = (int)*((float *)argv+3);
jamie@105 93
jamie@56 94 XTRACT_CHECK_q;
jamie@46 95
jamie@140 96 if(!ooura_data_spectrum.initialised)
jamie@140 97 {
jamie@140 98 fprintf(stderr,
jamie@140 99 "libxtract: error: xtract_spectrum() failed, "
jamie@140 100 "fft data unitialised.\n");
jamie@98 101 return XTRACT_NO_RESULT;
jamie@98 102 }
jamie@98 103
jamie@140 104 /* ooura is in-place
jamie@140 105 * the output format seems to be
jamie@140 106 * a[0] - DC, a[1] - nyquist, a[2...N-1] - remaining bins
jamie@140 107 */
jamie@140 108 rdft(N, 1, rfft, ooura_data_spectrum.ooura_ip,
jamie@140 109 ooura_data_spectrum.ooura_w);
jamie@54 110
jamie@140 111 switch(vector)
jamie@140 112 {
jamie@67 113
jamie@120 114 case XTRACT_LOG_MAGNITUDE_SPECTRUM:
jamie@140 115 for(n = 0, m = 0; m < M; ++n, ++m)
jamie@140 116 {
jamie@140 117 if(!withDC && n == 0)
jamie@140 118 {
jamie@140 119 continue;
jamie@140 120 }
jamie@140 121 nx2 = n * 2;
jamie@140 122 temp = XTRACT_SQ(rfft[nx2]) + XTRACT_SQ(rfft[nx2+1]);
jamie@140 123 if (temp > XTRACT_LOG_LIMIT)
jamie@140 124 {
jamie@140 125 temp = logf(sqrtf(temp) / (float)N);
jamie@140 126 }
jamie@140 127 else
jamie@140 128 {
jamie@140 129 temp = XTRACT_LOG_LIMIT_DB;
jamie@140 130 }
jamie@140 131 result[m] =
jamie@140 132 /* Scaling */
jamie@140 133 (temp + XTRACT_DB_SCALE_OFFSET) /
jamie@140 134 XTRACT_DB_SCALE_OFFSET;
jamie@111 135
jamie@140 136 XTRACT_SET_FREQUENCY;
jamie@140 137 XTRACT_GET_MAX;
jamie@140 138 }
jamie@140 139 break;
jamie@67 140
jamie@140 141 case XTRACT_POWER_SPECTRUM:
jamie@140 142 for(n = 0, m = 0; m < M; ++n, ++m)
jamie@140 143 {
jamie@140 144 if(!withDC && n == 0)
jamie@140 145 {
jamie@140 146 ++n;
jamie@120 147 }
jamie@140 148 result[m] = (XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) / NxN;
jamie@140 149 XTRACT_SET_FREQUENCY;
jamie@140 150 XTRACT_GET_MAX;
jamie@140 151 }
jamie@140 152 break;
jamie@120 153
jamie@140 154 case XTRACT_LOG_POWER_SPECTRUM:
jamie@140 155 for(n = 0, m = 0; m < M; ++n, ++m)
jamie@140 156 {
jamie@140 157 if(!withDC && n == 0)
jamie@140 158 {
jamie@140 159 ++n;
jamie@120 160 }
jamie@140 161 if ((temp = XTRACT_SQ(rfft[n]) + XTRACT_SQ(rfft[N - n])) >
jamie@140 162 XTRACT_LOG_LIMIT)
jamie@140 163 temp = logf(temp / NxN);
jamie@140 164 else
jamie@140 165 temp = XTRACT_LOG_LIMIT_DB;
jamie@67 166
jamie@140 167 result[m] = (temp + XTRACT_DB_SCALE_OFFSET) /
jamie@140 168 XTRACT_DB_SCALE_OFFSET;
jamie@140 169 XTRACT_SET_FREQUENCY;
jamie@140 170 XTRACT_GET_MAX;
jamie@140 171 }
jamie@140 172 break;
jamie@111 173
jamie@140 174 default:
jamie@140 175 /* MAGNITUDE_SPECTRUM */
jamie@140 176 for(n = 0, m = 0; m < M; ++n, ++m)
jamie@140 177 {
jamie@140 178 marker = &result[m];
jamie@140 179
jamie@140 180 if(n==0 && !withDC) /* discard DC and keep Nyquist */
jamie@140 181 {
jamie@140 182 ++n;
jamie@140 183 marker = &result[M-1];
jamie@120 184 }
jamie@140 185 if(n==1 && withDC) /* discard Nyquist */
jamie@140 186 {
jamie@140 187 ++n;
jamie@140 188 }
jamie@120 189
jamie@140 190 *marker = (float)(sqrt(XTRACT_SQ(rfft[n*2]) +
jamie@140 191 XTRACT_SQ(rfft[n*2+1])) / (double)N);
jamie@111 192
jamie@140 193 XTRACT_SET_FREQUENCY;
jamie@140 194 XTRACT_GET_MAX;
jamie@140 195
jamie@140 196 }
jamie@140 197 break;
jamie@70 198 }
jamie@105 199
jamie@140 200 if(normalise)
jamie@140 201 {
jamie@105 202 for(n = 0; n < M; n++)
jamie@105 203 result[n] /= max;
jamie@105 204 }
jamie@105 205
jamie@140 206 free(rfft);
jamie@120 207
jamie@56 208 return XTRACT_SUCCESS;
jamie@1 209 }
jamie@1 210
jamie@140 211 int xtract_autocorrelation_fft(const float *data, const int N, const void *argv, float *result)
jamie@140 212 {
jamie@120 213
jamie@140 214 double *rfft = NULL;
jamie@140 215 int n = 0;
jamie@140 216 int M = 0;
jamie@1 217
jamie@75 218 M = N << 1;
jamie@43 219
jamie@75 220 /* Zero pad the input vector */
jamie@140 221 rfft = (double *)calloc(M, sizeof(double));
jamie@140 222 memcpy(rfft, data, N * sizeof(float));
jamie@75 223
jamie@140 224 rdft(M, 1, rfft, ooura_data_autocorrelation_fft.ooura_ip,
jamie@140 225 ooura_data_autocorrelation_fft.ooura_w);
jamie@1 226
jamie@140 227 for(n = 2; n < M; n++)
jamie@140 228 {
jamie@140 229 rfft[n*2] = XTRACT_SQ(rfft[n*2]) + XTRACT_SQ(rfft[n*2+1]);
jamie@140 230 rfft[n*2+1] = 0.f;
jamie@75 231 }
jamie@120 232
jamie@140 233 rfft[0] = XTRACT_SQ(rfft[0]);
jamie@140 234 rfft[1] = XTRACT_SQ(rfft[1]);
jamie@75 235
jamie@140 236 rdft(M, -1, rfft, ooura_data_autocorrelation_fft.ooura_ip,
jamie@140 237 ooura_data_autocorrelation_fft.ooura_w);
jamie@120 238
jamie@75 239 /* Normalisation factor */
jamie@75 240 M = M * N;
jamie@75 241
jamie@75 242 for(n = 0; n < N; n++)
jamie@140 243 result[n] = rfft[n] / (float)M;
jamie@75 244
jamie@140 245 free(rfft);
jamie@38 246
jamie@56 247 return XTRACT_SUCCESS;
jamie@1 248 }
jamie@1 249
jamie@140 250 int xtract_mfcc(const float *data, const int N, const void *argv, float *result)
jamie@140 251 {
jamie@30 252
jamie@30 253 xtract_mel_filter *f;
jamie@30 254 int n, filter;
jamie@30 255
jamie@30 256 f = (xtract_mel_filter *)argv;
jamie@120 257
jamie@140 258 for(filter = 0; filter < f->n_filters; filter++)
jamie@140 259 {
danstowell@68 260 result[filter] = 0.f;
jamie@140 261 for(n = 0; n < N; n++)
jamie@140 262 {
jamie@71 263 result[filter] += data[n] * f->filters[filter][n];
jamie@30 264 }
jamie@113 265 result[filter] = logf(result[filter] < XTRACT_LOG_LIMIT ? XTRACT_LOG_LIMIT : result[filter]);
jamie@30 266 }
jamie@30 267
jamie@30 268 xtract_dct(result, f->n_filters, NULL, result);
jamie@120 269
jamie@56 270 return XTRACT_SUCCESS;
jamie@30 271 }
jamie@30 272
jamie@140 273 int xtract_dct(const float *data, const int N, const void *argv, float *result)
jamie@140 274 {
jamie@120 275
jamie@140 276 int n;
jamie@140 277 int m;
jamie@140 278 float *temp = calloc(N, sizeof(float));
jamie@120 279
jamie@140 280 for (n = 0; n < N; ++n)
jamie@140 281 {
jamie@140 282 for(m = 1; m <= N; ++m) {
jamie@140 283 temp[n] += data[m - 1] * cos(M_PI * (n / (float)N) * (m - 0.5));
jamie@140 284 }
jamie@140 285 }
jamie@120 286
jamie@140 287 return XTRACT_SUCCESS;
jamie@30 288 }
jamie@30 289
jamie@140 290 int xtract_autocorrelation(const float *data, const int N, const void *argv, float *result)
jamie@140 291 {
jamie@30 292
jamie@30 293 /* Naive time domain implementation */
jamie@120 294
jamie@30 295 int n = N, i;
jamie@120 296
jamie@30 297 float corr;
jamie@30 298
jamie@140 299 while(n--)
jamie@140 300 {
jamie@120 301 corr = 0;
jamie@140 302 for(i = 0; i < N - n; i++)
jamie@140 303 {
jamie@30 304 corr += data[i] * data[i + n];
jamie@30 305 }
jamie@30 306 result[n] = corr / N;
jamie@30 307 }
jamie@38 308
jamie@56 309 return XTRACT_SUCCESS;
jamie@30 310 }
jamie@30 311
jamie@140 312 int xtract_amdf(const float *data, const int N, const void *argv, float *result)
jamie@140 313 {
jamie@1 314
jamie@1 315 int n = N, i;
jamie@120 316
jamie@6 317 float md, temp;
jamie@1 318
jamie@140 319 while(n--)
jamie@140 320 {
jamie@120 321 md = 0.f;
jamie@140 322 for(i = 0; i < N - n; i++)
jamie@140 323 {
jamie@6 324 temp = data[i] - data[i + n];
jamie@120 325 temp = (temp < 0 ? -temp : temp);
jamie@120 326 md += temp;
jamie@1 327 }
jamie@113 328 result[n] = md / (float)N;
jamie@1 329 }
jamie@38 330
jamie@56 331 return XTRACT_SUCCESS;
jamie@1 332 }
jamie@1 333
jamie@140 334 int xtract_asdf(const float *data, const int N, const void *argv, float *result)
jamie@140 335 {
jamie@120 336
jamie@1 337 int n = N, i;
jamie@120 338
jamie@1 339 float sd;
jamie@1 340
jamie@140 341 while(n--)
jamie@140 342 {
jamie@120 343 sd = 0.f;
jamie@140 344 for(i = 0; i < N - n; i++)
jamie@140 345 {
jamie@6 346 /*sd = 1;*/
jamie@56 347 sd += XTRACT_SQ(data[i] - data[i + n]);
jamie@1 348 }
jamie@113 349 result[n] = sd / (float)N;
jamie@1 350 }
jamie@38 351
jamie@56 352 return XTRACT_SUCCESS;
jamie@1 353 }
jamie@1 354
jamie@140 355 int xtract_bark_coefficients(const float *data, const int N, const void *argv, float *result)
jamie@140 356 {
jamie@1 357
jamie@1 358 int *limits, band, n;
jamie@1 359
jamie@1 360 limits = (int *)argv;
jamie@120 361
jamie@140 362 for(band = 0; band < XTRACT_BARK_BANDS - 1; band++)
jamie@140 363 {
jamie@110 364 result[band] = 0.f;
jamie@1 365 for(n = limits[band]; n < limits[band + 1]; n++)
jamie@1 366 result[band] += data[n];
jamie@1 367 }
jamie@38 368
jamie@56 369 return XTRACT_SUCCESS;
jamie@1 370 }
jamie@1 371
jamie@140 372 int xtract_peak_spectrum(const float *data, const int N, const void *argv, float *result)
jamie@140 373 {
jamie@1 374
jamie@56 375 float threshold, max, y, y2, y3, p, q, *input = NULL;
jamie@43 376 size_t bytes;
jamie@59 377 int n = N, rv = XTRACT_SUCCESS;
jamie@49 378
jamie@56 379 threshold = max = y = y2 = y3 = p = q = 0.f;
jamie@120 380
jamie@140 381 if(argv != NULL)
jamie@140 382 {
jamie@56 383 q = ((float *)argv)[0];
jamie@55 384 threshold = ((float *)argv)[1];
jamie@1 385 }
jamie@49 386 else
jamie@56 387 rv = XTRACT_BAD_ARGV;
jamie@49 388
jamie@140 389 if(threshold < 0 || threshold > 100)
jamie@140 390 {
jamie@55 391 threshold = 0;
jamie@56 392 rv = XTRACT_BAD_ARGV;
jamie@1 393 }
jamie@1 394
jamie@56 395 XTRACT_CHECK_q;
jamie@49 396
jamie@98 397 input = (float *)calloc(N, sizeof(float));
jamie@98 398
jamie@98 399 bytes = N * sizeof(float);
jamie@43 400
jamie@43 401 if(input != NULL)
jamie@120 402 input = memcpy(input, data, bytes);
jamie@43 403 else
jamie@120 404 return XTRACT_MALLOC_FAILED;
jamie@43 405
jamie@45 406 while(n--)
jamie@56 407 max = XTRACT_MAX(max, input[n]);
jamie@120 408
jamie@55 409 threshold *= .01 * max;
jamie@1 410
jamie@1 411 result[0] = 0;
jamie@59 412 result[N] = 0;
jamie@1 413
jamie@140 414 for(n = 1; n < N; n++)
jamie@140 415 {
jamie@140 416 if(input[n] >= threshold)
jamie@140 417 {
jamie@140 418 if(input[n] > input[n - 1] && n + 1 < N && input[n] > input[n + 1])
jamie@140 419 {
jamie@140 420 result[N + n] = q * (n + (p = .5 * ((y = input[n-1]) -
jamie@140 421 (y3 = input[n+1])) / (input[n - 1] - 2 *
jamie@140 422 (y2 = input[n]) + input[n + 1])));
jamie@52 423 result[n] = y2 - .25 * (y - y3) * p;
jamie@1 424 }
jamie@140 425 else
jamie@140 426 {
jamie@1 427 result[n] = 0;
jamie@59 428 result[N + n] = 0;
jamie@1 429 }
jamie@1 430 }
jamie@140 431 else
jamie@140 432 {
jamie@1 433 result[n] = 0;
jamie@59 434 result[N + n] = 0;
jamie@1 435 }
jamie@140 436 }
jamie@120 437
jamie@43 438 free(input);
jamie@56 439 return (rv ? rv : XTRACT_SUCCESS);
jamie@1 440 }
jamie@120 441
jamie@140 442 int xtract_harmonic_spectrum(const float *data, const int N, const void *argv, float *result)
jamie@140 443 {
jamie@120 444
jamie@140 445 int n = (N >> 1), M = n;
jamie@38 446
jamie@43 447 const float *freqs, *amps;
jamie@55 448 float f0, threshold, ratio, nearest, distance;
jamie@38 449
jamie@52 450 amps = data;
jamie@52 451 freqs = data + n;
jamie@38 452 f0 = *((float *)argv);
jamie@55 453 threshold = *((float *)argv+1);
jamie@38 454
jamie@38 455 ratio = nearest = distance = 0.f;
jamie@38 456
jamie@140 457 while(n--)
jamie@140 458 {
jamie@140 459 if(freqs[n])
jamie@140 460 {
jamie@120 461 ratio = freqs[n] / f0;
jamie@120 462 nearest = roundf(ratio);
jamie@120 463 distance = fabs(nearest - ratio);
jamie@120 464 if(distance > threshold)
jamie@120 465 result[n] = result[M + n] = 0.f;
jamie@140 466 else
jamie@140 467 {
jamie@120 468 result[n] = amps[n];
jamie@120 469 result[M + n] = freqs[n];
jamie@120 470 }
jamie@120 471 }
jamie@120 472 else
jamie@120 473 result[n] = result[M + n] = 0.f;
jamie@38 474 }
jamie@56 475 return XTRACT_SUCCESS;
jamie@38 476 }
jamie@120 477
jamie@140 478 int xtract_lpc(const float *data, const int N, const void *argv, float *result)
jamie@140 479 {
jamie@104 480
jamie@104 481 int i, j, k, M, L;
jamie@140 482 float r = 0.f,
jamie@104 483 error = 0.f;
jamie@104 484
jamie@104 485 float *ref = NULL,
jamie@140 486 *lpc = NULL ;
jamie@104 487
jamie@104 488 error = data[0];
jamie@104 489 k = N; /* The length of *data */
jamie@104 490 L = N - 1; /* The number of LPC coefficients */
jamie@104 491 M = L * 2; /* The length of *result */
jamie@104 492 ref = result;
jamie@104 493 lpc = result+L;
jamie@113 494
jamie@140 495 if(error == 0.0)
jamie@140 496 {
jamie@113 497 memset(result, 0, M * sizeof(float));
jamie@104 498 return XTRACT_NO_RESULT;
jamie@104 499 }
jamie@113 500
jamie@104 501 memset(result, 0, M * sizeof(float));
jamie@104 502
jamie@140 503 for (i = 0; i < L; i++)
jamie@140 504 {
jamie@104 505
jamie@104 506 /* Sum up this iteration's reflection coefficient. */
jamie@104 507 r = -data[i + 1];
jamie@140 508 for (j = 0; j < i; j++)
jamie@104 509 r -= lpc[j] * data[i - j];
jamie@104 510 ref[i] = r /= error;
jamie@104 511
jamie@104 512 /* Update LPC coefficients and total error. */
jamie@104 513 lpc[i] = r;
jamie@140 514 for (j = 0; j < i / 2; j++)
jamie@140 515 {
jamie@104 516 float tmp = lpc[j];
jamie@104 517 lpc[j] = r * lpc[i - 1 - j];
jamie@104 518 lpc[i - 1 - j] += r * tmp;
jamie@104 519 }
jamie@104 520 if (i % 2) lpc[j] += lpc[j] * r;
jamie@104 521
jamie@104 522 error *= 1 - r * r;
jamie@104 523 }
jamie@104 524
jamie@104 525 return XTRACT_SUCCESS;
jamie@104 526 }
jamie@104 527
jamie@140 528 int xtract_lpcc(const float *data, const int N, const void *argv, float *result)
jamie@140 529 {
jamie@104 530
jamie@104 531 /* Given N lpc coefficients extract an LPC cepstrum of size argv[0] */
jamie@104 532 /* Based on an an algorithm by rabiner and Juang */
jamie@104 533
jamie@104 534 int n, k;
jamie@104 535 float sum;
jamie@104 536 int order = N - 1; /* Eventually change this to Q = 3/2 p as suggested in Rabiner */
jamie@140 537 int cep_length;
jamie@120 538
jamie@104 539 if(argv == NULL)
jamie@115 540 cep_length = N - 1; /* FIX: if we're going to have default values, they should come from the descriptor */
jamie@104 541 else
jamie@115 542 cep_length = *(int *)argv;
jamie@120 543 //cep_length = (int)((float *)argv)[0];
jamie@104 544
jamie@104 545 memset(result, 0, cep_length * sizeof(float));
jamie@104 546
jamie@140 547 for (n = 1; n <= order && n <= cep_length; n++)
jamie@140 548 {
jamie@104 549 sum = 0.f;
jamie@104 550 for (k = 1; k < n; k++)
jamie@104 551 sum += k * result[k-1] * data[n - k];
jamie@104 552 result[n-1] = data[n] + sum / n;
jamie@104 553 }
jamie@104 554
jamie@104 555 /* be wary of these interpolated values */
jamie@140 556 for(n = order + 1; n <= cep_length; n++)
jamie@140 557 {
jamie@104 558 sum = 0.f;
jamie@104 559 for (k = n - (order - 1); k < n; k++)
jamie@104 560 sum += k * result[k-1] * data[n - k];
jamie@104 561 result[n-1] = sum / n;
jamie@104 562 }
jamie@104 563
jamie@104 564 return XTRACT_SUCCESS;
jamie@104 565
jamie@104 566 }
jamie@104 567 //int xtract_lpcc_s(const float *data, const int N, const void *argv, float *result){
jamie@104 568 // return XTRACT_SUCCESS;
jamie@104 569 //}
jamie@104 570
jamie@140 571 int xtract_subbands(const float *data, const int N, const void *argv, float *result)
jamie@140 572 {
jamie@104 573
jamie@114 574 int n, bw, xtract_func, nbands, scale, start, lower, *argi, rv;
jamie@114 575
jamie@114 576 argi = (int *)argv;
jamie@114 577
jamie@114 578 xtract_func = argi[0];
jamie@114 579 nbands = argi[1];
jamie@114 580 scale = argi[2];
jamie@114 581 start = argi[3];
jamie@114 582
jamie@114 583 if(scale == XTRACT_LINEAR_SUBBANDS)
jamie@114 584 bw = floorf((N - start) / nbands);
jamie@114 585 else
jamie@114 586 bw = start;
jamie@114 587
jamie@114 588 lower = start;
jamie@115 589 rv = XTRACT_SUCCESS;
jamie@114 590
jamie@140 591 for(n = 0; n < nbands; n++)
jamie@140 592 {
jamie@114 593
jamie@114 594 /* Bounds sanity check */
jamie@140 595 if(lower >= N || lower + bw >= N)
jamie@140 596 {
jamie@120 597 // printf("n: %d\n", n);
jamie@115 598 result[n] = 0.f;
jamie@114 599 continue;
jamie@115 600 }
jamie@114 601
jamie@114 602 rv = xtract[xtract_func](data+lower, bw, NULL, &result[n]);
jamie@114 603
jamie@114 604 if(rv != XTRACT_SUCCESS)
jamie@114 605 return rv;
jamie@114 606
jamie@140 607 switch(scale)
jamie@140 608 {
jamie@140 609 case XTRACT_OCTAVE_SUBBANDS:
jamie@140 610 lower += bw;
jamie@140 611 bw = lower;
jamie@140 612 break;
jamie@140 613 case XTRACT_LINEAR_SUBBANDS:
jamie@140 614 lower += bw;
jamie@140 615 break;
jamie@114 616 }
jamie@114 617
jamie@114 618 }
jamie@114 619
jamie@114 620 return rv;
jamie@114 621
jamie@114 622 }
jamie@114 623
jamie@114 624
jamie@114 625